summaryrefslogtreecommitdiff
path: root/sql/sql_cte.cc
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2020-12-23 19:28:02 +0100
committerOleksandr Byelkin <sanja@mariadb.com>2020-12-23 19:28:02 +0100
commit25561435e0b1fe42ec29d5ab06dc15875cdd1cfa (patch)
treed2e67d4509577d84da7ade2820154c904180e151 /sql/sql_cte.cc
parentfa1aef39ebc7d84d24d4e3d2124f982526632ee9 (diff)
parent8d8370e31d48e0bc6139c18770746f9959c21598 (diff)
downloadmariadb-git-25561435e0b1fe42ec29d5ab06dc15875cdd1cfa.tar.gz
Merge branch '10.2' into 10.3
Diffstat (limited to 'sql/sql_cte.cc')
-rw-r--r--sql/sql_cte.cc27
1 files changed, 22 insertions, 5 deletions
diff --git a/sql/sql_cte.cc b/sql/sql_cte.cc
index a952f3b84b1..be4a43d554f 100644
--- a/sql/sql_cte.cc
+++ b/sql/sql_cte.cc
@@ -244,6 +244,8 @@ With_element *With_clause::find_table_def(TABLE_LIST *table,
!table->is_fqtn)
{
table->set_derived();
+ table->db.str= empty_c_string;
+ table->db.length= 0;
return with_elem;
}
}
@@ -878,8 +880,6 @@ st_select_lex_unit *With_element::clone_parsed_spec(THD *thd,
goto err;
spec_tables_tail= tbl;
}
- if (check_table_access(thd, SELECT_ACL, spec_tables, FALSE, UINT_MAX, FALSE))
- goto err;
if (spec_tables)
{
if (with_table->next_global)
@@ -905,6 +905,22 @@ st_select_lex_unit *With_element::clone_parsed_spec(THD *thd,
with_select));
if (check_dependencies_in_with_clauses(lex->with_clauses_list))
res= NULL;
+ /*
+ Resolve references to CTE from the spec_tables list that has not
+ been resolved yet.
+ */
+ for (TABLE_LIST *tbl= spec_tables;
+ tbl;
+ tbl= tbl->next_global)
+ {
+ if (!tbl->with)
+ tbl->with= with_select->find_table_def_in_with_clauses(tbl);
+ if (tbl == spec_tables_tail)
+ break;
+ }
+ if (check_table_access(thd, SELECT_ACL, spec_tables, FALSE, UINT_MAX, FALSE))
+ goto err;
+
lex->sphead= NULL; // in order not to delete lex->sphead
lex_end(lex);
err:
@@ -1456,10 +1472,11 @@ void With_element::print(String *str, enum_query_type query_type)
bool With_element::instantiate_tmp_tables()
{
- List_iterator_fast<TABLE> li(rec_result->rec_tables);
- TABLE *rec_table;
- while ((rec_table= li++))
+ List_iterator_fast<TABLE_LIST> li(rec_result->rec_table_refs);
+ TABLE_LIST *rec_tbl;
+ while ((rec_tbl= li++))
{
+ TABLE *rec_table= rec_tbl->table;
if (!rec_table->is_created() &&
instantiate_tmp_table(rec_table,
rec_table->s->key_info,