diff options
-rw-r--r-- | mysql-test/r/select_found.result | 129 | ||||
-rw-r--r-- | mysql-test/t/select_found.test | 58 | ||||
-rw-r--r-- | sql/sql_select.cc | 4 | ||||
-rw-r--r-- | sql/sql_union.cc | 19 |
4 files changed, 201 insertions, 9 deletions
diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result index 7b38515cf70..7db4ad0a474 100644 --- a/mysql-test/r/select_found.result +++ b/mysql-test/r/select_found.result @@ -363,3 +363,132 @@ select found_rows(); found_rows() 5 drop table t1; +CREATE TABLE t1(id1 INT); +CREATE TABLE t2(id2 INT); +INSERT INTO t1 VALUES(1),(2); +INSERT INTO t2 VALUES(2),(3); +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL SELECT "bar"; +foo +foo +bar +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL SELECT "bar" LIMIT 0; +foo +SELECT FOUND_ROWS(); +FOUND_ROWS() +2 +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL SELECT id2 FROM t2; +id1 +1 +2 +2 +3 +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL SELECT id2 FROM t2 LIMIT 0; +id1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +4 +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL (SELECT "bar"); +foo +foo +bar +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL (SELECT "bar") LIMIT 0; +foo +SELECT FOUND_ROWS(); +FOUND_ROWS() +2 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL (SELECT id2 FROM t2); +id1 +1 +2 +2 +3 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL (SELECT id2 FROM t2) LIMIT 0; +id1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +4 +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar"); +foo +foo +bar +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar") LIMIT 0; +foo +SELECT FOUND_ROWS(); +FOUND_ROWS() +2 +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2); +id1 +1 +2 +2 +3 +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2) LIMIT 0; +id1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +4 +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL SELECT "bar"; +foo +foo +bar +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL SELECT "bar" LIMIT 0; +foo +SELECT FOUND_ROWS(); +FOUND_ROWS() +2 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL SELECT id2 FROM t2 LIMIT 0; +id1 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL SELECT id2 FROM t2 LIMIT 0; +id1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +4 +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar" LIMIT 0); +foo +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar" LIMIT 0) LIMIT 0; +foo +SELECT FOUND_ROWS(); +FOUND_ROWS() +0 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2 LIMIT 0); +id1 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2 LIMIT 0) LIMIT 0; +id1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +0 +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar"); +foo +bar +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar") LIMIT 0; +foo +SELECT FOUND_ROWS(); +FOUND_ROWS() +1 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2); +id1 +2 +3 +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2) LIMIT 0; +id1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +2 +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar" LIMIT 0); +foo +foo +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar" LIMIT 0) LIMIT 0; +foo +SELECT FOUND_ROWS(); +FOUND_ROWS() +1 +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2 LIMIT 0); +id1 +1 +2 +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2 LIMIT 0) LIMIT 0; +id1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +2 +DROP TABLE t1,t2; diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test index 33613697722..49395fbaebf 100644 --- a/mysql-test/t/select_found.test +++ b/mysql-test/t/select_found.test @@ -287,3 +287,61 @@ select found_rows(); select sql_calc_found_rows * from t1 order by c1 limit 2,1; select found_rows(); drop table t1; + +# +#MDEV-18202 SQL_CALC_FOUND_ROWS do not work with UNION ALL +# +# +# NO LIMIT IN BRACES +# +CREATE TABLE t1(id1 INT); +CREATE TABLE t2(id2 INT); +INSERT INTO t1 VALUES(1),(2); +INSERT INTO t2 VALUES(2),(3); + +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL SELECT "bar"; +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL SELECT "bar" LIMIT 0; +SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL SELECT id2 FROM t2; +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL SELECT id2 FROM t2 LIMIT 0; +SELECT FOUND_ROWS(); +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL (SELECT "bar"); +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL (SELECT "bar") LIMIT 0; +SELECT FOUND_ROWS(); +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL (SELECT id2 FROM t2); +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL (SELECT id2 FROM t2) LIMIT 0; +SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar"); +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar") LIMIT 0; +SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2); +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2) LIMIT 0; +SELECT FOUND_ROWS(); +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL SELECT "bar"; +(SELECT SQL_CALC_FOUND_ROWS "foo") UNION ALL SELECT "bar" LIMIT 0; +SELECT FOUND_ROWS(); +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL SELECT id2 FROM t2 LIMIT 0; +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1) UNION ALL SELECT id2 FROM t2 LIMIT 0; +SELECT FOUND_ROWS(); +# +#LIMIT IN BRACES +# +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar" LIMIT 0); +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar" LIMIT 0) LIMIT 0; +SELECT FOUND_ROWS(); +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2 LIMIT 0); +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2 LIMIT 0) LIMIT 0; +SELECT FOUND_ROWS(); +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar"); +(SELECT SQL_CALC_FOUND_ROWS "foo" LIMIT 0) UNION ALL (SELECT "bar") LIMIT 0; +SELECT FOUND_ROWS(); +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2); +(SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 LIMIT 0) UNION ALL (SELECT id2 FROM t2) LIMIT 0; +SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar" LIMIT 0); +SELECT SQL_CALC_FOUND_ROWS "foo" UNION ALL (SELECT "bar" LIMIT 0) LIMIT 0; +SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2 LIMIT 0); +SELECT SQL_CALC_FOUND_ROWS id1 FROM t1 UNION ALL (SELECT id2 FROM t2 LIMIT 0) LIMIT 0; +SELECT FOUND_ROWS(); +DROP TABLE t1,t2; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 647dee80188..b964db4077d 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2650,12 +2650,12 @@ void JOIN::exec_inner() send_records= 0; if (!error) { + /* Single select (without union) always returns 0 or 1 row */ + thd->limit_found_rows= send_records; join_free(); // Unlock all cursors error= (int) result->send_eof(); } } - /* Single select (without union) always returns 0 or 1 row */ - thd->limit_found_rows= send_records; thd->set_examined_row_count(0); DBUG_VOID_RETURN; } diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 38de2d592ed..d334bc9a694 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -767,10 +767,12 @@ bool st_select_lex_unit::optimize() 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; - + sl->join->select_options= + (!found_rows_for_union) ? (sl->options & ~OPTION_FOUND_ROWS) : + ((sl->braces) ? ((select_limit_cnt==HA_POS_ERROR) ? + (sl->options | found_rows_for_union) : + (sl->options & ~OPTION_FOUND_ROWS)) : + (sl->options | found_rows_for_union)); saved_error= sl->join->optimize(); } @@ -848,9 +850,12 @@ bool st_select_lex_unit::exec() 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; + sl->join->select_options= + (!found_rows_for_union) ? (sl->options & ~OPTION_FOUND_ROWS) : + ((sl->braces) ? ((select_limit_cnt==HA_POS_ERROR) ? + (sl->options | found_rows_for_union) : + (sl->options & ~OPTION_FOUND_ROWS)) : + (sl->options | found_rows_for_union)); saved_error= sl->join->optimize(); } if (!saved_error) |