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 -- [email protected]
To unsubscribe send an email to [email protected]