summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <svoj@june.mysql.com>2007-04-18 16:35:22 +0500
committerunknown <svoj@june.mysql.com>2007-04-18 16:35:22 +0500
commit78035fb5d5cd237fa545493b644e70118d73bfff (patch)
tree85b7e68bc1525abfdcc7fa3744e12b6f140d2e5c
parent1ff64d6e1111247536ecc004505ca376df8a58b6 (diff)
parentde15763cfbf230c7fa1333b84a707abc25cde2d6 (diff)
downloadmariadb-git-78035fb5d5cd237fa545493b644e70118d73bfff.tar.gz
Merge mysql.com:/home/svoj/devel/mysql/BUG24342/mysql-5.0-engines
into mysql.com:/home/svoj/devel/mysql/BUG24342/mysql-5.1-engines mysql-test/r/merge.result: Auto merged mysql-test/t/merge.test: Auto merged storage/myisam/mi_rkey.c: Auto merged storage/myisam/myisamdef.h: Auto merged storage/myisammrg/myrg_rkey.c: SCCS merged
-rw-r--r--mysql-test/r/merge.result11
-rw-r--r--mysql-test/t/merge.test13
-rw-r--r--storage/myisam/mi_rkey.c3
-rw-r--r--storage/myisam/myisamdef.h1
-rw-r--r--storage/myisammrg/myrg_rkey.c4
5 files changed, 31 insertions, 1 deletions
diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result
index 6cbdaf6f4f8..17a3bc0877e 100644
--- a/mysql-test/r/merge.result
+++ b/mysql-test/r/merge.result
@@ -819,6 +819,17 @@ ALTER TABLE m1 ENGINE=MERGE UNION=(t1);
SELECT * FROM m1;
c1 c2 c3 c4 c5 c6 c7 c8 c9
DROP TABLE t1, m1;
+CREATE TABLE t1 (a VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_german2_ci,
+b INT, INDEX(a,b));
+CREATE TABLE t2 LIKE t1;
+CREATE TABLE t3 LIKE t1;
+ALTER TABLE t3 ENGINE=MERGE UNION=(t1,t2);
+INSERT INTO t1 VALUES ('ss',1);
+INSERT INTO t2 VALUES ('ss',2),(0xDF,2);
+SELECT COUNT(*) FROM t3 WHERE a=0xDF AND b=2;
+COUNT(*)
+2
+DROP TABLE t1,t2,t3;
create table t1 (b bit(1));
create table t2 (b bit(1));
create table tm (b bit(1)) engine = merge union = (t1,t2);
diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test
index e150b6b3a9a..69e0b19ebf0 100644
--- a/mysql-test/t/merge.test
+++ b/mysql-test/t/merge.test
@@ -451,6 +451,19 @@ ALTER TABLE m1 ENGINE=MERGE UNION=(t1);
SELECT * FROM m1;
DROP TABLE t1, m1;
+#
+# BUG#24342 - Incorrect results with query over MERGE table
+#
+CREATE TABLE t1 (a VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_german2_ci,
+ b INT, INDEX(a,b));
+CREATE TABLE t2 LIKE t1;
+CREATE TABLE t3 LIKE t1;
+ALTER TABLE t3 ENGINE=MERGE UNION=(t1,t2);
+INSERT INTO t1 VALUES ('ss',1);
+INSERT INTO t2 VALUES ('ss',2),(0xDF,2);
+SELECT COUNT(*) FROM t3 WHERE a=0xDF AND b=2;
+DROP TABLE t1,t2,t3;
+
# End of 4.1 tests
#
diff --git a/storage/myisam/mi_rkey.c b/storage/myisam/mi_rkey.c
index 373ab303bf0..a4be66bd4f2 100644
--- a/storage/myisam/mi_rkey.c
+++ b/storage/myisam/mi_rkey.c
@@ -49,7 +49,7 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key,
key_buff=info->lastkey+info->s->base.max_key_length;
pack_key_length= keypart_map;
bmove(key_buff, key, pack_key_length);
- last_used_keyseg= 0;
+ last_used_keyseg= info->s->keyinfo[inx].seg + info->last_used_keyseg;
}
else
{
@@ -60,6 +60,7 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key,
keypart_map, &last_used_keyseg);
/* Save packed_key_length for use by the MERGE engine. */
info->pack_key_length= pack_key_length;
+ info->last_used_keyseg= last_used_keyseg - info->s->keyinfo[inx].seg;
DBUG_EXECUTE("key",_mi_print_key(DBUG_FILE, keyinfo->seg,
key_buff, pack_key_length););
}
diff --git a/storage/myisam/myisamdef.h b/storage/myisam/myisamdef.h
index 7325340b970..a491e6d210c 100644
--- a/storage/myisam/myisamdef.h
+++ b/storage/myisam/myisamdef.h
@@ -276,6 +276,7 @@ struct st_myisam_info {
enum ha_rkey_function last_key_func; /* CONTAIN, OVERLAP, etc */
uint save_lastkey_length;
uint pack_key_length; /* For MYISAMMRG */
+ uint16 last_used_keyseg; /* For MyISAMMRG */
int errkey; /* Got last error on this key */
int lock_type; /* How database was locked */
int tmp_lock_type; /* When locked by readinfo */
diff --git a/storage/myisammrg/myrg_rkey.c b/storage/myisammrg/myrg_rkey.c
index 0eefe7eb173..2d744ae31ec 100644
--- a/storage/myisammrg/myrg_rkey.c
+++ b/storage/myisammrg/myrg_rkey.c
@@ -40,12 +40,14 @@ int myrg_rkey(MYRG_INFO *info,byte *buf,int inx, const byte *key,
{
byte *key_buff;
uint pack_key_length;
+ uint16 last_used_keyseg;
MYRG_TABLE *table;
MI_INFO *mi;
int err;
DBUG_ENTER("myrg_rkey");
LINT_INIT(key_buff);
LINT_INIT(pack_key_length);
+ LINT_INIT(last_used_keyseg);
if (_myrg_init_queue(info,inx,search_flag))
DBUG_RETURN(my_errno);
@@ -60,10 +62,12 @@ int myrg_rkey(MYRG_INFO *info,byte *buf,int inx, const byte *key,
/* Get the saved packed key and packed key length. */
key_buff=(byte*) mi->lastkey+mi->s->base.max_key_length;
pack_key_length=mi->pack_key_length;
+ last_used_keyseg= mi->last_used_keyseg;
}
else
{
mi->once_flags|= USE_PACKED_KEYS;
+ mi->last_used_keyseg= last_used_keyseg;
err=mi_rkey(mi, 0, inx, key_buff, pack_key_length, search_flag);
}
info->last_used_table=table+1;