From 737f7292b4cb10c1f820f932e7ff3a6fd63f44ca Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 2 Mar 2005 20:00:48 +0400 Subject: [PATCH] a fix for --ps-protocol (bug #6089: FOUND_ROWS returns wrong values when no table/view is used) sql/sql_union.cc: a fix for --ps-protocol (bug #6089: FOUND_ROWS returns wrong values when no table/view is used) Don't touch options as itit's not needed. --- mysql-test/r/ps.result | 12 ++++++++++++ mysql-test/t/ps.test | 11 +++++++++++ sql/sql_union.cc | 30 +++++++++++------------------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 4e1e75f1b33..89c369a51e8 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -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; diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 92bf4ece4e3..b204e59267e 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -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; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 882316d57d7..5fd59500ace 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -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); @@ -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))) { @@ -447,21 +445,14 @@ int st_select_lex_unit::exec() if (select_limit_cnt < sl->select_limit) 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 - */ - sl->options|= found_rows_for_union; - } - sl->join->select_options=sl->options; + /* + 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->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) @@ -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