mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
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).
This commit is contained in:
@@ -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);
|
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'
|
ERROR 42S22: Unknown column 'd' in 'field list'
|
||||||
drop table t1,t2,t3;
|
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
|
# End of 10.4 tests
|
||||||
|
@@ -6696,4 +6696,23 @@ create algorithm=merge view v as
|
|||||||
|
|
||||||
drop table t1,t2,t3;
|
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
|
--echo # End of 10.4 tests
|
||||||
|
12
sql/table.cc
12
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)
|
static inline bool derived_table_optimization_done(TABLE_LIST *table)
|
||||||
{
|
{
|
||||||
return table->derived &&
|
SELECT_LEX_UNIT *derived= (table->derived ?
|
||||||
(table->derived->is_excluded() ||
|
table->derived :
|
||||||
|
(table->view ?
|
||||||
|
&table->view->unit:
|
||||||
|
NULL));
|
||||||
|
return derived &&
|
||||||
|
(derived->is_excluded() ||
|
||||||
table->is_materialized_derived());
|
table->is_materialized_derived());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9226,8 +9231,7 @@ bool TABLE_LIST::init_derived(THD *thd, bool init_view)
|
|||||||
set_derived();
|
set_derived();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_view() ||
|
if (!derived_table_optimization_done(this))
|
||||||
!derived_table_optimization_done(this))
|
|
||||||
{
|
{
|
||||||
/* A subquery might be forced to be materialized due to a side-effect. */
|
/* A subquery might be forced to be materialized due to a side-effect. */
|
||||||
if (!is_materialized_derived() && unit->can_be_merged() &&
|
if (!is_materialized_derived() && unit->can_be_merged() &&
|
||||||
|
Reference in New Issue
Block a user