Changeset: b43718b0cfe2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b43718b0cfe2
Modified Files:
        clients/odbc/driver/SQLGetInfo.c
        sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
Branch: default
Log Message:

Update the returned ODBC SQLGetInfo() on SQL_TIMEDATE_ADD_INTERVALS, 
SQL_TIMEDATE_DIFF_INTERVALS and SQL_TIMEDATE_FUNCTIONS.
With the implementation of the ODBC escape sequences in the parser in servers 
11.46 and higher, more functions are now supported.

Also extended tests for these new functions.
This now reports that some functions do not work correctly and return wrong 
results:
timestampadd(SQL_TSI_SECOND, 11, timestamp'2022-11-14 14:13:12') adds msec 
instead of seconds
timestampadd(SQL_TSI_SECOND, 11.234, timestamp'2022-11-14 14:13:12') is not 
accepted. The second argument must be an integer, not a decimal. It also may 
not be an expression. Would be nice if expressions were allowed.
timestampadd(SQL_TSI_DAY, 28, timestamp'2022-11-14 14:13:12') instead of adding 
it seems to subtract days, strange behavior.
timestampadd(SQL_TSI_WEEK, 4, timestamp'2022-11-14 14:13:12') instead of adding 
4 weeks (or 28 days) it seems to subtract days, strange behavior.
timestampadd(SQL_TSI_YEAR, 5, timestamp'2022-11-14 14:13:12') instead of 5 year 
it adds 15 years!
Also timestampadd(SQL_TSI_FRAC_SECOND, 123, timestamp'2022-11-14 14:13:12') 
does not seem to be implemented. It returns a syntax error.


diffs (truncated from 384 to 300 lines):

