summaryrefslogtreecommitdiff
path: root/sql/sql_lex.cc
diff options
context:
space:
mode:
authorMarc Alff <marc.alff@sun.com>2008-07-07 10:00:08 -0600
committerMarc Alff <marc.alff@sun.com>2008-07-07 10:00:08 -0600
commitc7724872d85cebf07df3380757cf7259f9116682 (patch)
tree373c5fa1c21bed1d12376b834674b7bb3f0463aa /sql/sql_lex.cc
parent5647bce3668b46c5c74349520cefb2a791125e95 (diff)
downloadmariadb-git-c7724872d85cebf07df3380757cf7259f9116682.tar.gz
Bug#26030 (Parsing fails for stored routine w/multi-statement execution
enabled) Before this fix, the lexer and parser would treat the ';' character as a different token (either ';' or END_OF_INPUT), based on convoluted logic, which failed in simple cases where a stored procedure is implemented as a single statement, and used in a multi query. With this fix: - the character ';' is always parsed as a ';' token in the lexer, - parsing multi queries is implemented in the parser, in the 'query:' rules, - the value of thd->client_capabilities, which is the capabilities negotiated between the client and the server during bootstrap, is immutable and not arbitrarily modified during parsing (which was the root cause of the bug)
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r--sql/sql_lex.cc19
1 files changed, 3 insertions, 16 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 6bfcd982b04..a1bfc3edc6c 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1010,21 +1010,8 @@ int MYSQLlex(void *arg, void *yythd)
yySkip();
return (SET_VAR);
case MY_LEX_SEMICOLON: // optional line terminator
- if (yyPeek())
- {
- if ((thd->client_capabilities & CLIENT_MULTI_STATEMENTS) &&
- !lip->stmt_prepare_mode)
- {
- lex->safe_to_cache_query= 0;
- lip->found_semicolon= lip->ptr;
- thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
- lip->next_state= MY_LEX_END;
- return (END_OF_INPUT);
- }
- state= MY_LEX_CHAR; // Return ';'
- break;
- }
- /* fall true */
+ state= MY_LEX_CHAR; // Return ';'
+ break;
case MY_LEX_EOL:
if (lip->ptr >= lip->end_of_query)
{
@@ -1039,7 +1026,7 @@ int MYSQLlex(void *arg, void *yythd)
case MY_LEX_END:
lip->next_state=MY_LEX_END;
return(0); // We found end of input last time
-
+
/* Actually real shouldn't start with . but allow them anyhow */
case MY_LEX_REAL_OR_POINT:
if (my_isdigit(cs,yyPeek()))