mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fix for a bug involving UNION's and SET SQL_SELECT_LIMIT
mysql-test/r/union.result: Results for a test case for bug involving UNION's and SET SQL_SELECT_LIMIT mysql-test/t/union.test: Test case for bug involving UNION's and SET SQL_SELECT_LIMIT sql/sql_union.cc: Patch for a bug involving UNION's and SET SQL_SELECT_LIMIT
This commit is contained in:
@ -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;
|
|||||||
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()
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user