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

Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/dbdata/psergey/mysql-4.1-order-bug

parents b4f4c5bd 7ea16212
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;