diff --git a/mysql-test/main/having_cond_pushdown.result b/mysql-test/main/having_cond_pushdown.result index bec2a937e38..e9fcd633895 100644 --- a/mysql-test/main/having_cond_pushdown.result +++ b/mysql-test/main/having_cond_pushdown.result @@ -4625,3 +4625,19 @@ a MAX(t1.b) c 1 22 3 deallocate prepare stmt1; DROP TABLE t1,t3; +# +# MDEV-19185: pushdown constant function with subquery +# +CREATE TABLE t1 (pk INT, c1 VARCHAR(64)); +INSERT INTO t1 VALUES (1,'bbb'),(2,'aaa'),(3,'ccc'); +CREATE VIEW v1 AS SELECT * FROM t1; +SELECT pk +FROM t1 +GROUP BY pk +HAVING (1 NOT IN (SELECT COUNT(t1.c1) FROM (v1, t1))); +pk +1 +2 +3 +DROP TABLE t1; +DROP VIEW v1; diff --git a/mysql-test/main/having_cond_pushdown.test b/mysql-test/main/having_cond_pushdown.test index 1e5ad610e90..a50fa11484d 100644 --- a/mysql-test/main/having_cond_pushdown.test +++ b/mysql-test/main/having_cond_pushdown.test @@ -1301,3 +1301,20 @@ execute stmt1; deallocate prepare stmt1; DROP TABLE t1,t3; + + +--echo # +--echo # MDEV-19185: pushdown constant function with subquery +--echo # + +CREATE TABLE t1 (pk INT, c1 VARCHAR(64)); +INSERT INTO t1 VALUES (1,'bbb'),(2,'aaa'),(3,'ccc'); +CREATE VIEW v1 AS SELECT * FROM t1; + +SELECT pk +FROM t1 +GROUP BY pk +HAVING (1 NOT IN (SELECT COUNT(t1.c1) FROM (v1, t1))); + +DROP TABLE t1; +DROP VIEW v1; diff --git a/sql/item.cc b/sql/item.cc index 543dc971228..e511921b30b 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -9060,9 +9060,8 @@ bool Item_args::excl_dep_on_grouping_fields(st_select_lex *sel) { for (uint i= 0; i < arg_count; i++) { - if (args[i]->type() == Item::SUBSELECT_ITEM || - (args[i]->type() == Item::FUNC_ITEM && - ((Item_func *)args[i])->functype() == Item_func::UDF_FUNC)) + if (args[i]->type() == Item::FUNC_ITEM && + ((Item_func *)args[i])->functype() == Item_func::UDF_FUNC) return false; if (args[i]->const_item()) continue; diff --git a/sql/item_func.h b/sql/item_func.h index a3bf4d78158..44e9691c9df 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -342,7 +342,7 @@ public: bool excl_dep_on_grouping_fields(st_select_lex *sel) { - if (has_rand_bit()) + if (has_rand_bit() || with_subquery()) return false; return Item_args::excl_dep_on_grouping_fields(sel); }