diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2021-01-06 10:53:00 +0100 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2021-01-06 10:53:00 +0100 |
commit | 02e7bff882c5169ba3e1ce7e9a93d4c28fe3afd1 (patch) | |
tree | 4a6a8d578fedb4c2b1f437ab39c2d7430ad95163 /sql/sql_cte.cc | |
parent | 5f10870c8a8c2448bfc26d990110390d48000b84 (diff) | |
parent | 478b83032b170b2ae030fa77fe4bed60a7910472 (diff) | |
download | mariadb-git-02e7bff882c5169ba3e1ce7e9a93d4c28fe3afd1.tar.gz |
Merge commit '10.4' into 10.5
Diffstat (limited to 'sql/sql_cte.cc')
-rw-r--r-- | sql/sql_cte.cc | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/sql/sql_cte.cc b/sql/sql_cte.cc index 5bf9930ef21..c32ea8c0238 100644 --- a/sql/sql_cte.cc +++ b/sql/sql_cte.cc @@ -253,6 +253,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; } } @@ -890,8 +892,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) @@ -917,6 +917,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: @@ -1521,10 +1537,11 @@ void With_element::print(THD *thd, 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, |