diff options
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r-- | sql/sql_lex.cc | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 568640b574a..6411b194a8a 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -152,7 +152,7 @@ st_parsing_options::reset() */ bool Lex_input_stream::init(THD *thd, - const char* buff, + char* buff, unsigned int length) { DBUG_EXECUTE_IF("bug42064_simulate_oom", @@ -182,7 +182,7 @@ bool Lex_input_stream::init(THD *thd, */ void -Lex_input_stream::reset(const char *buffer, unsigned int length) +Lex_input_stream::reset(char *buffer, unsigned int length) { yylineno= 1; yytoklen= 0; @@ -449,6 +449,9 @@ void lex_end(LEX *lex) } reset_dynamic(&lex->plugins); + delete lex->sphead; + lex->sphead= NULL; + DBUG_VOID_RETURN; } @@ -1424,11 +1427,10 @@ int lex_one_token(void *arg, void *yythd) ulong version; version=strtol(version_str, NULL, 10); - /* Accept 'M' 'm' 'm' 'd' 'd' */ - lip->yySkipn(5); - if (version <= MYSQL_VERSION_ID) { + /* Accept 'M' 'm' 'm' 'd' 'd' */ + lip->yySkipn(5); /* Expand the content of the special comment as real code */ lip->set_echo(TRUE); state=MY_LEX_START; @@ -1436,7 +1438,19 @@ int lex_one_token(void *arg, void *yythd) } else { + const char* version_mark= lip->get_ptr() - 1; + DBUG_ASSERT(*version_mark == '!'); + /* + Patch and skip the conditional comment to avoid it + being propagated infinitely (eg. to a slave). + */ + char *pcom= lip->yyUnput(' '); comment_closed= ! consume_comment(lip, 1); + if (! comment_closed) + { + DBUG_ASSERT(pcom == version_mark); + *pcom= '!'; + } /* version allowed to have one level of comment inside. */ } } |