Commit 7973ffde authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

MDEV-31189 Server crash or assertion failure in upon 2nd execution of PS with views and HAVING

Do not try to decide merge/materialize for derived if it was already decided
(even if it is a view).
parent cf4a16b5
......@@ -6956,4 +6956,22 @@ create algorithm=merge view v as
select * from t1 left join t2 on t1.a=t2.b and t1.a in (select d from t3);
ERROR 42S22: Unknown column 'd' in 'field list'
drop table t1,t2,t3;
#
# MDEV-31189: Server crash or assertion failure in upon 2nd
# execution of PS with views and HAVING
#
CREATE TABLE t (f INT);
INSERT INTO t VALUES (1),(2);
CREATE VIEW v1 AS SELECT 1 AS a;
CREATE VIEW v2 AS SELECT a FROM v1;
PREPARE stmt FROM "SELECT * FROM v2 HAVING 1 IN (SELECT f FROM t)";
EXECUTE stmt;
a
1
EXECUTE stmt;
a
1
DROP VIEW v1;
DROP VIEW v2;
DROP TABLE t;
# End of 10.4 tests
......@@ -6696,4 +6696,23 @@ create algorithm=merge view v as
drop table t1,t2,t3;
--echo #
--echo # MDEV-31189: Server crash or assertion failure in upon 2nd
--echo # execution of PS with views and HAVING
--echo #
CREATE TABLE t (f INT);
INSERT INTO t VALUES (1),(2); # Optional, fails either way
CREATE VIEW v1 AS SELECT 1 AS a;
CREATE VIEW v2 AS SELECT a FROM v1;
PREPARE stmt FROM "SELECT * FROM v2 HAVING 1 IN (SELECT f FROM t)";
EXECUTE stmt;
EXECUTE stmt;
# Cleanup
DROP VIEW v1;
DROP VIEW v2;
DROP TABLE t;
--echo # End of 10.4 tests
......@@ -9163,8 +9163,13 @@ void TABLE_LIST::wrap_into_nested_join(List<TABLE_LIST> &join_list)
static inline bool derived_table_optimization_done(TABLE_LIST *table)
{
return table->derived &&
(table->derived->is_excluded() ||
SELECT_LEX_UNIT *derived= (table->derived ?
table->derived :
(table->view ?
&table->view->unit:
NULL));
return derived &&
(derived->is_excluded() ||
table->is_materialized_derived());
}
......@@ -9226,8 +9231,7 @@ bool TABLE_LIST::init_derived(THD *thd, bool init_view)
set_derived();
}
if (is_view() ||
!derived_table_optimization_done(this))
if (!derived_table_optimization_done(this))
{
/* A subquery might be forced to be materialized due to a side-effect. */
if (!is_materialized_derived() && unit->can_be_merged() &&
......
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