Changeset: fac694788097 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fac694788097
Modified Files:
        sql/common/sql_types.c
        sql/server/sql_parser.y
        sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
Branch: escape-sequences
Log Message:

got timestampdiff all wrong


diffs (80 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1323,6 +1323,8 @@ sqltypeinit( sql_allocator *sa)
        sql_create_func(sa, "sql_sub", "mtime", "diff", FALSE, FALSE, 
SCALE_FIX, 0, SECINT, 2, TME, TME);
        sql_create_func(sa, "sql_sub", "mtime", "diff", FALSE, FALSE, 
SCALE_NONE, 0, SECINT, 2, TMESTAMPTZ, TMESTAMPTZ);
        sql_create_func(sa, "sql_sub", "mtime", "diff", FALSE, FALSE, 
SCALE_FIX, 0, SECINT, 2, TMESTAMP, TMESTAMP);
+       sql_create_func(sa, "timestampdiff", "mtime", "diff", FALSE, FALSE, 
SCALE_NONE, 0, SECINT, 2, TMESTAMPTZ, TMESTAMPTZ);
+       sql_create_func(sa, "timestampdiff", "mtime", "diff", FALSE, FALSE, 
SCALE_FIX, 0, SECINT, 2, TMESTAMP, TMESTAMP);
 
        sql_create_func(sa, "sql_sub", "mtime", "date_sub_msec_interval", 
FALSE, FALSE, SCALE_NONE, 0, DTE, 2, DTE, SECINT);
        sql_create_func(sa, "sql_sub", "mtime", "date_sub_msec_interval", 
FALSE, FALSE, SCALE_NONE, 0, DTE, 2, DTE, DAYINT);
@@ -1360,12 +1362,8 @@ sqltypeinit( sql_allocator *sa)
        sql_create_func(sa, "timestampadd", "mtime", 
"odbc_timestamp_add_month_time", FALSE, FALSE, SCALE_NONE, 0, TMESTAMP, 2, TME, 
MONINT);
        sql_create_func(sa, "timestampadd", "mtime", 
"odbc_timestamp_add_msec_date", FALSE, FALSE, SCALE_NONE, 0, TMESTAMP, 2, DTE, 
SECINT);
        // odbc timestampdiff
-       sql_create_func(sa, "timestampdiff", "mtime", 
"timestamp_sub_msec_interval", FALSE, FALSE, SCALE_NONE, 0, TMESTAMP, 2, 
TMESTAMP, SECINT);
-       sql_create_func(sa, "timestampdiff", "mtime", 
"timestamp_sub_msec_interval", FALSE, FALSE, SCALE_NONE, 0, TMESTAMP, 2, 
TMESTAMP, DAYINT);
-       sql_create_func(sa, "timestampdiff", "mtime", 
"timestamp_sub_month_interval", FALSE, FALSE, SCALE_NONE, 0, TMESTAMP, 2, 
TMESTAMP, MONINT);
-       sql_create_func(sa, "timestampdiff", "mtime", 
"timestamp_sub_msec_interval", FALSE, FALSE, SCALE_NONE, 0, TMESTAMPTZ, 2, 
TMESTAMPTZ, SECINT);
-       sql_create_func(sa, "timestampdiff", "mtime", 
"timestamp_sub_msec_interval", FALSE, FALSE, SCALE_NONE, 0, TMESTAMPTZ, 2, 
TMESTAMPTZ, DAYINT);
-       sql_create_func(sa, "timestampdiff", "mtime", 
"timestamp_sub_month_interval", FALSE, FALSE, SCALE_NONE, 0, TMESTAMPTZ, 2, 
TMESTAMPTZ, MONINT);
+       sql_create_func(sa, "odbc_timestampdiff_sec", "mtime", "diff", FALSE, 
FALSE, SCALE_NONE, 0, SECINT, 2, TMESTAMPTZ, TMESTAMPTZ);
+       sql_create_func(sa, "odbc_timestampdiff_sec", "mtime", "diff", FALSE, 
FALSE, SCALE_FIX, 0, SECINT, 2, TMESTAMP, TMESTAMP);
        // TODO corner cases as described in microsoft odbc timestampdiff spec
 
        // end odbc
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
@@ -6485,19 +6485,24 @@ odbc_datetime_func:
           append_symbol(l, _newAtomNode(atom_int(SA, &t, i)));
           $$ = _symbol_create_list( SQL_BINOP, l ); 
                }
-    | TIMESTAMPDIFF '(' odbc_tsi_qualifier ',' intval ',' search_condition ')'
+    | TIMESTAMPDIFF '(' odbc_tsi_qualifier ',' search_condition ',' 
search_condition ')'
                { dlist *l = L(); 
-                 append_list( l, append_string(L(), sa_strdup(SA, 
"timestampdiff")));
+          switch($3) {
+            // TODO implement other cases
+            case iyear:
+            case iquarter:
+            case imonth:
+            case iweek:
+            case iday:
+            case ihour:
+            case imin:
+            case isec:
+            default:
+                       append_list( l, append_string(L(), sa_strdup(SA, 
"odbc_timestampdiff_sec")));
+          }
              append_int(l, FALSE); /* ignore distinct */
-          sql_subtype t; 
-                 lng i = 0;
-          if (process_odbc_interval(m, $3, $5, &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, $5);
           $$ = _symbol_create_list( SQL_BINOP, l ); 
                }
 ;
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
@@ -108,9 +108,9 @@ select { fn timestampadd(SQL_TSI_HOUR, 1
 2022-11-14 13:12:12
 
 query T rowsort
-select { fn timestampdiff(SQL_TSI_HOUR, 1, timestamp'2022-11-14 12:12:12') }
+select { fn timestampdiff(SQL_TSI_SECOND, timestamp'2022-12-12 12:00:00', 
timestamp'2022-12-12 12:00:30') }
 ----
-2022-11-14 11:12:12
+0:00:30
 
 # corner cases
 query T rowsort
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to