MDEV-33281 Fix mysql-test-run to correctly handle hints

After commit 408a637b87cba62506a4fbf363424ccc8530df12 for MDEV-29344
the mysql-test framework started to misinterpret slash/star sequences for
statements looking like this:
  SELECT /* BNL(t1) */* FROM t1, t2
where there is no space after closing `*/` and the following `*`.
This commit fixes that misinterpretation
This commit is contained in:
Oleg Smirnov 2025-04-26 13:50:30 +07:00
parent a0e89070cc
commit 0737d8f35d

View File

@ -6818,7 +6818,7 @@ int read_line()
my_bool have_slash= FALSE; my_bool have_slash= FALSE;
enum {R_NORMAL, R_Q, R_SLASH_IN_Q, enum {R_NORMAL, R_Q, R_SLASH_IN_Q,
R_COMMENT, R_LINE_START, R_CSTYLE_COMMENT} state= R_LINE_START; R_COMMENT, R_LINE_START, R_CSTYLE_COMMENT, R_HINT} state= R_LINE_START;
DBUG_ENTER("read_line"); DBUG_ENTER("read_line");
*p= 0; *p= 0;
@ -6875,8 +6875,10 @@ int read_line()
p--; p--;
} }
bool drop_last_char= false;
switch(state) { switch(state) {
case R_NORMAL: case R_NORMAL:
case R_HINT:
if (end_of_query(c)) if (end_of_query(c))
{ {
*p= 0; *p= 0;
@ -6910,16 +6912,29 @@ int read_line()
state= R_CSTYLE_COMMENT; state= R_CSTYLE_COMMENT;
break; break;
} }
else if (c == '/' && last_char == '*') // Closing sequence `*/`
{
state= R_NORMAL;
// The hint is finished, and we don't want to interpret the current slash
// as an opener for a next hint or a C-style comment like it can happen
// for a statement like `SELECT /*+ BNL(t1) */* FROM t1` where there is
//no space between `*/` and `*`. So discard the current slash
drop_last_char= true;
}
have_slash= is_escape_char(c, last_quote); have_slash= is_escape_char(c, last_quote);
break; break;
case R_CSTYLE_COMMENT: case R_CSTYLE_COMMENT:
if (c == '!') if (c == '!' || c == '+')
// Got the hint introducer '/*!'. Switch to normal processing of {
// next following characters // Got hint introducer '/*!' or '/*+'
state= R_NORMAL; state= R_HINT;
}
else if (c == '/' && last_char == '*') else if (c == '/' && last_char == '*')
{
state= R_NORMAL; state= R_NORMAL;
drop_last_char= true; // See comment for `drop_last_char` above
}
break; break;
case R_COMMENT: case R_COMMENT:
@ -6999,7 +7014,15 @@ int read_line()
} }
last_char= c; if (!drop_last_char)
{
last_char= c;
}
else
{
last_char= 0;
drop_last_char= false;
}
if (!skip_char) if (!skip_char)
{ {