Commit 7ea16212 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -88,6 +88,10 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
    if (my_errno == HA_ERR_KEY_NOT_FOUND)
      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))
  {
    info->update|= HA_STATE_AKTIV;		/* Record is read */
+22 −11
Original line number Diff line number Diff line
@@ -16,25 +16,36 @@

#include "myrg_def.h"


int myrg_rnext_same(MYRG_INFO *info, byte *buf)
{
  uint err;
  int err;
  MI_INFO *mi;

  if (!info->current_table)
    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=mi_rnext_same(info->current_table->table,NULL)))
  {
    if (err == HA_ERR_END_OF_FILE)
    {
      queue_remove(&(info->by_key),0);
      if (!info->by_key.elements)
        return HA_ERR_END_OF_FILE;

    mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
    mi->once_flags|= RRND_PRESERVE_LASTINX;
    return mi_rrnd(mi,buf,mi->lastpos);
    }
    else
      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);
}
+25 −0
Original line number Diff line number Diff line
@@ -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;
ERROR HY000: You can't specify target table 't2' for update in FROM clause
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;
+18 −0
Original line number Diff line number Diff line
@@ -285,3 +285,21 @@ create table t3 engine=merge union=(t1, t2) select * from t1;
--error 1093
create table t3 engine=merge union=(t1, t2) select * from 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;