Commit b2b9485a authored by jimw@mysql.com's avatar jimw@mysql.com

Merge mysql.com:/home/jimw/my/mysql-5.0-10251

into mysql.com:/home/jimw/my/mysql-5.0-clean
parents 390e0bbc ff2d0938
...@@ -2024,11 +2024,11 @@ my_bool end_of_query(int c) ...@@ -2024,11 +2024,11 @@ my_bool end_of_query(int c)
int read_line(char* buf, int size) int read_line(char* buf, int size)
{ {
int c; int c;
char quote;
char* p= buf, *buf_end= buf + size - 1; char* p= buf, *buf_end= buf + size - 1;
int no_save= 0; int no_save= 0;
enum {R_NORMAL, R_Q1, R_ESC_Q_Q1, R_ESC_Q_Q2, enum {R_NORMAL, R_Q, R_Q_IN_Q, R_SLASH_IN_Q,
R_ESC_SLASH_Q1, R_ESC_SLASH_Q2, R_COMMENT, R_LINE_START} state= R_LINE_START;
R_Q2, R_COMMENT, R_LINE_START} state= R_LINE_START;
DBUG_ENTER("read_line"); DBUG_ENTER("read_line");
start_lineno= *lineno; start_lineno= *lineno;
...@@ -2063,10 +2063,11 @@ int read_line(char* buf, int size) ...@@ -2063,10 +2063,11 @@ int read_line(char* buf, int size)
*p= 0; *p= 0;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
else if (c == '\'') else if (c == '\'' || c == '"' || c == '`')
state = R_Q1; {
else if (c == '"') quote= c;
state = R_Q2; state= R_Q;
}
else if (c == '\n') else if (c == '\n')
{ {
state = R_LINE_START; state = R_LINE_START;
...@@ -2101,55 +2102,36 @@ int read_line(char* buf, int size) ...@@ -2101,55 +2102,36 @@ int read_line(char* buf, int size)
*p= 0; *p= 0;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
else if (c == '\'') else if (c == '\'' || c == '"' || c == '`')
state= R_Q1;
else if (c == '"')
state= R_Q2;
else
state= R_NORMAL;
break;
case R_Q1:
if (c == '\'')
state= R_ESC_Q_Q1;
else if (c == '\\')
state= R_ESC_SLASH_Q1;
break;
case R_ESC_Q_Q1:
if (end_of_query(c))
{ {
*p= 0; quote= c;
DBUG_RETURN(0); state= R_Q;
} }
if (c != '\'')
state= R_NORMAL;
else else
state= R_Q1; state= R_NORMAL;
break;
case R_ESC_SLASH_Q1:
state= R_Q1;
break; break;
case R_Q2: case R_Q:
if (c == '"') if (c == quote)
state= R_ESC_Q_Q2; state= R_Q_IN_Q;
else if (c == '\\') else if (c == '\\')
state= R_ESC_SLASH_Q2; state= R_SLASH_IN_Q;
break; break;
case R_ESC_Q_Q2: case R_Q_IN_Q:
if (end_of_query(c)) if (end_of_query(c))
{ {
*p= 0; *p= 0;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
if (c != '"') if (c != quote)
state= R_NORMAL; state= R_NORMAL;
else else
state= R_Q2; state= R_Q;
break; break;
case R_ESC_SLASH_Q2: case R_SLASH_IN_Q:
state= R_Q2; state= R_Q;
break; break;
} }
if (!no_save) if (!no_save)
......
...@@ -142,3 +142,9 @@ after_--enable_abort_on_error ...@@ -142,3 +142,9 @@ after_--enable_abort_on_error
1064 1064
select 3 from t1 ; select 3 from t1 ;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
select 1 as `a'b`, 2 as `a"b`;
a'b a"b
1 2
select 'aaa\\','aa''a',"aa""a";
aaa\ aa'a aa"a
aaa\ aa'a aa"a
...@@ -286,3 +286,12 @@ select 3 from t1 ; ...@@ -286,3 +286,12 @@ select 3 from t1 ;
#select 3 from t1 ; #select 3 from t1 ;
# #
#select 3 from t1 ; #select 3 from t1 ;
#
# Bug #10251: Identifiers containing quotes not handled correctly
#
select 1 as `a'b`, 2 as `a"b`;
# Test escaping of quotes
select 'aaa\\','aa''a',"aa""a";
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment