Changeset: bcee807428ca for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bcee807428ca
Modified Files:
        sql/server/rel_dump.c
        sql/test/SQLancer/Tests/sqlancer19.SQL.py
Branch: Jul2021
Log Message:

Parse identifiers correclty too


diffs (66 lines):

diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -86,7 +86,7 @@ dump_escape_ident(sql_allocator *sa, con
 
                res = r;
                while (*s) {
-                       if (*s == '"')
+                       if (*s == '"' || *s == '\\')
                                *r++ = '\\';
                        *r++ = *s++;
                }
@@ -717,8 +717,9 @@ skipIdent( char *r, int *pos)
 {
        if (r[*pos] == '"') {
                (*pos)++;
-               while(r[*pos] && r[*pos] != '"') {
-                       if (r[*pos] == '\\' && r[*pos + 1] == '"') /* We send 
escaped '"' character, so consider this pair as just one */
+               while (r[*pos] && r[*pos] != '"') {
+                       /* We send escaped '"' and '\' characters */
+                       if (r[*pos] == '\\' && (r[*pos + 1] == '"' || r[*pos + 
1] == '\\'))
                                (*pos)+=2;
                        else
                                (*pos)++;
@@ -729,13 +730,14 @@ skipIdent( char *r, int *pos)
        }
 }
 
-static void /* We send escaped '"' character, so remove the escape after 
parsing */
+static void
 convertIdent(char *r)
 {
        int i = 0, j = 0;
-       while(r[i] && r[i] != '"') {
-               if (r[i] == '\\' && r[i + 1] == '"') {
-                       r[j++] = '"';
+       while (r[i] && r[i] != '"') {
+               /* We send escaped '"' and '\' characters */
+               if (r[i] == '\\' && (r[i + 1] == '"' || r[i + 1] == '\\')) {
+                       r[j++] = r[i + 1];
                        i+=2;
                } else {
                        r[j++] = r[i++];
@@ -1717,7 +1719,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                                bool inside_identifier = false;
 
                                while (r[*pos] && (inside_identifier || r[*pos] 
!= '\n')) { /* the input parameters must be parsed after the input relation, 
skip them for now  */
-                                       if (inside_identifier && r[*pos] == 
'\\' && r[*pos + 1] == '"') {
+                                       if (inside_identifier && r[*pos] == 
'\\' && (r[*pos + 1] == '"' || r[*pos + 1] == '\\')) {
                                                (*pos)+=2;
                                        } else if (r[*pos] == '"') {
                                                inside_identifier = 
!inside_identifier;
diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py 
b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
--- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
+++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
@@ -59,6 +59,10 @@ with SQLTestCase() as cli:
         .assertSucceeded().assertDataResultMatch([("\\",)])
     cli.execute("SELECT r'\\' from rt3;") \
         .assertSucceeded().assertDataResultMatch([("\\",)])
+    cli.execute("SELECT 1 as \"ups\\\", 2 as \"\\\", 3 as \"\"\"\", 4 as 
\"\"\"\\\", 5 as \"\\\"\"\" from t3;") \
+        .assertSucceeded().assertDataResultMatch([(1,2,3,4,5)])
+    cli.execute("SELECT 1 as \"ups\\\", 2 as \"\\\", 3 as \"\"\"\", 4 as 
\"\"\"\\\", 5 as \"\\\"\"\" from rt3;") \
+        .assertSucceeded().assertDataResultMatch([(1,2,3,4,5)])
     cli.execute("ROLLBACK;")
 
     cli.execute("""
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to