diff --git a/clients/odbc/driver/SQLGetInfo.c b/clients/odbc/driver/SQLGetInfo.c
--- a/clients/odbc/driver/SQLGetInfo.c
+++ b/clients/odbc/driver/SQLGetInfo.c
@@ -1037,15 +1037,16 @@ MNDBGetInfo(ODBCDbc *dbc,
                break;
        case SQL_TIMEDATE_ADD_INTERVALS:
        case SQL_TIMEDATE_DIFF_INTERVALS:
-               /* SQL_FN_TSI_FRAC_SECOND |
-                * SQL_FN_TSI_SECOND |
-                * SQL_FN_TSI_MINUTE |
-                * SQL_FN_TSI_HOUR |
-                * SQL_FN_TSI_DAY |
-                * SQL_FN_TSI_WEEK |
-                * SQL_FN_TSI_MONTH |
-                * SQL_FN_TSI_QUARTER |
-                * SQL_FN_TSI_YEAR */
+               /* when server is 11.46 or higher */
+               nValue = SQL_FN_TSI_SECOND |
+                       SQL_FN_TSI_MINUTE |
+                       SQL_FN_TSI_HOUR |
+                       SQL_FN_TSI_DAY |
+                       SQL_FN_TSI_WEEK |
+                       SQL_FN_TSI_MONTH |
+                       SQL_FN_TSI_QUARTER |
+                       SQL_FN_TSI_YEAR;
+               /* SQL_FN_TSI_FRAC_SECOND | */
                break;
        case SQL_TIMEDATE_FUNCTIONS:
                nValue = SQL_FN_TD_CURRENT_DATE |
@@ -1053,7 +1054,7 @@ MNDBGetInfo(ODBCDbc *dbc,
                        SQL_FN_TD_CURRENT_TIMESTAMP |
                        SQL_FN_TD_CURDATE |
                        SQL_FN_TD_CURTIME |
-                       /* SQL_FN_TD_DAYNAME | */
+                       SQL_FN_TD_DAYNAME |     /* when server is 11.46 or 
higher */
                        SQL_FN_TD_DAYOFMONTH |
                        SQL_FN_TD_DAYOFWEEK |
                        SQL_FN_TD_DAYOFYEAR |
@@ -1061,12 +1062,12 @@ MNDBGetInfo(ODBCDbc *dbc,
                        SQL_FN_TD_HOUR |
                        SQL_FN_TD_MINUTE |
                        SQL_FN_TD_MONTH |
-                       /* SQL_FN_TD_MONTHNAME | */
+                       SQL_FN_TD_MONTHNAME |   /* when server is 11.46 or 
higher */
                        SQL_FN_TD_NOW |
                        SQL_FN_TD_QUARTER |
                        SQL_FN_TD_SECOND |
-                       /* SQL_FN_TD_TIMESTAMPADD | */
-                       /* SQL_FN_TD_TIMESTAMPDIFF | */
+                       SQL_FN_TD_TIMESTAMPADD |        /* when server is 11.46 
or higher */
+                       SQL_FN_TD_TIMESTAMPDIFF |       /* when server is 11.46 
or higher */
                        SQL_FN_TD_WEEK |
                        SQL_FN_TD_YEAR;
                break;
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
@@ -1,3 +1,8 @@
+query I rowsort
+select { fn current_date() } > date'2023-01-02'
+----
+1
+
 query I rowsort
 select length((select { fn current_date() })) > 0
 ----
@@ -9,6 +14,11 @@ select length((select { fn curdate() }))
 1
 
 query I rowsort
+select { fn current_time() } >= time'00:00:00'
+----
+1
+
+query I rowsort
 select length(cast((select { fn current_time() }) as varchar(100))) > 0
 ----
 1
@@ -18,42 +28,137 @@ select length(cast((select { fn curtime(
 ----
 1
 
+query I rowsort
+select { fn current_timestamp() } > timestamp'2023-01-02 00:00:00'
+----
+1
+
+query I rowsort
+select length(cast((select { fn current_timestamp() }) as varchar(100))) > 0
+----
+1
+
 query T rowsort
-select { fn dayname('2022-11-11') }
+select { fn dayname(date'2022-11-11') }
 ----
 Friday
 
 query I rowsort
-select { fn dayofmonth('2022-11-11') }
+select { fn dayofmonth(date'2022-11-11') }
 ----
 11
 
 query I rowsort
-select { fn dayofweek('2022-11-11') }
+select { fn dayofweek(date'2022-11-11') }
 ----
 5
 
 query I rowsort
-select { fn dayofyear('2022-01-01') }
+select { fn dayofyear(date'2022-01-31') }
+----
+31
+
+query I rowsort
+select { fn extract(day from date'2022-01-02') }
+----
+2
+
+query I rowsort
+select { fn extract(month from date'2022-07-02') }
+----
+7
+
+query I rowsort
+select { fn extract(year from date'2023-01-02') }
 ----
-1
+2023
+
+query I rowsort
+select { fn extract(week from date'2023-10-02') }
+----
+40
+
+query I rowsort
+select { fn extract(quarter from date'2023-07-02') }
+----
+3
+
+query I rowsort
+select { fn extract(hour from time'15:45:59') }
+----
+15
+
+query I rowsort
+select { fn extract(minute from time'15:45:59') }
+----
+45
 
 query I rowsort
-select { fn extract(day from date'2022-01-01') }
+select { fn extract(second from time'15:45:59') }
+----
+59
+
+query I rowsort
+select { fn extract(day from timestamp'2022-01-02 15:45:59') }
+----
+2
+
+query I rowsort
+select { fn extract(month from timestamp'2022-07-02 15:45:59') }
+----
+7
+
+query I rowsort
+select { fn extract(year from timestamp'2022-01-02 15:45:59') }
+----
+2022
+
+query I rowsort
+select { fn extract(week from timestamp'2023-10-02') }
 ----
-1
+40
+
+query I rowsort
+select { fn extract(quarter from timestamp'2022-12-02 15:45:59') }
+----
+4
+
+query I rowsort
+select { fn extract(hour from timestamp'2022-01-02 15:45:59') }
+----
+15
+
+query I rowsort
+select { fn extract(minute from timestamp'2022-01-02 15:45:59') }
+----
+45
+
+query I rowsort
+select { fn extract(second from timestamp'2022-01-02 15:45:59') }
+----
+59
 
 query T rowsort
 select { fn hour(time'12:00:00') }
 ----
 12
 
+query T rowsort
+select { fn hour(timestamp'2022-01-02 15:45:59') }
+----
+15
+
 query I rowsort
 select { fn minute(time'12:15:00') }
 ----
 15
 
 query I rowsort
+select { fn minute(timestamp'2022-01-02 15:45:59') }
+----
+45
+
+query I rowsort
 select { fn month(date'2022-11-14') }
 ----
 11
@@ -64,6 +169,11 @@ select { fn monthname(date'2022-11-14') 
 November
 
 query I rowsort
+select {fn now()} > timestamp'2022-01-02 15:45:59'
+----
+1
+
+query I rowsort
 select length(cast((select { fn now() }) as varchar(100))) > 0
 ----
 1
@@ -74,23 +184,24 @@ select { fn quarter(date'2022-11-14') }
 4
 
 query I rowsort
+select { fn quarter(timestamp'2022-06-02 15:45:59') }
+----
+2
+
+query I rowsort
 select { fn second(time'12:30:33') }
 ----
 33
 
-
-# TODO not implemented
-# query T rowsort
-# select { fn timestampadd(hour, 1, timestamp'2022-11-14 09:26:30') }
-# ----
-# 2022-11-14 10:26:30
+query I rowsort
+select { fn second(timestamp'2022-01-02 15:45:59') }
+----
+59
 
-
-# TODO not implemented
-# query I rowsort
-# select { fn timestampdiff(hour, timestamp'2022-11-14 10:26:30', 
timestamp'2022-11-14 09:26:30') }
-# ----
-# 1
+query I rowsort
+select { fn second(timestamp'2022-11-14 12:30:34') }
+----
+34
 
 query I rowsort
 select { fn week(date'2022-11-14') }
@@ -98,14 +209,32 @@ select { fn week(date'2022-11-14') }
 46
 
 query I rowsort
+select { fn week(timestamp'2022-11-14 12:30:34') }
+----
+46
+
+query I rowsort
 select { fn year(date'2022-11-14') }
 ----
 2022
 
+query I rowsort
+select { fn year(timestamp'2222-11-14 12:30:34') }
+----
+2222
+
+# timestampadd() tests
+
+# TODO not implemented
+# query T rowsort
+# select { fn timestampadd(hour, 10, timestamp'2022-11-14 09:26:30') }
+# ----
+# 2022-11-14 10:26:30
+
 query T rowsort
-select { fn timestampadd(SQL_TSI_HOUR, 1, timestamp'2022-11-14 12:12:12') }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to