Commit 2acc10f5 authored by unknown's avatar unknown

Fixed optimizer bug in ORDER BY where some ORDER BY parts where ignored.

Extended default arguments to be up to 4095 characters


Docs/manual.texi:
  Update lof LOCK TABLES
mysql-test/r/order_by.result:
  Test for optimizer bug in ORDER BY
mysql-test/t/order_by.test:
  Test for optimizer bug in ORDER BY
mysys/default.c:
  Extended default arguments to be up to 4095 characters
sql/sql_select.cc:
  Fixed optimizer bug in ORDER BY
parent b90efafb
This diff is collapsed.
...@@ -111,3 +111,34 @@ DateOfAction TransactionID ...@@ -111,3 +111,34 @@ DateOfAction TransactionID
member_id nickname voornaam member_id nickname voornaam
1 1
2 2
gid sid uid
104620 5 15
103867 5 27
103962 5 27
104619 5 75
104505 5 117
103853 5 250
gid sid uid
104620 5 15
103867 5 27
103962 5 27
104619 5 75
104505 5 117
103853 5 250
table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index
t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1
t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index
table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index
t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used
table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1
t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index
table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used
table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort
t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 where used
...@@ -168,8 +168,8 @@ drop table t1,t2,t3; ...@@ -168,8 +168,8 @@ drop table t1,t2,t3;
#bug reported by Wouter de Jong #bug reported by Wouter de Jong
drop table if exists members; drop table if exists t1;
CREATE TABLE members ( CREATE TABLE t1 (
member_id int(11) NOT NULL auto_increment, member_id int(11) NOT NULL auto_increment,
inschrijf_datum varchar(20) NOT NULL default '', inschrijf_datum varchar(20) NOT NULL default '',
lastchange_datum varchar(20) NOT NULL default '', lastchange_datum varchar(20) NOT NULL default '',
...@@ -200,8 +200,50 @@ CREATE TABLE members ( ...@@ -200,8 +200,50 @@ CREATE TABLE members (
PRIMARY KEY (member_id) PRIMARY KEY (member_id)
) TYPE=MyISAM PACK_KEYS=1; ) TYPE=MyISAM PACK_KEYS=1;
insert into members (member_id) values (1),(2),(3); insert into t1 (member_id) values (1),(2),(3);
select member_id, nickname, voornaam FROM members select member_id, nickname, voornaam FROM t1
ORDER by lastchange_datum DESC LIMIT 2; ORDER by lastchange_datum DESC LIMIT 2;
drop table members; drop table t1;
#
# Test optimizing bug with EQ_REF tables, where some ORDER BY parts where
# wrongly removed.
CREATE TABLE t1 (
gid int(10) unsigned NOT NULL auto_increment,
cid smallint(5) unsigned NOT NULL default '0',
PRIMARY KEY (gid),
KEY component_id (cid)
) TYPE=MyISAM;
INSERT INTO t1 VALUES (103853,108),(103867,108),(103962,108),(104505,108),(104619,108),(104620,108);
ALTER TABLE t1 add skr int(10) not null;
CREATE TABLE t2 (
gid int(10) unsigned NOT NULL default '0',
uid smallint(5) unsigned NOT NULL default '1',
sid tinyint(3) unsigned NOT NULL default '1',
PRIMARY KEY (gid),
KEY uid (uid),
KEY status_id (sid)
) TYPE=MyISAM;
INSERT INTO t2 VALUES (103853,250,5),(103867,27,5),(103962,27,5),(104505,117,5),(104619,75,5),(104620,15,5);
CREATE TABLE t3 (
uid smallint(6) NOT NULL auto_increment,
PRIMARY KEY (uid)
) TYPE=MyISAM;
INSERT INTO t3 VALUES (1),(15),(27),(75),(117),(250);
ALTER TABLE t3 add skr int(10) not null;
select t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid;
select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid;
# The following ORDER BY can be optimimized
EXPLAIN select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t1.gid, t3.uid;
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr;
# The following ORDER BY can't be optimimized
EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid;
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid;
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr;
drop table t1,t2,t3;
...@@ -222,7 +222,7 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, ...@@ -222,7 +222,7 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
const char *dir, const char *config_file, const char *dir, const char *config_file,
const char *ext, TYPELIB *group) const char *ext, TYPELIB *group)
{ {
char name[FN_REFLEN+10],buff[FN_REFLEN+1],*ptr,*end,*value,*tmp; char name[FN_REFLEN+10],buff[4096],*ptr,*end,*value,*tmp;
FILE *fp; FILE *fp;
uint line=0; uint line=0;
my_bool read_values=0,found_group=0; my_bool read_values=0,found_group=0;
......
...@@ -2649,12 +2649,12 @@ static void update_depend_map(JOIN *join) ...@@ -2649,12 +2649,12 @@ static void update_depend_map(JOIN *join)
for (i=0 ; i < ref->key_parts ; i++,item++) for (i=0 ; i < ref->key_parts ; i++,item++)
depend_map|=(*item)->used_tables(); depend_map|=(*item)->used_tables();
ref->depend_map=depend_map; ref->depend_map=depend_map;
for (JOIN_TAB *join_tab2=join->join_tab; for (JOIN_TAB **tab=join->map2table;
depend_map ; depend_map ;
join_tab2++,depend_map>>=1 ) tab++,depend_map>>=1 )
{ {
if (depend_map & 1) if (depend_map & 1)
ref->depend_map|=join_tab2->ref.depend_map; ref->depend_map|=(*tab)->ref.depend_map;
} }
} }
} }
...@@ -2671,12 +2671,12 @@ static void update_depend_map(JOIN *join, ORDER *order) ...@@ -2671,12 +2671,12 @@ static void update_depend_map(JOIN *join, ORDER *order)
order->depend_map=depend_map=order->item[0]->used_tables(); order->depend_map=depend_map=order->item[0]->used_tables();
if (!(order->depend_map & RAND_TABLE_BIT)) // Not item_sum() or RAND() if (!(order->depend_map & RAND_TABLE_BIT)) // Not item_sum() or RAND()
{ {
for (JOIN_TAB *join_tab=join->join_tab; for (JOIN_TAB **tab=join->map2table;
depend_map ; depend_map ;
join_tab++, depend_map>>=1) tab++, depend_map>>=1)
{ {
if (depend_map & 1) if (depend_map & 1)
order->depend_map|=join_tab->ref.depend_map; order->depend_map|=(*tab)->ref.depend_map;
} }
} }
} }
......
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