Loading mysql-test/r/ps.result +12 −0 Original line number Diff line number Diff line Loading @@ -487,3 +487,15 @@ insert into t1 values ('foo'); prepare stmt FROM 'SELECT char_length (a) FROM t1'; ERROR 42000: FUNCTION test.char_length does not exist drop table t1; 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 +10 −0 Original line number Diff line number Diff line Loading @@ -497,3 +497,13 @@ insert into t1 values ('foo'); prepare stmt FROM 'SELECT char_length (a) FROM t1'; drop table t1; # # 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_lex.cc +0 −2 Original line number Diff line number Diff line Loading @@ -1837,8 +1837,6 @@ void st_select_lex_unit::set_limit(SELECT_LEX *values, select_limit_cnt= values->select_limit+values->offset_limit; if (select_limit_cnt < values->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit if (select_limit_cnt == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; } Loading sql/sql_union.cc +12 −21 Original line number Diff line number Diff line Loading @@ -217,8 +217,6 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, thd_arg->lex->current_select= sl; set_limit(sl, sl); if (sl->braces) sl->options&= ~OPTION_FOUND_ROWS; can_skip_order_by= is_union && (!sl->braces || select_limit_cnt == HA_POS_ERROR); Loading Loading @@ -342,10 +340,9 @@ bool 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); /* it should be done only once (because item_list builds only onece per statement) Should be done only once (the only item_list per statement). */ DBUG_ASSERT(fake_select_lex->join == 0); if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options, Loading Loading @@ -453,20 +450,13 @@ bool 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 @@ -498,7 +488,8 @@ bool 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 @@ -487,3 +487,15 @@ insert into t1 values ('foo'); prepare stmt FROM 'SELECT char_length (a) FROM t1'; ERROR 42000: FUNCTION test.char_length does not exist drop table t1; 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 +10 −0 Original line number Diff line number Diff line Loading @@ -497,3 +497,13 @@ insert into t1 values ('foo'); prepare stmt FROM 'SELECT char_length (a) FROM t1'; drop table t1; # # 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_lex.cc +0 −2 Original line number Diff line number Diff line Loading @@ -1837,8 +1837,6 @@ void st_select_lex_unit::set_limit(SELECT_LEX *values, select_limit_cnt= values->select_limit+values->offset_limit; if (select_limit_cnt < values->select_limit) select_limit_cnt= HA_POS_ERROR; // no limit if (select_limit_cnt == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; } Loading
sql/sql_union.cc +12 −21 Original line number Diff line number Diff line Loading @@ -217,8 +217,6 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, thd_arg->lex->current_select= sl; set_limit(sl, sl); if (sl->braces) sl->options&= ~OPTION_FOUND_ROWS; can_skip_order_by= is_union && (!sl->braces || select_limit_cnt == HA_POS_ERROR); Loading Loading @@ -342,10 +340,9 @@ bool 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); /* it should be done only once (because item_list builds only onece per statement) Should be done only once (the only item_list per statement). */ DBUG_ASSERT(fake_select_lex->join == 0); if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options, Loading Loading @@ -453,20 +450,13 @@ bool 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 @@ -498,7 +488,8 @@ bool 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