summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <jimw@mysql.com>2005-05-06 05:48:46 -0700
committerunknown <jimw@mysql.com>2005-05-06 05:48:46 -0700
commit34ca109146f97a79fc17bfcac785c4beba426fe1 (patch)
tree5f0d8331cd9e45e21f18b60e13b5c9347b486517
parent745d52bb3da3afb018061b4e3ec34420a8475389 (diff)
downloadmariadb-git-34ca109146f97a79fc17bfcac785c4beba426fe1.tar.gz
Support quoted identifiers containing single and double quotes in
mysqltest. (Bug #10251) client/mysqltest.c: Remove duplication in quote-handling quote, and add handling of backquote (`). mysql-test/t/mysqltest.test: Add test of identifiers containing quotes. mysql-test/r/mysqltest.result: Update results
-rw-r--r--client/mysqltest.c62
-rw-r--r--mysql-test/r/mysqltest.result6
-rw-r--r--mysql-test/t/mysqltest.test9
3 files changed, 37 insertions, 40 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 4991e565594..a68b341a3e9 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -2024,11 +2024,11 @@ my_bool end_of_query(int c)
int read_line(char* buf, int size)
{
int c;
+ char quote;
char* p= buf, *buf_end= buf + size - 1;
int no_save= 0;
- enum {R_NORMAL, R_Q1, R_ESC_Q_Q1, R_ESC_Q_Q2,
- R_ESC_SLASH_Q1, R_ESC_SLASH_Q2,
- R_Q2, R_COMMENT, R_LINE_START} state= R_LINE_START;
+ enum {R_NORMAL, R_Q, R_Q_IN_Q, R_SLASH_IN_Q,
+ R_COMMENT, R_LINE_START} state= R_LINE_START;
DBUG_ENTER("read_line");
start_lineno= *lineno;
@@ -2063,10 +2063,11 @@ int read_line(char* buf, int size)
*p= 0;
DBUG_RETURN(0);
}
- else if (c == '\'')
- state = R_Q1;
- else if (c == '"')
- state = R_Q2;
+ else if (c == '\'' || c == '"' || c == '`')
+ {
+ quote= c;
+ state= R_Q;
+ }
else if (c == '\n')
{
state = R_LINE_START;
@@ -2101,55 +2102,36 @@ int read_line(char* buf, int size)
*p= 0;
DBUG_RETURN(0);
}
- else if (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))
+ else if (c == '\'' || c == '"' || c == '`')
{
- *p= 0;
- DBUG_RETURN(0);
+ quote= c;
+ state= R_Q;
}
- if (c != '\'')
- state= R_NORMAL;
else
- state= R_Q1;
- break;
- case R_ESC_SLASH_Q1:
- state= R_Q1;
+ state= R_NORMAL;
break;
- case R_Q2:
- if (c == '"')
- state= R_ESC_Q_Q2;
+ case R_Q:
+ if (c == quote)
+ state= R_Q_IN_Q;
else if (c == '\\')
- state= R_ESC_SLASH_Q2;
+ state= R_SLASH_IN_Q;
break;
- case R_ESC_Q_Q2:
+ case R_Q_IN_Q:
if (end_of_query(c))
{
*p= 0;
DBUG_RETURN(0);
}
- if (c != '"')
+ if (c != quote)
state= R_NORMAL;
else
- state= R_Q2;
+ state= R_Q;
break;
- case R_ESC_SLASH_Q2:
- state= R_Q2;
+ case R_SLASH_IN_Q:
+ state= R_Q;
break;
+
}
if (!no_save)
diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result
index d75dbd5d00c..51e56c21a07 100644
--- a/mysql-test/r/mysqltest.result
+++ b/mysql-test/r/mysqltest.result
@@ -142,3 +142,9 @@ after_--enable_abort_on_error
1064
select 3 from t1 ;
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
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index 0802c18ed6c..067b0db492f 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -286,3 +286,12 @@ 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";