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]
