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]