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

Reply via email to