#At file:///home/nirbhay/Project/mysql/repo/wl/mysql-5.1-bugteam/ based on revid:davi.arnaut@stripped
3519 Nirbhay Choubey 2010-09-27
Bug#44771 : Unique Hash index in memory engine will give wrong query result for
NULL value.
In a memory table when there are more than one NULL values for a unique key
column using HASH index, a search for NULL on that column returns just one
row.
In memory engine, while reading a hash key which is NULL, it doesn't get copied
to info->lastkey, which inturn is used to search next records.
Fixed by adding the condition to check for NULL key, which lets copying of key
to info->lastkey.
@ mysql-test/r/heap_hash.result
Bug#44771 : Unique Hash index in memory engine will give wrong query result for
NULL value.
@ mysql-test/t/heap_hash.test
Bug#44771 : Unique Hash index in memory engine will give wrong query result for
NULL value.
@ storage/heap/hp_rkey.c
Bug#44771 : Unique Hash index in memory engine will give wrong query result for
NULL value.
Modified the condition to check for NULL key which is checked before copying key
to info->lastkey in heap_rkey function. info->lastkey is further used by
heap_rnext to search for the records with the same key.
modified:
mysql-test/r/heap_hash.result
mysql-test/t/heap_hash.test
storage/heap/hp_rkey.c
=== modified file 'mysql-test/r/heap_hash.result'
--- a/mysql-test/r/heap_hash.result 2007-05-31 12:04:58 +0000
+++ b/mysql-test/r/heap_hash.result 2010-09-27 14:07:48 +0000
@@ -382,3 +382,24 @@ INSERT INTO t1 VALUES('A ', 'A ');
ERROR 23000: Duplicate entry 'A -A ' for key 'key1'
DROP TABLE t1;
End of 5.0 tests
+#
+# Bug #44771: Unique Hash index in memory engine will give wrong
+# query result for NULL value.
+#
+CREATE TABLE t1
+(
+pk INT PRIMARY KEY,
+val INT,
+UNIQUE KEY USING HASH(val)
+) ENGINE=MEMORY;
+INSERT INTO t1 VALUES (1, NULL);
+INSERT INTO t1 VALUES (2, NULL);
+INSERT INTO t1 VALUES (3, NULL);
+INSERT INTO t1 VALUES (4, NULL);
+SELECT * FROM t1 WHERE val IS NULL;
+pk val
+4 NULL
+3 NULL
+2 NULL
+1 NULL
+DROP TABLE t1;
=== modified file 'mysql-test/t/heap_hash.test'
--- a/mysql-test/t/heap_hash.test 2007-06-06 17:57:07 +0000
+++ b/mysql-test/t/heap_hash.test 2010-09-27 14:07:48 +0000
@@ -284,3 +284,23 @@ INSERT INTO t1 VALUES('A ', 'A ');
DROP TABLE t1;
--echo End of 5.0 tests
+
+--echo #
+--echo # Bug #44771: Unique Hash index in memory engine will give wrong
+--echo # query result for NULL value.
+--echo #
+
+CREATE TABLE t1
+(
+ pk INT PRIMARY KEY,
+ val INT,
+ UNIQUE KEY USING HASH(val)
+) ENGINE=MEMORY;
+
+INSERT INTO t1 VALUES (1, NULL);
+INSERT INTO t1 VALUES (2, NULL);
+INSERT INTO t1 VALUES (3, NULL);
+INSERT INTO t1 VALUES (4, NULL);
+
+SELECT * FROM t1 WHERE val IS NULL;
+DROP TABLE t1;
=== modified file 'storage/heap/hp_rkey.c'
--- a/storage/heap/hp_rkey.c 2007-05-10 09:59:39 +0000
+++ b/storage/heap/hp_rkey.c 2010-09-27 14:07:48 +0000
@@ -63,7 +63,8 @@ int heap_rkey(HP_INFO *info, uchar *reco
info->update= 0;
DBUG_RETURN(my_errno);
}
- if (!(keyinfo->flag & HA_NOSAME) || (keyinfo->flag & HA_END_SPACE_KEY))
+ if (!(keyinfo->flag & HA_NOSAME) || (keyinfo->flag & HA_END_SPACE_KEY) ||
+ (keyinfo->flag & HA_NULL_PART_KEY))
memcpy(info->lastkey, key, (size_t) keyinfo->length);
}
memcpy(record, pos, (size_t) share->reclength);
Attachment: [text/bzr-bundle]