mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#33812: mysql client incorrectly parsing DELIMITER
Fix parsing of mysql client commands, especially in relation to single-line comments when --comments was specified. This is a little tricky, because we need to allow single-line comments in the middle of statements, but we don't want to allow client commands in the middle of statements. So in comment-preservation mode, we go ahead and send single-line comments to the server immediately when we encounter them on their own. This is still slightly flawed, in that it does not handle a single-line comment with leading spaces, followed by a client-side command when --comment has been enabled. But this isn't a new problem, and it is quite an edge condition. Fixing it would require a more extensive overall of how the mysql client parses commands.
This commit is contained in:
@ -1998,7 +1998,7 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
|||||||
{
|
{
|
||||||
if (!preserve_comments)
|
if (!preserve_comments)
|
||||||
{
|
{
|
||||||
// Skip spaces at the beggining of a statement
|
// Skip spaces at the beginning of a statement
|
||||||
if (my_isspace(charset_info,inchar) && (out == line) &&
|
if (my_isspace(charset_info,inchar) && (out == line) &&
|
||||||
buffer.is_empty())
|
buffer.is_empty())
|
||||||
continue;
|
continue;
|
||||||
@ -2081,37 +2081,6 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!*ml_comment && !*in_string &&
|
|
||||||
(end_of_line - pos) >= 10 &&
|
|
||||||
!my_strnncoll(charset_info, (uchar*) pos, 10,
|
|
||||||
(const uchar*) "delimiter ", 10))
|
|
||||||
{
|
|
||||||
// Flush previously accepted characters
|
|
||||||
if (out != line)
|
|
||||||
{
|
|
||||||
buffer.append(line, (uint32) (out - line));
|
|
||||||
out= line;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flush possible comments in the buffer
|
|
||||||
if (!buffer.is_empty())
|
|
||||||
{
|
|
||||||
if (com_go(&buffer, 0) > 0) // < 0 is not fatal
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
buffer.length(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Delimiter wants the get rest of the given line as argument to
|
|
||||||
allow one to change ';' to ';;' and back
|
|
||||||
*/
|
|
||||||
buffer.append(pos);
|
|
||||||
if (com_delimiter(&buffer, pos) > 0)
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
|
|
||||||
buffer.length(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (!*ml_comment && !*in_string && is_prefix(pos, delimiter))
|
else if (!*ml_comment && !*in_string && is_prefix(pos, delimiter))
|
||||||
{
|
{
|
||||||
// Found a statement. Continue parsing after the delimiter
|
// Found a statement. Continue parsing after the delimiter
|
||||||
@ -2174,8 +2143,24 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
|||||||
|
|
||||||
// comment to end of line
|
// comment to end of line
|
||||||
if (preserve_comments)
|
if (preserve_comments)
|
||||||
|
{
|
||||||
|
bool started_with_nothing= !buffer.length();
|
||||||
|
|
||||||
buffer.append(pos);
|
buffer.append(pos);
|
||||||
|
|
||||||
|
/*
|
||||||
|
A single-line comment by itself gets sent immediately so that
|
||||||
|
client commands (delimiter, status, etc) will be interpreted on
|
||||||
|
the next line.
|
||||||
|
*/
|
||||||
|
if (started_with_nothing)
|
||||||
|
{
|
||||||
|
if (com_go(&buffer, 0) > 0) // < 0 is not fatal
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
buffer.length(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (!*in_string && inchar == '/' && *(pos+1) == '*' &&
|
else if (!*in_string && inchar == '/' && *(pos+1) == '*' &&
|
||||||
|
@ -180,4 +180,10 @@ ERROR at line 1: DELIMITER cannot contain a backslash character
|
|||||||
1
|
1
|
||||||
This is a file starting with UTF8 BOM 0xEFBBBF
|
This is a file starting with UTF8 BOM 0xEFBBBF
|
||||||
This is a file starting with UTF8 BOM 0xEFBBBF
|
This is a file starting with UTF8 BOM 0xEFBBBF
|
||||||
|
delimiter
|
||||||
|
1
|
||||||
|
2
|
||||||
|
2
|
||||||
|
2
|
||||||
|
2
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -290,4 +290,23 @@ EOF
|
|||||||
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug29323.sql 2>&1
|
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug29323.sql 2>&1
|
||||||
remove_file $MYSQLTEST_VARDIR/tmp/bug29323.sql;
|
remove_file $MYSQLTEST_VARDIR/tmp/bug29323.sql;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #33812: mysql client incorrectly parsing DELIMITER
|
||||||
|
#
|
||||||
|
# The space and ; after delimiter are important
|
||||||
|
--exec $MYSQL -e "select 1 delimiter ;"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #38158: mysql client regression, can't read dump files
|
||||||
|
#
|
||||||
|
--write_file $MYSQLTEST_VARDIR/tmp/bug38158.sql
|
||||||
|
-- Testing
|
||||||
|
--
|
||||||
|
delimiter ||
|
||||||
|
select 2 ||
|
||||||
|
EOF
|
||||||
|
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug38158.sql 2>&1
|
||||||
|
--exec $MYSQL -c < $MYSQLTEST_VARDIR/tmp/bug38158.sql 2>&1
|
||||||
|
remove_file $MYSQLTEST_VARDIR/tmp/bug38158.sql;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
Reference in New Issue
Block a user