mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/dbdata/psergey/mysql-4.1-order-bug
This commit is contained in:
commit
1e102d1aaf
4 changed files with 69 additions and 11 deletions
|
@ -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 @@
|
||||||
|
|
||||||
#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
|
||||||
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;
|
||||||
--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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue