diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2023-05-04 17:51:27 +0200 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2023-05-04 17:51:27 +0200 |
commit | 7973ffde0fede83049a1d611c379b9ee61dea9c9 (patch) | |
tree | ea74801569ffdce37671a6b622e2828ac7187237 | |
parent | cf4a16b5557be5fb3568c1de0d6cc0a18291afc9 (diff) | |
download | mariadb-git-7973ffde0fede83049a1d611c379b9ee61dea9c9.tar.gz |
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).
-rw-r--r-- | mysql-test/main/view.result | 18 | ||||
-rw-r--r-- | mysql-test/main/view.test | 19 | ||||
-rw-r--r-- | sql/table.cc | 12 |
3 files changed, 45 insertions, 4 deletions
diff --git a/mysql-test/main/view.result b/mysql-test/main/view.result index 8c31545eb84..97d19aa2690 100644 --- a/mysql-test/main/view.result +++ b/mysql-test/main/view.result @@ -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 diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test index 0e2dce1fb70..385ca523436 100644 --- a/mysql-test/main/view.test +++ b/mysql-test/main/view.test @@ -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 diff --git a/sql/table.cc b/sql/table.cc index 15a92818b81..0f296a85e58 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -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() && |