Changeset: b12064d5209a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b12064d5209a
Branch: txtsim
Log Message:

merged with default


diffs (130 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
@@ -484,15 +484,15 @@ int
 process_odbc_interval(mvc *sql, itype interval, int val, sql_subtype *t, lng 
*i)
 {
        assert(sql);
-       int mul = 1;
+       lng mul = 1;
        int d = inttype2digits(interval, interval);
        switch (interval) {
                case iyear:
                        mul *= 12;
-                       /* fall through */
+                       break;
                case iquarter:
                        mul *= 3;
-                       /* fall through */
+                       break;
                case imonth:
                        break;
                case iweek:
@@ -505,9 +505,13 @@ process_odbc_interval(mvc *sql, itype in
                        mul *= 60;
                        /* fall through */
                case imin:
-                       mul *= 60000;
+                       mul *= 60;
                        /* fall through */
                case isec:
+                       mul *= 1000;
+                       break;
+               case insec:
+                       d = 5;
                        break;
                default:
                        snprintf(sql->errstr, ERRSIZE, _("Internal error: bad 
interval qualifier (%d)\n"), interval);
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
@@ -6481,19 +6481,26 @@ odbc_datetime_func:
           append_symbol(l, $3);
           $$ = _symbol_create_list( SQL_UNOP, l ); 
                }
-    | TIMESTAMPADD '(' odbc_tsi_qualifier ',' intval ',' search_condition ')'
+    | TIMESTAMPADD '(' odbc_tsi_qualifier ',' scalar_exp ',' search_condition 
')'
                { dlist *l = L(); 
                  append_list( l, append_string(L(), sa_strdup(SA, 
"timestampadd")));
              append_int(l, FALSE); /* ignore distinct */
           sql_subtype t; 
                  lng i = 0;
-          if (process_odbc_interval(m, $3, $5, &t, &i) < 0) {
+          if (process_odbc_interval(m, $3, 1, &t, &i) < 0) {
                    yyerror(m, "incorrect interval");
                        $$ = NULL;
                        YYABORT;
           }
           append_symbol(l, $7);
-          append_symbol(l, _newAtomNode(atom_int(SA, &t, i)));
+          append_symbol(l, _symbol_create_list( SQL_BINOP, 
+                 append_symbol(
+                   append_symbol(
+                     append_int(
+                       append_list(L(), append_string(L(), sa_strdup(SA, 
"sql_mul"))),
+                       FALSE), /* ignore distinct */
+                     _newAtomNode(atom_int(SA, &t, i))),
+                   $5)));
           $$ = _symbol_create_list( SQL_BINOP, l ); 
                }
     | TIMESTAMPDIFF '(' odbc_tsi_qualifier ',' search_condition ',' 
search_condition ')'
@@ -6655,7 +6662,9 @@ odbc_data_type:
 ;
 
 odbc_tsi_qualifier:
-    SQL_TSI_SECOND
+      SQL_TSI_FRAC_SECOND
+        { $$ = insec; }
+    | SQL_TSI_SECOND
         { $$ = isec; }
     | SQL_TSI_MINUTE
         { $$ = imin; }
diff --git 
a/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test 
b/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
--- a/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
+++ b/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
@@ -260,7 +260,7 @@ 2222
 query T rowsort
 select {fn timestampadd(SQL_TSI_HOUR, 10, {ts '2022-11-14 14:13:12.654321'}) }
 ----
-2022-11-15 00:13:12
+2022-11-15 00:13:12.654321
 
 # corner cases
 query T rowsort
@@ -273,27 +273,25 @@ select sql_sub({fn timestampadd(SQL_TSI_
 ----
 0:00:00
 
-# TODO Implement SQL_TSI_FRAC_SECOND option
-statement error 42000!syntax error in: "select { fn 
timestampadd(sql_tsi_frac_second"
+query T rowsort
 select { fn timestampadd(SQL_TSI_FRAC_SECOND, 123, timestamp'2022-11-14 
14:13:12') }
-# ----
-# 2022-11-14 14:13:12.123
+----
+2022-11-14 14:13:12.123000
 
 query T rowsort
 select { fn timestampadd(SQL_TSI_SECOND, 11, timestamp'2022-11-14 14:13:12') }
 ----
 2022-11-14 14:13:23
 
-statement error 42000!syntax error in: "select { fn 
timestampadd(sql_tsi_second, 11.234"
+query T rowsort
 select { fn timestampadd(SQL_TSI_SECOND, 11.234, timestamp'2022-11-14 
14:13:12') }
-# ----
-# 2022-11-14 14:13:23.234
+----
+2022-11-14 14:13:23.234000
 
-# TODO: add support for integer expression as second argument.
-statement error 42000!syntax error in: "select { fn 
timestampadd(sql_tsi_second, 15*"
+query T rowsort
 select { fn timestampadd(SQL_TSI_SECOND, 15*60, timestamp'2022-11-14 
14:13:12') }
-# ----
-# 2022-11-14 14:28:12
+----
+2022-11-14 14:28:12
 
 query T rowsort
 select { fn timestampadd(SQL_TSI_MINUTE, 12, timestamp'2022-11-14 14:13:12') }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to