diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index fbd4624a57c..8a5e5e5b6e3 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -924,3 +924,14 @@ a 1 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 diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 9866b867427..6b76ceea65a 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -498,4 +498,8 @@ select * from t1 UNION ALL select * from t1; select * from t1 UNION select * from t1 UNION ALL select * from t1; drop table t1; 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; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 468bdab9119..df20f04a67e 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -377,12 +377,21 @@ int st_select_lex_unit::exec() if (!thd->is_fatal_error) // Check if EOM { 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; offset_limit_cnt= global_parameters->offset_limit; - select_limit_cnt= global_parameters->select_limit + - global_parameters->offset_limit; + select_limit_cnt= select_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 if (select_limit_cnt == HA_POS_ERROR) options_tmp&= ~OPTION_FOUND_ROWS;