Changeset: ef12a3f79179 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef12a3f79179
Modified Files:
monetdb5/modules/kernel/mmath.c
sql/backends/monet5/sql.c
sql/test/miscellaneous/Tests/simple_selects.sql
Branch: Nov2019
Log Message:
Look for NULL values while converting from and to interval types
diffs (120 lines):
diff --git a/monetdb5/modules/kernel/mmath.c b/monetdb5/modules/kernel/mmath.c
--- a/monetdb5/modules/kernel/mmath.c
+++ b/monetdb5/modules/kernel/mmath.c
@@ -308,4 +308,3 @@ MATHpi(dbl *pi)
*pi = 3.14159265358979323846;
return MAL_SUCCEED;
}
-
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -3515,6 +3515,10 @@ str
second_interval_2_daytime(daytime *res, const lng *s, const int *digits)
{
daytime d;
+ if (is_lng_nil(*s)) {
+ *res = daytime_nil;
+ return MAL_SUCCEED;
+ }
d = daytime_add_usec(daytime_create(0, 0, 0, 0), *s * 1000);
return daytime_2time_daytime(res, &d, digits);
}
@@ -3773,32 +3777,38 @@ str
month_interval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
int *ret = getArgReference_int(stk, pci, 0);
- int k = digits2ek(*getArgReference_int(stk, pci, 2));
- int r;
+ int k = digits2ek(*getArgReference_int(stk, pci, 2)), r = 0, isnil = 0;
(void) cntxt;
- (void) mb;
+ *ret = int_nil;
switch (getArgType(mb, pci, 1)) {
case TYPE_bte:
r = stk->stk[getArg(pci, 1)].val.btval;
+ isnil = (stk->stk[getArg(pci, 1)].val.btval == bte_nil);
break;
case TYPE_sht:
r = stk->stk[getArg(pci, 1)].val.shval;
+ isnil = (stk->stk[getArg(pci, 1)].val.shval == sht_nil);
break;
case TYPE_int:
r = stk->stk[getArg(pci, 1)].val.ival;
+ isnil = (stk->stk[getArg(pci, 1)].val.ival == int_nil);
break;
case TYPE_lng:
r = (int) stk->stk[getArg(pci, 1)].val.lval;
+ isnil = (stk->stk[getArg(pci, 1)].val.lval == lng_nil);
break;
#ifdef HAVE_HGE
case TYPE_hge:
r = (int) stk->stk[getArg(pci, 1)].val.hval;
+ isnil = (stk->stk[getArg(pci, 1)].val.hval == hge_nil);
break;
#endif
default:
throw(ILLARG, "calc.month_interval", SQLSTATE(42000) "Illegal
argument");
}
+ if (isnil)
+ return MAL_SUCCEED;
switch (k) {
case iyear:
r *= 12;
@@ -4102,7 +4112,6 @@ sql_rt_credentials_wrap(Client cntxt, Ma
return msg;
}
-
str
sql_querylog_catalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
@@ -4412,7 +4421,6 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
return MAL_SUCCEED;
}
-
i = 0;
bids[i] = 0;
for (o = t->columns.set->h; o; o = o->next, i++) {
@@ -4582,7 +4590,6 @@ SQLdrop_hash(Client cntxt, MalBlkPtr mb,
return MAL_SUCCEED;
}
-
/* after an update on the optimizer catalog, we have to change
* the internal optimizer pipe line administration
* The minimal and default pipelines may not be changed.
@@ -5231,4 +5238,3 @@ SQLflush_log(void *ret)
store_flush_log();
return MAL_SUCCEED;
}
-
diff --git a/sql/test/miscellaneous/Tests/simple_selects.sql
b/sql/test/miscellaneous/Tests/simple_selects.sql
--- a/sql/test/miscellaneous/Tests/simple_selects.sql
+++ b/sql/test/miscellaneous/Tests/simple_selects.sql
@@ -15,6 +15,23 @@ select cast(sum(42) as bigint) having 42
select 1 having false;
select 1 having true;
+create table x (x interval second, y interval month);
+insert into x values (1, 1);
+select cast(x as date) from x;
+select cast(x as time) from x;
+select cast(x as timestamp) from x;
+select cast(y as date) from x;
+select cast(y as time) from x;
+select cast(y as timestamp) from x;
+insert into x values (null, null);
+select cast(x as date) from x; --error, cannot cast
+select cast(x as time) from x;
+select cast(x as timestamp) from x;
+select cast(y as date) from x;
+select cast(y as time) from x;
+select cast(y as timestamp) from x;
+drop table x;
+
select "idontexist"."idontexist"(); --error, it doesn't exist
select "idontexist"."idontexist"(1); --error, it doesn't exist
select "idontexist"."idontexist"(1,2); --error, it doesn't exist
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list