Fix for a bug involving UNION's and SET SQL_SELECT_LIMIT

parent 0a6da89f
...@@ -924,3 +924,14 @@ a ...@@ -924,3 +924,14 @@ a
1 1
2 2
2 2
set sql_select_limit=1;
select 1 union select 2;
1
1
(select 1) union (select 2);
1
1
(select 1) union (select 2) union (select 3) limit 2;
1
1
2
...@@ -498,4 +498,8 @@ select * from t1 UNION ALL select * from t1; ...@@ -498,4 +498,8 @@ select * from t1 UNION ALL select * from t1;
select * from t1 UNION select * from t1 UNION ALL select * from t1; select * from t1 UNION select * from t1 UNION ALL select * from t1;
drop table t1; drop table t1;
select 1 as a union all select 1 union all select 2 union select 1 union all select 2; select 1 as a union all select 1 union all select 2 union select 1 union all select 2;
set sql_select_limit=1;
select 1 union select 2;
(select 1) union (select 2);
(select 1) union (select 2) union (select 3) limit 2;
...@@ -377,12 +377,21 @@ int st_select_lex_unit::exec() ...@@ -377,12 +377,21 @@ int st_select_lex_unit::exec()
if (!thd->is_fatal_error) // Check if EOM if (!thd->is_fatal_error) // Check if EOM
{ {
ulong options_tmp= thd->options; ulong options_tmp= thd->options;
/*
We have to take into the account a case when:
SET SQL_SELECT_LIMIT was set.
In mysql_new_select() function this value was copied to
the fake_select_lex node of the top-level unit.
Here below, we just take this value if global LIMIT was not applied
to the entire UNION.
*/
ha_rows select_limit= ((global_parameters->select_limit != HA_POS_ERROR) ?
global_parameters->select_limit : fake_select_lex->select_limit);
thd->lex->current_select= fake_select_lex; thd->lex->current_select= fake_select_lex;
offset_limit_cnt= global_parameters->offset_limit; offset_limit_cnt= global_parameters->offset_limit;
select_limit_cnt= global_parameters->select_limit + select_limit_cnt= select_limit + global_parameters->offset_limit;
global_parameters->offset_limit;
if (select_limit_cnt < global_parameters->select_limit) if (select_limit_cnt < select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit select_limit_cnt= HA_POS_ERROR; // no limit
if (select_limit_cnt == HA_POS_ERROR) if (select_limit_cnt == HA_POS_ERROR)
options_tmp&= ~OPTION_FOUND_ROWS; options_tmp&= ~OPTION_FOUND_ROWS;
......
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