diff options
author | Sergei Golubchik <serg@mariadb.org> | 2018-04-18 14:29:48 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2018-05-12 10:16:45 +0200 |
commit | 531acda4847996fea058f0bd4bf86c2e59f33a5f (patch) | |
tree | 9b972ae83f203cb6c5b43553a46cceba47aa354a /sql/sql_prepare.cc | |
parent | 0f956a0676849bdd9c98bc45867b1965909f24f3 (diff) | |
download | mariadb-git-531acda4847996fea058f0bd4bf86c2e59f33a5f.tar.gz |
MDEV-14820 System versioning is applied incorrectly to CTEs
Make sure that SELECT_LEX_UNIT::derived, behaves as documented
(points to the "TABLE_LIST representing this union in the
embedding select"). For recursive CTE this was not necessarily
the case, it could've pointed to the TABLE_LIST inside the CTE,
not in the embedding select.
To fix:
* don't update unit->derived in mysql_derived_prepare(), pass derived
as an argument to st_select_lex_unit::prepare()
* prefer to set unit->derived in TABLE_LIST::init_derived()
to the TABLE_LIST in the embedding select, not to the recursive
reference. Fail if there are many TABLE_LISTs in the embedding
select with conflicting FOR SYSTEM_TIME clauses.
cleanup:
* remove redundant THD* argument from st_select_lex_unit::prepare()
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r-- | sql/sql_prepare.cc | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 6db7bc777cf..b149727484d 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1530,7 +1530,7 @@ static int mysql_test_select(Prepared_statement *stmt, It is not SELECT COMMAND for sure, so setup_tables will be called as usual, and we pass 0 as setup_tables_done_option */ - if (unit->prepare(thd, 0, 0)) + if (unit->prepare(unit->derived, 0, 0)) goto error; if (!lex->describe && !thd->lex->analyze_stmt && !stmt->is_sql_prepare()) { @@ -1701,7 +1701,7 @@ static bool select_like_stmt_test(Prepared_statement *stmt, thd->lex->used_tables= 0; // Updated by setup_fields /* Calls JOIN::prepare */ - DBUG_RETURN(lex->unit.prepare(thd, 0, setup_tables_done_option)); + DBUG_RETURN(lex->unit.prepare(lex->unit.derived, 0, setup_tables_done_option)); } /** |