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

escape time


diffs (133 lines):

diff --git a/sql/server/sql_datetime.c b/sql/server/sql_datetime.c
--- a/sql/server/sql_datetime.c
+++ b/sql/server/sql_datetime.c
@@ -394,3 +394,36 @@ int digits2ek( int digits)
                ek = isec;
        return ek;
 }
+
+
+int
+parse_time(const char* val, unsigned int* hr, unsigned int* mn, unsigned int* 
sc, unsigned long* fr, unsigned int* pr)
+{
+       int n;
+       const char* p = val;
+       if (sscanf(p, "%u:%u:%u%n", hr, mn, sc, &n) >= 3) {
+               p += n;
+               if (*p == '.') {
+                       char* e;
+                       p++;
+                       *fr = strtoul(p, &e, 10);
+                       if (e > p)
+                               *pr = (unsigned int) (e - p);
+               }
+       }
+       return -1;
+}
+
+
+unsigned int
+time_precision(const char* val)
+{
+       unsigned int hr;
+       unsigned int mn;
+       unsigned int sc;
+       unsigned long fr;
+       unsigned int pr = 0;
+       parse_time(val, &hr, &mn, &sc, &fr, &pr);
+       return pr;
+}
+
diff --git a/sql/server/sql_datetime.h b/sql/server/sql_datetime.h
--- a/sql/server/sql_datetime.h
+++ b/sql/server/sql_datetime.h
@@ -53,5 +53,7 @@ char *datetime_field(itype field);
 int inttype2digits( int sk, int ek );
 int digits2sk( int digits);
 int digits2ek( int digits );
+int parse_time(const char* val, unsigned int* hr, unsigned int* mn, unsigned 
int* sc, unsigned long* fr, unsigned int* pr);
+unsigned int time_precision(const char* val);
 
 #endif /*_SQL_DATETIME_H_*/
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
@@ -381,6 +381,7 @@ int yydebug=1;
        XML_text
        XML_validate
     odbc_date_escape
+    odbc_time_escape
 
 %type <type>
        data_type
@@ -725,7 +726,7 @@ SQLCODE SQLERROR UNDER WHENEVER
 %token X_BODY 
 %token MAX_MEMORY MAX_WORKERS OPTIMIZER
 /* escape sequence tokens */
-%token<sval> DATE_ESCAPE_PREFIX
+%token<sval> DATE_ESCAPE_PREFIX TIME_ESCAPE_PREFIX
 %%
 
 sqlstmt:
@@ -4862,6 +4863,7 @@ literal:
                  } else {
                        $$ = _newAtomNode(a);
                } }
+ |  odbc_time_escape
  |  TIMESTAMP timestamp_precision tz string
                { sql_subtype t;
                  atom *a;
@@ -5570,6 +5572,7 @@ non_reserved_word:
 
 /* escape sequence non reserved words */
 | DATE_ESCAPE_PREFIX { $$ = sa_strdup(SA, "d"); }
+| TIME_ESCAPE_PREFIX { $$ = sa_strdup(SA, "t"); }
 ;
 
 lngval:
@@ -6262,6 +6265,17 @@ odbc_date_escape:
         }
     ;
 
+odbc_time_escape:
+    '{' TIME_ESCAPE_PREFIX string '}'
+        {
+            unsigned int pr = time_precision($3) + 1;
+            symbol* node = makeAtomNode(m, "time", $3, pr, 0);
+            if (node == NULL)
+                YYABORT;
+            $$ = node;
+        }
+    ;
+
 %%
 
 static inline symbol*
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
@@ -522,6 +522,7 @@ scanner_init_keywords(void)
        failed += keywords_insert("GEOMETRYCOLLECTIONZM", GEOMETRYSUBTYPE);
        // escape sequence keywords
        failed += keywords_insert("d", DATE_ESCAPE_PREFIX);
+       failed += keywords_insert("t", TIME_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
@@ -2,3 +2,13 @@ query T rowsort
 select {d '2022-10-31'}
 ----
 2022-10-31
+
+query T rowsort
+select {t '12:15:31'}
+----
+12:15:31
+
+query T rowsort
+select {t '12:15:31.073400'}
+----
+12:15:31.073400
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to