Commit 96572b7a authored by Igor Babaev's avatar Igor Babaev

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.
parent f6694b62
...@@ -5299,5 +5299,48 @@ DROP PROCEDURE p2; ...@@ -5299,5 +5299,48 @@ DROP PROCEDURE p2;
DROP PROCEDURE p1; DROP PROCEDURE p1;
DROP ROLE testrole; 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 # End of 10.2 tests
# #
...@@ -4776,6 +4776,52 @@ DROP PROCEDURE p2; ...@@ -4776,6 +4776,52 @@ DROP PROCEDURE p2;
DROP PROCEDURE p1; DROP PROCEDURE p1;
DROP ROLE testrole; 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 #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
...@@ -1582,7 +1582,7 @@ static bool mysql_test_do_fields(Prepared_statement *stmt, ...@@ -1582,7 +1582,7 @@ static bool mysql_test_do_fields(Prepared_statement *stmt,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL, 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(TRUE);
DBUG_RETURN(setup_fields(thd, Ref_ptr_array(), DBUG_RETURN(setup_fields(thd, Ref_ptr_array(),
*values, COLUMNS_READ, 0, NULL, 0)); *values, COLUMNS_READ, 0, NULL, 0));
...@@ -1614,7 +1614,7 @@ static bool mysql_test_set_fields(Prepared_statement *stmt, ...@@ -1614,7 +1614,7 @@ static bool mysql_test_set_fields(Prepared_statement *stmt,
if ((tables && if ((tables &&
check_table_access(thd, SELECT_ACL, tables, FALSE, UINT_MAX, FALSE)) || check_table_access(thd, SELECT_ACL, tables, FALSE, UINT_MAX, FALSE)) ||
open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL, open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL,
DT_PREPARE | DT_CREATE)) DT_INIT | DT_PREPARE | DT_CREATE))
goto error; goto error;
while ((var= it++)) while ((var= it++))
...@@ -1651,7 +1651,8 @@ static bool mysql_test_call_fields(Prepared_statement *stmt, ...@@ -1651,7 +1651,8 @@ static bool mysql_test_call_fields(Prepared_statement *stmt,
if ((tables && if ((tables &&
check_table_access(thd, SELECT_ACL, tables, FALSE, UINT_MAX, FALSE)) || 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; goto err;
while ((item= it++)) while ((item= it++))
...@@ -1777,7 +1778,7 @@ static bool mysql_test_create_table(Prepared_statement *stmt) ...@@ -1777,7 +1778,7 @@ static bool mysql_test_create_table(Prepared_statement *stmt)
if (open_normal_and_derived_tables(stmt->thd, lex->query_tables, if (open_normal_and_derived_tables(stmt->thd, lex->query_tables,
MYSQL_OPEN_FORCE_SHARED_MDL, MYSQL_OPEN_FORCE_SHARED_MDL,
DT_PREPARE | DT_CREATE)) DT_INIT | DT_PREPARE | DT_CREATE))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
select_lex->context.resolve_in_select_list= TRUE; select_lex->context.resolve_in_select_list= TRUE;
...@@ -1798,7 +1799,7 @@ static bool mysql_test_create_table(Prepared_statement *stmt) ...@@ -1798,7 +1799,7 @@ static bool mysql_test_create_table(Prepared_statement *stmt)
*/ */
if (open_normal_and_derived_tables(stmt->thd, lex->query_tables, if (open_normal_and_derived_tables(stmt->thd, lex->query_tables,
MYSQL_OPEN_FORCE_SHARED_MDL, MYSQL_OPEN_FORCE_SHARED_MDL,
DT_PREPARE)) DT_INIT | DT_PREPARE))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
...@@ -2025,7 +2026,7 @@ static bool mysql_test_create_view(Prepared_statement *stmt) ...@@ -2025,7 +2026,7 @@ static bool mysql_test_create_view(Prepared_statement *stmt)
lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW; lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_VIEW;
if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL, if (open_normal_and_derived_tables(thd, tables, MYSQL_OPEN_FORCE_SHARED_MDL,
DT_PREPARE)) DT_INIT | DT_PREPARE))
goto err; goto err;
res= select_like_stmt_test(stmt, 0, 0); res= select_like_stmt_test(stmt, 0, 0);
......
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