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