Loading mysql-test/r/ps.result +12 −0 Original line number Diff line number Diff line Loading @@ -482,3 +482,15 @@ execute stmt; pnum deallocate prepare stmt; drop table t1, t2; prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0"; execute stmt; foo SELECT FOUND_ROWS(); FOUND_ROWS() 2 execute stmt; foo SELECT FOUND_ROWS(); FOUND_ROWS() 2 deallocate prepare stmt; mysql-test/t/ps.test +11 −0 Original line number Diff line number Diff line Loading @@ -485,3 +485,14 @@ execute stmt; deallocate prepare stmt; drop table t1, t2; # # Bug #6089: FOUND_ROWS returns wrong values when no table/view is used # prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0"; execute stmt; SELECT FOUND_ROWS(); execute stmt; SELECT FOUND_ROWS(); deallocate prepare stmt; sql/sql_union.cc +11 −19 Original line number Diff line number Diff line Loading @@ -215,8 +215,6 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, select_limit_cnt= sl->select_limit+sl->offset_limit; if (select_limit_cnt < sl->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit if (select_limit_cnt == HA_POS_ERROR || sl->braces) sl->options&= ~OPTION_FOUND_ROWS; can_skip_order_by= is_union && (!sl->braces || select_limit_cnt == HA_POS_ERROR); Loading Loading @@ -342,7 +340,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, if (arena->is_stmt_prepare()) { /* prepare fake select to initialize it correctly */ ulong options_tmp= init_prepare_fake_select_lex(thd); (void) init_prepare_fake_select_lex(thd); if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options, result))) { Loading Loading @@ -448,20 +446,13 @@ int st_select_lex_unit::exec() select_limit_cnt= HA_POS_ERROR; // no limit /* When using braces, SQL_CALC_FOUND_ROWS affects the whole query. We don't calculate found_rows() per union part */ if (select_limit_cnt == HA_POS_ERROR || sl->braces) sl->options&= ~OPTION_FOUND_ROWS; else { /* We are doing an union without braces. In this case SQL_CALC_FOUND_ROWS should be done on all sub parts When using braces, SQL_CALC_FOUND_ROWS affects the whole query: we don't calculate found_rows() per union part. Otherwise, SQL_CALC_FOUND_ROWS should be done on all sub parts. */ sl->options|= found_rows_for_union; } sl->join->select_options=sl->options; sl->join->select_options= (select_limit_cnt == HA_POS_ERROR || sl->braces) ? sl->options & ~OPTION_FOUND_ROWS : sl->options | found_rows_for_union; res= sl->join->optimize(); } if (!res) Loading Loading @@ -493,7 +484,8 @@ int st_select_lex_unit::exec() } /* Needed for the following test and for records_at_start in next loop */ table->file->info(HA_STATUS_VARIABLE); if (found_rows_for_union & sl->options) if (found_rows_for_union && !sl->braces && select_limit_cnt != HA_POS_ERROR) { /* This is a union without braces. Remember the number of rows that Loading Loading
mysql-test/r/ps.result +12 −0 Original line number Diff line number Diff line Loading @@ -482,3 +482,15 @@ execute stmt; pnum deallocate prepare stmt; drop table t1, t2; prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0"; execute stmt; foo SELECT FOUND_ROWS(); FOUND_ROWS() 2 execute stmt; foo SELECT FOUND_ROWS(); FOUND_ROWS() 2 deallocate prepare stmt;
mysql-test/t/ps.test +11 −0 Original line number Diff line number Diff line Loading @@ -485,3 +485,14 @@ execute stmt; deallocate prepare stmt; drop table t1, t2; # # Bug #6089: FOUND_ROWS returns wrong values when no table/view is used # prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0"; execute stmt; SELECT FOUND_ROWS(); execute stmt; SELECT FOUND_ROWS(); deallocate prepare stmt;
sql/sql_union.cc +11 −19 Original line number Diff line number Diff line Loading @@ -215,8 +215,6 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, select_limit_cnt= sl->select_limit+sl->offset_limit; if (select_limit_cnt < sl->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit if (select_limit_cnt == HA_POS_ERROR || sl->braces) sl->options&= ~OPTION_FOUND_ROWS; can_skip_order_by= is_union && (!sl->braces || select_limit_cnt == HA_POS_ERROR); Loading Loading @@ -342,7 +340,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, if (arena->is_stmt_prepare()) { /* prepare fake select to initialize it correctly */ ulong options_tmp= init_prepare_fake_select_lex(thd); (void) init_prepare_fake_select_lex(thd); if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options, result))) { Loading Loading @@ -448,20 +446,13 @@ int st_select_lex_unit::exec() select_limit_cnt= HA_POS_ERROR; // no limit /* When using braces, SQL_CALC_FOUND_ROWS affects the whole query. We don't calculate found_rows() per union part */ if (select_limit_cnt == HA_POS_ERROR || sl->braces) sl->options&= ~OPTION_FOUND_ROWS; else { /* We are doing an union without braces. In this case SQL_CALC_FOUND_ROWS should be done on all sub parts When using braces, SQL_CALC_FOUND_ROWS affects the whole query: we don't calculate found_rows() per union part. Otherwise, SQL_CALC_FOUND_ROWS should be done on all sub parts. */ sl->options|= found_rows_for_union; } sl->join->select_options=sl->options; sl->join->select_options= (select_limit_cnt == HA_POS_ERROR || sl->braces) ? sl->options & ~OPTION_FOUND_ROWS : sl->options | found_rows_for_union; res= sl->join->optimize(); } if (!res) Loading Loading @@ -493,7 +484,8 @@ int st_select_lex_unit::exec() } /* Needed for the following test and for records_at_start in next loop */ table->file->info(HA_STATUS_VARIABLE); if (found_rows_for_union & sl->options) if (found_rows_for_union && !sl->braces && select_limit_cnt != HA_POS_ERROR) { /* This is a union without braces. Remember the number of rows that Loading