From b741b8a133df54422654d53ab59d467ca57e070e Mon Sep 17 00:00:00 2001 From: unknown <cmiller@zippy.(none)> Date: Wed, 3 May 2006 09:55:34 -0400 Subject: [PATCH] Added code to remove closing comment code from event text, as would be supplied inside a /*!VERSION event-text */ segment. (Fixes Bug#18078 mysql-test/t/disabled.def: Enabling 'mysqldump' test because events should load normally now. mysql-test/t/mysqldump.test: Add spaces and tabs to the end of statements, to prove trimming of whitespace. sql/event_timed.cc: Remove */ close-comment characters at the end, just as sp_head does. The parser should be smarter about not giving us text that jumps semantic levels, but that's an issue for another day. --- mysql-test/t/disabled.def | 1 - mysql-test/t/mysqldump.test | 10 ++++---- sql/event_timed.cc | 46 ++++++++++++++++++++++++++++++++++--- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index d92aed1d1a2..2d7d1b1ca8d 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -33,7 +33,6 @@ rpl_row_blob_innodb : BUG#18980 2006-04-10 kent Test fails randomly rpl_row_func003 : BUG#19074 2006-13-04 andrei test failed rpl_row_inexist_tbl : BUG#18948 2006-03-09 mats Disabled since patch makes this test wait forever rpl_sp : BUG#16456 2006-02-16 jmiller -mysqldump : BUG#18078 2006-03-10 lars udf : BUG#18564 2006-03-27 ian (Permission by Brian) # the below testcase have been reworked to avoid the bug, test contains comment, keep bug open diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 5ba7838bb81..59e09a6407a 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -1174,8 +1174,8 @@ create database first; use first; set time_zone = 'UTC'; -## prove one works -create event ee1 on schedule at '2035-12-31 20:01:23' do set @a=5; +## prove one works (with spaces and tabs on the end) +create event ee1 on schedule at '2035-12-31 20:01:23' do set @a=5; show events; show create event ee1; --exec $MYSQL_DUMP --events first > $MYSQLTEST_VARDIR/tmp/bug16853-1.sql @@ -1187,10 +1187,10 @@ use second; show events; show create event ee1; -## prove three works +## prove three works (with spaces and tabs on the end) # start with one from the previous restore -create event ee2 on schedule at '2018-12-31 21:01:23' do set @a=5; -create event ee3 on schedule at '2030-12-31 22:01:23' do set @a=5; +create event ee2 on schedule at '2018-12-31 21:01:23' do set @a=5; +create event ee3 on schedule at '2030-12-31 22:01:23' do set @a=5; show events; --exec $MYSQL_DUMP --events second > $MYSQLTEST_VARDIR/tmp/bug16853-2.sql drop database second; diff --git a/sql/event_timed.cc b/sql/event_timed.cc index adf28b8877c..ed012ecd399 100644 --- a/sql/event_timed.cc +++ b/sql/event_timed.cc @@ -106,6 +106,9 @@ Event_timed::init_name(THD *thd, sp_name *spn) NOTE The body is extracted by copying all data between the start of the body set by another method and the current pointer in Lex. + + Some questionable removal of characters is done in here, and that part + should be refactored when the parser is smarter. */ void @@ -116,9 +119,46 @@ Event_timed::init_body(THD *thd) body_begin, thd->lex->ptr)); body.length= thd->lex->ptr - body_begin; - /* Trim nuls at the end */ - while (body.length && body_begin[body.length-1] == '\0') - body.length--; + const uchar *body_end= body_begin + body.length - 1; + + /* Trim nuls or close-comments ('*'+'/') or spaces at the end */ + while (body_begin < body_end) + { + + if ((*body_end == '\0') || + (my_isspace(thd->variables.character_set_client, *body_end))) + { /* consume NULs and meaningless whitespace */ + --body.length; + --body_end; + continue; + } + + /* + consume closing comments + + This is arguably wrong, but it's the best we have until the parser is + changed to be smarter. FIXME PARSER + + See also the sp_head code, where something like this is done also. + + One idea is to keep in the lexer structure the count of the number of + open-comments we've entered, and scan left-to-right looking for a + closing comment IFF the count is greater than zero. + + Another idea is to remove the closing comment-characters wholly in the + parser, since that's where it "removes" the opening characters. + */ + if ((*(body_end - 1) == '*') && (*body_end == '/')) + { + DBUG_PRINT("info", ("consumend one '*" "/' comment in the query '%s'", + body_begin)); + body.length-= 2; + body_end-= 2; + continue; + } + + break; /* none were found, so we have excised all we can. */ + } /* the first is always whitespace which I cannot skip in the parser */ while (my_isspace(thd->variables.character_set_client, *body_begin)) -- 2.30.9