Changeset: 2a0147bf2208 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2a0147bf2208
Modified Files:
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/test/escape-sequences/Tests/literals.test
Branch: escape-sequences
Log Message:

escape guid


diffs (156 lines):

diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -24,7 +24,7 @@ static int sqlformaterror(mvc *sql, _In_
 static void *ma_alloc(sql_allocator *sa, size_t sz);
 static void ma_free(void *p);
 static inline symbol*
-makeAtomNode(mvc *m, const char* type, const char* val, unsigned int digits, 
unsigned int scale);
+makeAtomNode(mvc *m, const char* type, const char* val, unsigned int digits, 
unsigned int scale, bool bind);
 
 #include <unistd.h>
 #include <string.h>
@@ -383,6 +383,7 @@ int yydebug=1;
     odbc_date_escape
     odbc_time_escape
     odbc_timestamp_escape
+    odbc_guid_escape
 
 %type <type>
        data_type
@@ -727,7 +728,7 @@ SQLCODE SQLERROR UNDER WHENEVER
 %token X_BODY 
 %token MAX_MEMORY MAX_WORKERS OPTIMIZER
 /* escape sequence tokens */
-%token<sval> DATE_ESCAPE_PREFIX TIME_ESCAPE_PREFIX TIMESTAMP_ESCAPE_PREFIX
+%token<sval> DATE_ESCAPE_PREFIX TIME_ESCAPE_PREFIX TIMESTAMP_ESCAPE_PREFIX 
GUID_ESCAPE_PREFIX
 %%
 
 sqlstmt:
@@ -4845,7 +4846,7 @@ literal:
                  $$ = _newAtomNode(atom_float(SA, &t, val)); }
  |  sqlDATE string
         {
-            symbol* node = makeAtomNode(m, "date", $2, 0, 0);
+            symbol* node = makeAtomNode(m, "date", $2, 0, 0, false);
             if (node == NULL)
                 YYABORT;
             $$ = node;
@@ -4955,6 +4956,7 @@ literal:
                  }
                  $$ = _newAtomNode(a);
                }
+ |  odbc_guid_escape
  |  BOOL_FALSE
                { sql_subtype t;
                  sql_find_subtype(&t, "boolean", 0, 0 );
@@ -5576,6 +5578,7 @@ non_reserved_word:
 | DATE_ESCAPE_PREFIX { $$ = sa_strdup(SA, "d"); }
 | TIME_ESCAPE_PREFIX { $$ = sa_strdup(SA, "t"); }
 | TIMESTAMP_ESCAPE_PREFIX { $$ = sa_strdup(SA, "ts"); }
+| GUID_ESCAPE_PREFIX { $$ = sa_strdup(SA, "guid"); }
 ;
 
 lngval:
@@ -6261,7 +6264,7 @@ XML_aggregate:
 odbc_date_escape:
     '{' DATE_ESCAPE_PREFIX string '}'
         {
-            symbol* node = makeAtomNode(m, "date", $3, 0, 0);
+            symbol* node = makeAtomNode(m, "date", $3, 0, 0, false);
             if (node == NULL)
                 YYABORT;
             $$ = node;
@@ -6272,7 +6275,7 @@ odbc_time_escape:
     '{' TIME_ESCAPE_PREFIX string '}'
         {
             unsigned int pr = get_time_precision($3) + 1;
-            symbol* node = makeAtomNode(m, "time", $3, pr, 0);
+            symbol* node = makeAtomNode(m, "time", $3, pr, 0, false);
             if (node == NULL)
                 YYABORT;
             $$ = node;
@@ -6284,7 +6287,17 @@ odbc_timestamp_escape:
         {
             unsigned int pr = get_timestamp_precision($3);
             pr = pr ? (pr + 1) : (pr + 6);
-            symbol* node = makeAtomNode(m, "timestamp", $3, pr, 0);
+            symbol* node = makeAtomNode(m, "timestamp", $3, pr, 0, false);
+            if (node == NULL)
+                YYABORT;
+            $$ = node;
+        }
+    ;
+
+odbc_guid_escape:
+    '{' GUID_ESCAPE_PREFIX string '}'
+        {
+            symbol* node = makeAtomNode(m, "uuid", $3, 0, 0, true);
             if (node == NULL)
                 YYABORT;
             $$ = node;
@@ -6294,12 +6307,22 @@ odbc_timestamp_escape:
 %%
 
 static inline symbol*
-makeAtomNode(mvc *m, const char* type, const char* val, unsigned int digits, 
unsigned int scale) {
-    sql_subtype t;
+makeAtomNode(mvc *m, const char* typename, const char* val, unsigned int 
digits, unsigned int scale, bool bind) {
+    sql_subtype sub_t;
     atom *a;
-    int r = sql_find_subtype(&t, type, digits, scale);
-    if (!r || (a = atom_general(m->sa, &t, val)) == NULL) {
-        sqlformaterror(m, SQLSTATE(22007) "Incorrect %s value (%s)", type, 
val);
+    int r;
+    if (bind) {
+        sql_type* t = NULL;
+        if (!(t = mvc_bind_type(m, typename))) {
+            sqlformaterror(m, SQLSTATE(22000) "Type (%s) unknown", typename);
+            return NULL;
+        }
+        sql_init_subtype(&sub_t, t, 0, 0);
+    } else {
+        r = sql_find_subtype(&sub_t, typename, digits, scale);
+    }
+    if (!r || (a = atom_general(m->sa, &sub_t, val)) == NULL) {
+        sqlformaterror(m, SQLSTATE(22007) "Incorrect %s value (%s)", typename, 
val);
         return NULL;
     }
     return _newAtomNode(a);
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -524,6 +524,7 @@ scanner_init_keywords(void)
        failed += keywords_insert("d", DATE_ESCAPE_PREFIX);
        failed += keywords_insert("t", TIME_ESCAPE_PREFIX);
        failed += keywords_insert("ts", TIMESTAMP_ESCAPE_PREFIX);
+       failed += keywords_insert("guid", GUID_ESCAPE_PREFIX);
 
        return failed;
 }
diff --git a/sql/test/escape-sequences/Tests/literals.test 
b/sql/test/escape-sequences/Tests/literals.test
--- a/sql/test/escape-sequences/Tests/literals.test
+++ b/sql/test/escape-sequences/Tests/literals.test
@@ -8,11 +8,13 @@ select {t '12:15:31'}
 ----
 12:15:31
 
+# with precision
 query T rowsort
 select {t '12:15:31.073400'}
 ----
 12:15:31.073400
 
+# with precision
 query T rowsort
 select {ts '2022-02-17 02:08:12.345678'}
 ----
@@ -22,3 +24,8 @@ query T rowsort
 select {ts '2022-02-17 02:08:12'}
 ----
 2022-02-17 02:08:12
+
+query T rowsort
+select {guid 'e751f9e0-2cee-4eca-b0c2-1cf108cebd18'}
+----
+e751f9e0-2cee-4eca-b0c2-1cf108cebd18
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to