summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/select_found.result129
-rw-r--r--mysql-test/t/select_found.test58
-rw-r--r--sql/sql_select.cc4
-rw-r--r--sql/sql_union.cc19
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)