Commit 7ea16212 authored by unknown's avatar unknown

Fix and testcase for BUG#6699


myisam/mi_rnext_same.c:
  Fix for BUG#6699: 
    MERGE handler now uses mi_rnext_same() with priority queue, so skip record unpacking if buf==NULL
myisammrg/myrg_rnext_same.c:
  Fix for BUG#6699: 
   make myrg_rnext_same sort always sort records and return them in key order.
mysql-test/r/merge.result:
  Test for BUG#6699
mysql-test/t/merge.test:
  Test for BUG#6699
parent 1b898a22
...@@ -88,6 +88,10 @@ int mi_rnext_same(MI_INFO *info, byte *buf) ...@@ -88,6 +88,10 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
if (my_errno == HA_ERR_KEY_NOT_FOUND) if (my_errno == HA_ERR_KEY_NOT_FOUND)
my_errno=HA_ERR_END_OF_FILE; my_errno=HA_ERR_END_OF_FILE;
} }
else if (!buf)
{
DBUG_RETURN(info->lastpos==HA_OFFSET_ERROR ? my_errno : 0);
}
else if (!(*info->read_record)(info,info->lastpos,buf)) else if (!(*info->read_record)(info,info->lastpos,buf))
{ {
info->update|= HA_STATE_AKTIV; /* Record is read */ info->update|= HA_STATE_AKTIV; /* Record is read */
......
...@@ -16,25 +16,36 @@ ...@@ -16,25 +16,36 @@
#include "myrg_def.h" #include "myrg_def.h"
int myrg_rnext_same(MYRG_INFO *info, byte *buf) int myrg_rnext_same(MYRG_INFO *info, byte *buf)
{ {
uint err; int err;
MI_INFO *mi; MI_INFO *mi;
if (!info->current_table) if (!info->current_table)
return (HA_ERR_KEY_NOT_FOUND); return (HA_ERR_KEY_NOT_FOUND);
err=mi_rnext_same(info->current_table->table,buf); /* at first, do rnext for the table found before */
if (err == HA_ERR_END_OF_FILE) if ((err=mi_rnext_same(info->current_table->table,NULL)))
{ {
queue_remove(&(info->by_key),0); if (err == HA_ERR_END_OF_FILE)
if (!info->by_key.elements) {
return HA_ERR_END_OF_FILE; queue_remove(&(info->by_key),0);
if (!info->by_key.elements)
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table; return HA_ERR_END_OF_FILE;
mi->once_flags|= RRND_PRESERVE_LASTINX; }
return mi_rrnd(mi,buf,mi->lastpos); else
return err;
} }
return err; else
{
/* Found here, adding to queue */
queue_top(&(info->by_key))=(byte *)(info->current_table);
queue_replaced(&(info->by_key));
}
/* now, mymerge's read_next is as simple as one queue_top */
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
return _myrg_mi_read_record(mi,buf);
} }
...@@ -651,3 +651,28 @@ ERROR HY000: You can't specify target table 't1' for update in FROM clause ...@@ -651,3 +651,28 @@ ERROR HY000: You can't specify target table 't1' for update in FROM clause
create table t3 engine=merge union=(t1, t2) select * from t2; create table t3 engine=merge union=(t1, t2) select * from t2;
ERROR HY000: You can't specify target table 't2' for update in FROM clause ERROR HY000: You can't specify target table 't2' for update in FROM clause
drop table t1, t2; drop table t1, t2;
create table t1 (a int,b int,c int, index (a,b,c));
create table t2 (a int,b int,c int, index (a,b,c));
create table t3 (a int,b int,c int, index (a,b,c))
engine=merge union=(t1 ,t2);
insert into t1 (a,b,c) values (1,1,0),(1,2,0);
insert into t2 (a,b,c) values (1,1,1),(1,2,1);
explain select a,b,c from t3 force index (a) where a=1 order by a,b,c;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t3 ref a a 5 const 2 Using where; Using index
select a,b,c from t3 force index (a) where a=1 order by a,b,c;
a b c
1 1 0
1 1 1
1 2 0
1 2 1
explain select a,b,c from t3 force index (a) where a=1 order by a desc, b desc, c desc;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t3 ref a a 5 const 2 Using where; Using index
select a,b,c from t3 force index (a) where a=1 order by a desc, b desc, c desc;
a b c
1 2 1
1 2 0
1 1 1
1 1 0
drop table t1, t2, t3;
...@@ -285,3 +285,21 @@ create table t3 engine=merge union=(t1, t2) select * from t1; ...@@ -285,3 +285,21 @@ create table t3 engine=merge union=(t1, t2) select * from t1;
--error 1093 --error 1093
create table t3 engine=merge union=(t1, t2) select * from t2; create table t3 engine=merge union=(t1, t2) select * from t2;
drop table t1, t2; drop table t1, t2;
# BUG#6699 : no sorting on 'ref' retrieval
create table t1 (a int,b int,c int, index (a,b,c));
create table t2 (a int,b int,c int, index (a,b,c));
create table t3 (a int,b int,c int, index (a,b,c))
engine=merge union=(t1 ,t2);
insert into t1 (a,b,c) values (1,1,0),(1,2,0);
insert into t2 (a,b,c) values (1,1,1),(1,2,1);
explain select a,b,c from t3 force index (a) where a=1 order by a,b,c;
select a,b,c from t3 force index (a) where a=1 order by a,b,c;
# this actually wasn't affected:
explain select a,b,c from t3 force index (a) where a=1 order by a desc, b desc, c desc;
select a,b,c from t3 force index (a) where a=1 order by a desc, b desc, c desc;
drop table t1, t2, t3;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment