diff options
author | Igor Babaev <igor@askmonty.org> | 2018-09-13 00:35:28 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2018-09-14 18:13:16 -0700 |
commit | 3473e0452ed5edb567f49b26c9f506431e175ac4 (patch) | |
tree | dabdea5e4002d73a4ae29841973d9cad6ee8dd45 /sql/sql_lex.cc | |
parent | 6b2da933592b54616467d08313fcb1d958fc67e4 (diff) | |
download | mariadb-git-3473e0452ed5edb567f49b26c9f506431e175ac4.tar.gz |
MDEV-17154 Multiple selects from parametrized CTE fails with syntax error
This patch fills a serious flaw in the implementation of common table
expressions. Before this patch an attempt to prepare a statement from
a query with a parameter marker in a CTE that was used more than once
in the query ended up with a bogus error message. Similarly if a statement
in a stored procedure contained a CTE whose specification used a
local variables and this CTE was referred to more than once in the
statement then the server failed to execute the stored procedure returning
a bogus error message on a non-existing field.
The problems appeared due to incorrect handling of parameter markers /
local variables in CTEs that were referred more than once.
This patch fixes the problems by differentiating between the original
occurrences of a parameter marker / local variable used in the
specification of a CTE and the corresponding occurrences used
in copies of this specification. These copies are substituted
instead of non-first references to the CTE.
The idea of the fix and even some code were taken from the MySQL
implementation of the common table expressions.
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r-- | sql/sql_lex.cc | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index d3ddd9e208c..3624b238fbc 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -671,6 +671,7 @@ void lex_start(THD *thd) lex->curr_with_clause= 0; lex->with_clauses_list= 0; lex->with_clauses_list_last_next= &lex->with_clauses_list; + lex->clone_spec_offset= 0; lex->value_list.empty(); lex->update_list.empty(); lex->set_var_list.empty(); |