Changeset: 7f1f59f5f74c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7f1f59f5f74c
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 timestamp


diffs (196 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
@@ -397,7 +397,12 @@ 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)
+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;
@@ -415,8 +420,35 @@ parse_time(const char* val, unsigned int
 }
 
 
+int
+parse_timestamp(const char* val,
+               unsigned int* yr,
+               unsigned int* mt,
+               unsigned int* dy,
+               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 %u:%u:%u%n",
+                               yr, mt, dy, hr, mn, sc, &n) >= 6) {
+               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)
+get_time_precision(const char* val)
 {
        unsigned int hr;
        unsigned int mn;
@@ -427,3 +459,17 @@ time_precision(const char* val)
        return pr;
 }
 
+unsigned int
+get_timestamp_precision(const char* val)
+{
+       unsigned int yr;
+       unsigned int mt;
+       unsigned int dy;
+       unsigned int hr;
+       unsigned int mn;
+       unsigned int sc;
+       unsigned long fr;
+       unsigned int pr = 0;
+       parse_timestamp(val, &yr, &mt, &dy, &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,7 +53,26 @@ 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);
+int
+parse_time(const char* val,
+               unsigned int* hr,
+               unsigned int* mn,
+               unsigned int* sc,
+               unsigned long* fr,
+               unsigned int* pr);
+unsigned int
+get_time_precision(const char* val);
+int
+parse_timestamp(const char* val,
+               unsigned int* yr,
+               unsigned int* mt,
+               unsigned int* dy,
+               unsigned int* hr,
+               unsigned int* mn,
+               unsigned int* sc,
+               unsigned long* fr,
+               unsigned int* pr);
+unsigned int
+get_timestamp_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
@@ -382,6 +382,7 @@ int yydebug=1;
        XML_validate
     odbc_date_escape
     odbc_time_escape
+    odbc_timestamp_escape
 
 %type <type>
        data_type
@@ -726,7 +727,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
+%token<sval> DATE_ESCAPE_PREFIX TIME_ESCAPE_PREFIX TIMESTAMP_ESCAPE_PREFIX
 %%
 
 sqlstmt:
@@ -4877,6 +4878,7 @@ literal:
                  } else {
                        $$ = _newAtomNode(a);
                } }
+ |  odbc_timestamp_escape
  |  interval_expression
  |  blob string
                { sql_subtype t;
@@ -5573,6 +5575,7 @@ non_reserved_word:
 /* escape sequence non reserved words */
 | DATE_ESCAPE_PREFIX { $$ = sa_strdup(SA, "d"); }
 | TIME_ESCAPE_PREFIX { $$ = sa_strdup(SA, "t"); }
+| TIMESTAMP_ESCAPE_PREFIX { $$ = sa_strdup(SA, "ts"); }
 ;
 
 lngval:
@@ -6268,7 +6271,7 @@ odbc_date_escape:
 odbc_time_escape:
     '{' TIME_ESCAPE_PREFIX string '}'
         {
-            unsigned int pr = time_precision($3) + 1;
+            unsigned int pr = get_time_precision($3) + 1;
             symbol* node = makeAtomNode(m, "time", $3, pr, 0);
             if (node == NULL)
                 YYABORT;
@@ -6276,6 +6279,18 @@ odbc_time_escape:
         }
     ;
 
+odbc_timestamp_escape:
+    '{' TIMESTAMP_ESCAPE_PREFIX string '}'
+        {
+            unsigned int pr = get_timestamp_precision($3);
+            pr = pr ? (pr + 1) : (pr + 6);
+            symbol* node = makeAtomNode(m, "timestamp", $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
@@ -523,6 +523,7 @@ scanner_init_keywords(void)
        // escape sequence keywords
        failed += keywords_insert("d", DATE_ESCAPE_PREFIX);
        failed += keywords_insert("t", TIME_ESCAPE_PREFIX);
+       failed += keywords_insert("ts", TIMESTAMP_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
@@ -12,3 +12,13 @@ query T rowsort
 select {t '12:15:31.073400'}
 ----
 12:15:31.073400
+
+query T rowsort
+select {ts '2022-02-17 02:08:12.345678'}
+----
+2022-02-17 02:08:12.345678
+
+query T rowsort
+select {ts '2022-02-17 02:08:12'}
+----
+2022-02-17 02:08:12
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to