Changeset: eee0efffd847 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/eee0efffd847
Modified Files:
        sql/backends/monet5/vaults/odbc/odbc_loader.c
        sql/test/proto_loader/odbc/Tests/monetodbc_datatypes.test
Branch: Mar2025
Log Message:

Add tests for all interval variants.
Condensed the code for reading the interval data.


diffs (truncated from 409 to 300 lines):

diff --git a/sql/backends/monet5/vaults/odbc/odbc_loader.c 
b/sql/backends/monet5/vaults/odbc/odbc_loader.c
--- a/sql/backends/monet5/vaults/odbc/odbc_loader.c
+++ b/sql/backends/monet5/vaults/odbc/odbc_loader.c
@@ -1036,28 +1036,24 @@ odbc_query(int caller, mvc *sql, sql_sub
                                                                break;
                                                        }
                                                        case SQL_INTERVAL_YEAR:
-                                                       {
-                                                               int_val = (int) 
itv_val.intval.year_month.year *12;
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       int_val 
= -int_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %d\n", row, col+1, int_val);
-                                                               gdkret = 
BUNappend(b, (void *) &int_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_YEAR_TO_MONTH:
-                                                       {
-                                                               int_val = (int) 
(itv_val.intval.year_month.year *12) + itv_val.intval.year_month.month;
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       int_val 
= -int_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %d\n", row, col+1, int_val);
-                                                               gdkret = 
BUNappend(b, (void *) &int_val, false);
-                                                               break;
-                                                       }
                                                        case SQL_INTERVAL_MONTH:
                                                        {
-                                                               int_val = (int) 
itv_val.intval.year_month.month;
+                                                               switch 
(itv_val.interval_type) {
+                                                               case 
SQL_IS_YEAR:
+                                                                       int_val 
= (int) itv_val.intval.year_month.year *12;
+                                                                       break;
+                                                               case 
SQL_IS_YEAR_TO_MONTH:
+                                                                       int_val 
= (int) (itv_val.intval.year_month.year *12)
+                                                                               
+ itv_val.intval.year_month.month;
+                                                                       break;
+                                                               case 
SQL_IS_MONTH:
+                                                                       int_val 
= (int) itv_val.intval.year_month.month;
+                                                                       break;
+                                                               default:
+                                                                       int_val 
= 0;
+                                                               }
+
                                                                if 
(itv_val.interval_sign == SQL_TRUE)
                                                                        int_val 
= -int_val;
                                                                if 
(trace_enabled)
@@ -1066,112 +1062,65 @@ odbc_query(int caller, mvc *sql, sql_sub
                                                                break;
                                                        }
                                                        case SQL_INTERVAL_DAY:
-                                                       {
-                                                               lng_val = (lng) 
itv_val.intval.day_second.day * (24*60*60*1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case SQL_INTERVAL_HOUR:
-                                                       {
-                                                               lng_val = (lng) 
itv_val.intval.day_second.hour * (60*60*1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_MINUTE:
-                                                       {
-                                                               lng_val = (lng) 
itv_val.intval.day_second.minute * (60*1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_SECOND:
-                                                       {
-                                                               lng_val = (lng) 
(itv_val.intval.day_second.second * 1000)
-                                                                       + 
(itv_val.intval.day_second.fraction / 1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_DAY_TO_HOUR:
-                                                       {
-                                                               lng_val = (lng) 
((itv_val.intval.day_second.day *24)
-                                                                       + 
itv_val.intval.day_second.hour) * (60*60*1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_DAY_TO_MINUTE:
-                                                       {
-                                                               lng_val = (lng) 
((((itv_val.intval.day_second.day *24)
-                                                                       + 
itv_val.intval.day_second.hour) *60)
-                                                                       + 
itv_val.intval.day_second.minute) * (60*1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_DAY_TO_SECOND:
-                                                       {
-                                                               lng_val = (lng) 
(((((((itv_val.intval.day_second.day *24)
-                                                                       + 
itv_val.intval.day_second.hour) *60)
-                                                                       + 
itv_val.intval.day_second.minute) *60)
-                                                                       + 
itv_val.intval.day_second.second) *1000)
-                                                                       + 
(itv_val.intval.day_second.fraction / 1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_HOUR_TO_MINUTE:
-                                                       {
-                                                               lng_val = (lng) 
((itv_val.intval.day_second.hour *60)
-                                                                       + 
itv_val.intval.day_second.minute) * (60*1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_HOUR_TO_SECOND:
-                                                       {
-                                                               lng_val = (lng) 
(((((itv_val.intval.day_second.hour *60)
-                                                                       + 
itv_val.intval.day_second.minute) *60)
-                                                                       + 
itv_val.intval.day_second.second) *1000)
-                                                                       + 
(itv_val.intval.day_second.fraction / 1000);
-                                                               if 
(itv_val.interval_sign == SQL_TRUE)
-                                                                       lng_val 
= -lng_val;
-                                                               if 
(trace_enabled)
-                                                                       
printf("Data row %lu col %u: %" PRId64 "\n", row, col+1, lng_val);
-                                                               gdkret = 
BUNappend(b, (void *) &lng_val, false);
-                                                               break;
-                                                       }
                                                        case 
SQL_INTERVAL_MINUTE_TO_SECOND:
                                                        {
-                                                               lng_val = (lng) 
(((itv_val.intval.day_second.minute *60)
-                                                                       + 
itv_val.intval.day_second.second) *1000)
-                                                                       + 
(itv_val.intval.day_second.fraction / 1000);
+                                                               switch 
(itv_val.interval_type) {
+                                                               case SQL_IS_DAY:
+                                                                       lng_val 
= (lng) itv_val.intval.day_second.day * (24*60*60*1000);
+                                                                       break;
+                                                               case 
SQL_IS_HOUR:
+                                                                       lng_val 
= (lng) itv_val.intval.day_second.hour * (60*60*1000);
+                                                                       break;
+                                                               case 
SQL_IS_MINUTE:
+                                                                       lng_val 
= (lng) itv_val.intval.day_second.minute * (60*1000);
+                                                                       break;
+                                                               case 
SQL_IS_SECOND:
+                                                                       lng_val 
= (lng) (itv_val.intval.day_second.second * 1000)
+                                                                               
+ (itv_val.intval.day_second.fraction / 1000);
+                                                                       break;
+                                                               case 
SQL_IS_DAY_TO_HOUR:
+                                                                       lng_val 
= (lng) ((itv_val.intval.day_second.day *24)
+                                                                               
+ itv_val.intval.day_second.hour) * (60*60*1000);
+                                                                       break;
+                                                               case 
SQL_IS_DAY_TO_MINUTE:
+                                                                       lng_val 
= (lng) ((((itv_val.intval.day_second.day *24)
+                                                                               
+ itv_val.intval.day_second.hour) *60)
+                                                                               
+ itv_val.intval.day_second.minute) * (60*1000);
+                                                                       break;
+                                                               case 
SQL_IS_DAY_TO_SECOND:
+                                                                       lng_val 
= (lng) (((((((itv_val.intval.day_second.day *24)
+                                                                               
+ itv_val.intval.day_second.hour) *60)
+                                                                               
+ itv_val.intval.day_second.minute) *60)
+                                                                               
+ itv_val.intval.day_second.second) *1000)
+                                                                               
+ (itv_val.intval.day_second.fraction / 1000);
+                                                                       break;
+                                                               case 
SQL_IS_HOUR_TO_MINUTE:
+                                                                       lng_val 
= (lng) ((itv_val.intval.day_second.hour *60)
+                                                                               
+ itv_val.intval.day_second.minute) * (60*1000);
+                                                                       break;
+                                                               case 
SQL_IS_HOUR_TO_SECOND:
+                                                                       lng_val 
= (lng) (((((itv_val.intval.day_second.hour *60)
+                                                                               
+ itv_val.intval.day_second.minute) *60)
+                                                                               
+ itv_val.intval.day_second.second) *1000)
+                                                                               
+ (itv_val.intval.day_second.fraction / 1000);
+                                                                       break;
+                                                               case 
SQL_IS_MINUTE_TO_SECOND:
+                                                                       lng_val 
= (lng) (((itv_val.intval.day_second.minute *60)
+                                                                               
+ itv_val.intval.day_second.second) *1000)
+                                                                               
+ (itv_val.intval.day_second.fraction / 1000);
+                                                                       break;
+                                                               default:
+                                                                       lng_val 
= 0;
+                                                               }
+
                                                                if 
(itv_val.interval_sign == SQL_TRUE)
                                                                        lng_val 
= -lng_val;
                                                                if 
(trace_enabled)
diff --git a/sql/test/proto_loader/odbc/Tests/monetodbc_datatypes.test 
b/sql/test/proto_loader/odbc/Tests/monetodbc_datatypes.test
--- a/sql/test/proto_loader/odbc/Tests/monetodbc_datatypes.test
+++ b/sql/test/proto_loader/odbc/Tests/monetodbc_datatypes.test
@@ -232,7 +232,39 @@ 66
 0
 NULL
 
-query TTTT
+query IIII
+select cast('12-6' as interval year to month) as val1, cast('-19-11' as 
interval year to month) as val2, cast('0-0' as interval year to month) as val0, 
cast(NULL as interval year to month) as valnil
+----
+150
+-239
+0
+NULL
+
+query IIII
+select * from 'odbc:DSN=MonetDB-Test;QUERY=select cast(''12-6'' as interval 
year to month) as val1, cast(''-19-11'' as interval year to month) as val2, 
cast(''0-0'' as interval year to month) as val0, cast(NULL as interval year to 
month) as valnil'
+----
+150
+-239
+0
+NULL
+
+query IIII
+select cast('66' as interval year) as val1, cast('-66' as interval year) as 
val2, cast('0' as interval year) as val0, cast(NULL as interval year) as valnil
+----
+792
+-792
+0
+NULL
+
+query IIII
+select * from 'odbc:DSN=MonetDB-Test;QUERY=select cast(''66'' as interval 
year) as val1, cast(''-66'' as interval year) as val2, cast(''0'' as interval 
year) as val0, cast(NULL as interval year) as valnil'
+----
+792
+-792
+0
+NULL
+
+query IIII
 select cast('32' as interval day) as val1, cast('-32' as interval day) as 
val2, cast('0' as interval day) as val0, cast(NULL as interval day) as valnil
 ----
 32
@@ -240,7 +272,7 @@ 32
 0
 NULL
 
-query TTTT
+query IIII
 select * from 'odbc:DSN=MonetDB-Test;QUERY=select cast(''32'' as interval day) 
as val1, cast(''-32'' as interval day) as val2, cast(''0'' as interval day) as 
val0, cast(NULL as interval day) as valnil'
 ----
 32
@@ -248,13 +280,45 @@ 32
 0
 NULL
 
-query TT
+query II
 select * from 'odbc:DSN=MonetDB-Test;QUERY=select cast(''99'' as interval day) 
as val1, cast(''-99'' as interval day) as val2'
 ----
 99
 -99
 
 query TTTT
+select cast('32' as interval hour) as val1, cast('-32' as interval hour) as 
val2, cast('0' as interval hour) as val0, cast(NULL as interval hour) as valnil
+----
+1 day, 8:00:00
+-2 days, 16:00:00
+0:00:00
+NULL
+
+query TTTT
+select * from 'odbc:DSN=MonetDB-Test;QUERY=select cast(''32'' as interval 
hour) as val1, cast(''-32'' as interval hour) as val2, cast(''0'' as interval 
hour) as val0, cast(NULL as interval hour) as valnil'
+----
+1 day, 8:00:00
+-2 days, 16:00:00
+0:00:00
+NULL
+
+query TTTT
+select cast('92' as interval minute) as val1, cast('-92' as interval minute) 
as val2, cast('0' as interval minute) as val0, cast(NULL as interval minute) as 
valnil
+----
+1:32:00
+-1 day, 22:28:00
+0:00:00
+NULL
+
+query TTTT
+select * from 'odbc:DSN=MonetDB-Test;QUERY=select cast(''92'' as interval 
minute) as val1, cast(''-92'' as interval minute) as val2, cast(''0'' as 
interval minute) as val0, cast(NULL as interval minute) as valnil'
+----
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to