Commit 694d1a50 authored by Galina Shalygina's avatar Galina Shalygina

MDEV-19185: Pushdown constant function defined with subquery

The bug occurs because of the wrong pushdown of constant function
defined with subquery from HAVING into WHERE. Subqueries can't be
pushed into WHERE.

To fix it with_subquery() call is added to check if the function contains
subquery.
parent c84dde14
......@@ -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;
......@@ -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;
......@@ -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;
......
......@@ -342,7 +342,7 @@ class Item_func :public Item_func_or_sum,
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);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment