mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
EV-16992 Assertion `table_ref->table || table_ref->view' failed in
Field_iterator_table_ref::set_field_iterator Several functions that processed different prepare statements missed the DT_INIT flag in last parameter of the open_normal_and_derived_tables() calls. It made context analysis of derived tables dependent on the order in which the derived tables were processed by mysql_handle_derived(). This order was induced by the order of SELECTs in all_select_list. In 10.4 the order of SELECTs in all_select_list became different and lack of the DT_INIT flags in some open_normal_and_derived_tables() call became critical as some derived tables were not identified as such.
This commit is contained in:
@ -5321,5 +5321,48 @@ DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p1;
|
||||
DROP ROLE testrole;
|
||||
#
|
||||
# MDEV-16992: prepare of CREATE TABLE, CREATE VIEW, DO, SET, CALL
|
||||
# statements with CTE containing materialized derived
|
||||
# (the bug is reproducible on 10.4)
|
||||
#
|
||||
prepare stmt from
|
||||
"CREATE TABLE t1 AS
|
||||
WITH cte(a) AS (SELECT * FROM (SELECT 1) AS t) SELECT * FROM cte;";
|
||||
execute stmt;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
prepare stmt from
|
||||
"CREATE VIEW v1 AS
|
||||
WITH cte(a) AS (SELECT * FROM (SELECT 1) AS t) SELECT * FROM cte;";
|
||||
execute stmt;
|
||||
select * from v1;
|
||||
a
|
||||
1
|
||||
prepare stmt from
|
||||
"DO (SELECT 1
|
||||
FROM (WITH cte AS (SELECT * FROM (SELECT 1) AS t)
|
||||
SELECT * FROM cte) AS tt);";
|
||||
execute stmt;
|
||||
prepare stmt from
|
||||
"SET @a = (SELECT 1
|
||||
FROM (WITH cte AS (SELECT * FROM (SELECT 1) AS t)
|
||||
SELECT * FROM cte) AS t);";
|
||||
execute stmt;
|
||||
create procedure p (i int) insert into t1 values(i);
|
||||
prepare stmt from
|
||||
"CALL p
|
||||
((SELECT 1
|
||||
FROM (WITH cte AS (SELECT * FROM (SELECT 1) AS t)
|
||||
SELECT * FROM cte) AS tt));";
|
||||
execute stmt;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
1
|
||||
drop procedure p;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
|
@ -4784,6 +4784,52 @@ DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p1;
|
||||
DROP ROLE testrole;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-16992: prepare of CREATE TABLE, CREATE VIEW, DO, SET, CALL
|
||||
--echo # statements with CTE containing materialized derived
|
||||
--echo # (the bug is reproducible on 10.4)
|
||||
--echo #
|
||||
|
||||
--enable_result_log
|
||||
|
||||
prepare stmt from
|
||||
"CREATE TABLE t1 AS
|
||||
WITH cte(a) AS (SELECT * FROM (SELECT 1) AS t) SELECT * FROM cte;";
|
||||
execute stmt;
|
||||
select * from t1;
|
||||
|
||||
prepare stmt from
|
||||
"CREATE VIEW v1 AS
|
||||
WITH cte(a) AS (SELECT * FROM (SELECT 1) AS t) SELECT * FROM cte;";
|
||||
execute stmt;
|
||||
select * from v1;
|
||||
|
||||
prepare stmt from
|
||||
"DO (SELECT 1
|
||||
FROM (WITH cte AS (SELECT * FROM (SELECT 1) AS t)
|
||||
SELECT * FROM cte) AS tt);";
|
||||
execute stmt;
|
||||
|
||||
prepare stmt from
|
||||
"SET @a = (SELECT 1
|
||||
FROM (WITH cte AS (SELECT * FROM (SELECT 1) AS t)
|
||||
SELECT * FROM cte) AS t);";
|
||||
execute stmt;
|
||||
|
||||
create procedure p (i int) insert into t1 values(i);
|
||||
|
||||
prepare stmt from
|
||||
"CALL p
|
||||
((SELECT 1
|
||||
FROM (WITH cte AS (SELECT * FROM (SELECT 1) AS t)
|
||||
SELECT * FROM cte) AS tt));";
|
||||
execute stmt;
|
||||
select * from t1;
|
||||
|
||||
drop procedure p;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
@ -1582,7 +1582,7 @@ static bool mysql_test_do_fields(Prepared_statement *stmt,
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL,
|
||||
DT_PREPARE | DT_CREATE))
|
||||
DT_INIT | DT_PREPARE | DT_CREATE))
|
||||
DBUG_RETURN(TRUE);
|
||||
DBUG_RETURN(setup_fields(thd, Ref_ptr_array(),
|
||||
*values, COLUMNS_READ, 0, NULL, 0));
|
||||
@ -1614,7 +1614,7 @@ static bool mysql_test_set_fields(Prepared_statement *stmt,
|
||||
if ((tables &&
|
||||
check_table_access(thd, SELECT_ACL, tables, FALSE, UINT_MAX, FALSE)) ||
|
||||
open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL,
|
||||
DT_PREPARE | DT_CREATE))
|
||||
DT_INIT | DT_PREPARE | DT_CREATE))
|
||||
goto error;
|
||||
|
||||
while ((var= it++))
|
||||
@ -1651,7 +1651,8 @@ static bool mysql_test_call_fields(Prepared_statement *stmt,
|
||||
|
||||
if ((tables &&
|
||||
check_table_access(thd, SELECT_ACL, tables, FALSE, UINT_MAX, FALSE)) ||
|
||||
open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL, DT_PREPARE))
|
||||
open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL,
|
||||
DT_INIT | DT_PREPARE))
|
||||
goto err;
|
||||
|
||||
while ((item= it++))
|
||||
@ -1777,7 +1778,7 @@ static bool mysql_test_create_table(Prepared_statement *stmt)
|
||||
|
||||
if (open_normal_and_derived_tables(stmt->thd, lex->query_tables,
|
||||
MYSQL_OPEN_FORCE_SHARED_MDL,
|
||||
DT_PREPARE | DT_CREATE))
|
||||
DT_INIT | DT_PREPARE | DT_CREATE))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
select_lex->context.resolve_in_select_list= TRUE;
|
||||
@ -1798,7 +1799,7 @@ static bool mysql_test_create_table(Prepared_statement *stmt)
|
||||
*/
|
||||
if (open_normal_and_derived_tables(stmt->thd, lex->query_tables,
|
||||
MYSQL_OPEN_FORCE_SHARED_MDL,
|
||||
DT_PREPARE))
|
||||
DT_INIT | DT_PREPARE))
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
@ -2025,7 +2026,7 @@ static bool mysql_test_create_view(Prepared_statement *stmt)
|
||||
|
||||
lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW;
|
||||
if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL,
|
||||
DT_PREPARE))
|
||||
DT_INIT | DT_PREPARE))
|
||||
goto err;
|
||||
|
||||
res= select_like_stmt_test(stmt, 0, 0);
|
||||
|
Reference in New Issue
Block a user