mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
assigned correct lex->current_select for derived tables (BUG#2349)
moved LIMIT initialialization, because it is need only for single select derived table
This commit is contained in:
@ -245,3 +245,31 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
2 DERIVED t1 ALL NULL NULL NULL NULL 2
|
2 DERIVED t1 ALL NULL NULL NULL NULL 2
|
||||||
3 UNION t1 ALL NULL NULL NULL NULL 2
|
3 UNION t1 ALL NULL NULL NULL NULL 2
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
OBJECTID int(11) NOT NULL default '0',
|
||||||
|
SORTORDER int(11) NOT NULL auto_increment,
|
||||||
|
KEY t1_SortIndex (SORTORDER),
|
||||||
|
KEY t1_IdIndex (OBJECTID)
|
||||||
|
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
Warnings:
|
||||||
|
Warning 1286 'TYPE=database_engine' is deprecated. Use 'ENGINE=database_engine' instead.
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
ID int(11) default NULL,
|
||||||
|
PARID int(11) default NULL,
|
||||||
|
UNIQUE KEY t2_ID_IDX (ID),
|
||||||
|
KEY t2_PARID_IDX (PARID)
|
||||||
|
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
Warnings:
|
||||||
|
Warning 1286 'TYPE=database_engine' is deprecated. Use 'ENGINE=database_engine' instead.
|
||||||
|
INSERT INTO t2 VALUES (1000,0),(1001,0),(1002,0),(1003,0),(1008,1),(1009,1),(1010,1),(1011,1),(1016,2);
|
||||||
|
CREATE TABLE t3 (
|
||||||
|
ID int(11) default NULL,
|
||||||
|
DATA decimal(10,2) default NULL,
|
||||||
|
UNIQUE KEY t3_ID_IDX (ID)
|
||||||
|
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
Warnings:
|
||||||
|
Warning 1286 'TYPE=database_engine' is deprecated. Use 'ENGINE=database_engine' instead.
|
||||||
|
INSERT INTO t3 VALUES (1000,0.00),(1001,0.25),(1002,0.50),(1003,0.75),(1008,1.00),(1009,1.25),(1010,1.50),(1011,1.75);
|
||||||
|
select 497, TMP.ID, NULL from (select 497 as ID, MAX(t3.DATA) as DATA from t1 join t2 on (t1.ObjectID = t2.ID) join t3 on (t1.ObjectID = t3.ID) group by t2.ParID order by DATA DESC) as TMP;
|
||||||
|
497 ID NULL
|
||||||
|
drop table t1, t2, t3;
|
||||||
|
@ -138,3 +138,29 @@ insert into t1 values (1),(2);
|
|||||||
select * from ( select * from t1 union select * from t1) a,(select * from t1 union select * from t1) b;
|
select * from ( select * from t1 union select * from t1) a,(select * from t1 union select * from t1) b;
|
||||||
explain select * from ( select * from t1 union select * from t1) a,(select * from t1 union select * from t1) b;
|
explain select * from ( select * from t1 union select * from t1) a,(select * from t1 union select * from t1) b;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# correct lex->current_select
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
OBJECTID int(11) NOT NULL default '0',
|
||||||
|
SORTORDER int(11) NOT NULL auto_increment,
|
||||||
|
KEY t1_SortIndex (SORTORDER),
|
||||||
|
KEY t1_IdIndex (OBJECTID)
|
||||||
|
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
ID int(11) default NULL,
|
||||||
|
PARID int(11) default NULL,
|
||||||
|
UNIQUE KEY t2_ID_IDX (ID),
|
||||||
|
KEY t2_PARID_IDX (PARID)
|
||||||
|
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
INSERT INTO t2 VALUES (1000,0),(1001,0),(1002,0),(1003,0),(1008,1),(1009,1),(1010,1),(1011,1),(1016,2);
|
||||||
|
CREATE TABLE t3 (
|
||||||
|
ID int(11) default NULL,
|
||||||
|
DATA decimal(10,2) default NULL,
|
||||||
|
UNIQUE KEY t3_ID_IDX (ID)
|
||||||
|
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
INSERT INTO t3 VALUES (1000,0.00),(1001,0.25),(1002,0.50),(1003,0.75),(1008,1.00),(1009,1.25),(1010,1.50),(1011,1.75);
|
||||||
|
select 497, TMP.ID, NULL from (select 497 as ID, MAX(t3.DATA) as DATA from t1 join t2 on (t1.ObjectID = t2.ID) join t3 on (t1.ObjectID = t3.ID) group by t2.ParID order by DATA DESC) as TMP;
|
||||||
|
drop table t1, t2, t3;
|
||||||
|
@ -146,17 +146,19 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
|
|||||||
}
|
}
|
||||||
derived_result->set_table(table);
|
derived_result->set_table(table);
|
||||||
|
|
||||||
unit->offset_limit_cnt= first_select->offset_limit;
|
|
||||||
unit->select_limit_cnt= first_select->select_limit+
|
|
||||||
first_select->offset_limit;
|
|
||||||
if (unit->select_limit_cnt < first_select->select_limit)
|
|
||||||
unit->select_limit_cnt= HA_POS_ERROR;
|
|
||||||
if (unit->select_limit_cnt == HA_POS_ERROR)
|
|
||||||
first_select->options&= ~OPTION_FOUND_ROWS;
|
|
||||||
|
|
||||||
if (is_union)
|
if (is_union)
|
||||||
res= mysql_union(thd, lex, derived_result, unit);
|
res= mysql_union(thd, lex, derived_result, unit);
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
unit->offset_limit_cnt= first_select->offset_limit;
|
||||||
|
unit->select_limit_cnt= first_select->select_limit+
|
||||||
|
first_select->offset_limit;
|
||||||
|
if (unit->select_limit_cnt < first_select->select_limit)
|
||||||
|
unit->select_limit_cnt= HA_POS_ERROR;
|
||||||
|
if (unit->select_limit_cnt == HA_POS_ERROR)
|
||||||
|
first_select->options&= ~OPTION_FOUND_ROWS;
|
||||||
|
|
||||||
|
lex->current_select= first_select;
|
||||||
res= mysql_select(thd, &first_select->ref_pointer_array,
|
res= mysql_select(thd, &first_select->ref_pointer_array,
|
||||||
(TABLE_LIST*) first_select->table_list.first,
|
(TABLE_LIST*) first_select->table_list.first,
|
||||||
first_select->with_wild,
|
first_select->with_wild,
|
||||||
@ -169,6 +171,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
|
|||||||
(first_select->options | thd->options |
|
(first_select->options | thd->options |
|
||||||
SELECT_NO_UNLOCK),
|
SELECT_NO_UNLOCK),
|
||||||
derived_result, unit, first_select);
|
derived_result, unit, first_select);
|
||||||
|
}
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user