Changeset: 69cde5aeb79a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=69cde5aeb79a
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
Branch: default
Log Message:

Added bulk support for string to interval conversion, and handle null values


diffs (truncated from 332 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -6027,6 +6027,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:int], X_2:int, X_3:int):bat[:int] ",   
"month_interval;",      ""      ]
 [ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:lng], X_2:int, X_3:int):bat[:int] ",   
"month_interval;",      ""      ]
 [ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:sht], X_2:int, X_3:int):bat[:int] ",   
"month_interval;",      ""      ]
+[ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:str], X_2:int, X_3:int):bat[:int] ",   
"month_interval_str;",  ""      ]
 [ "batcalc",   "mul_noerror",  "pattern batcalc.mul_noerror(X_1:bat[:bte], 
X_2:bat[:bte], X_3:bat[:oid], X_4:bat[:oid]):bat[:bte] ",   "CMDbatMUL;",   ""  
    ]
 [ "batcalc",   "mul_noerror",  "pattern batcalc.mul_noerror(X_1:bat[:bte], 
X_2:bat[:bte], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:bit]):bat[:bte] ",    
"CMDbatMUL;",   ""      ]
 [ "batcalc",   "mul_noerror",  "pattern batcalc.mul_noerror(X_1:bat[:bte], 
X_2:bat[:dbl], X_3:bat[:oid], X_4:bat[:oid]):bat[:dbl] ",   "CMDbatMUL;",   ""  
    ]
@@ -6429,13 +6430,14 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "or",   "pattern batcalc.or(X_1:sht, X_2:bat[:sht], 
X_3:bat[:oid], X_4:bat[:bit]):bat[:sht] ",  "CMDbatOR;",    ""      ]
 [ "batcalc",   "rotate_xor_hash",      "command 
batcalc.rotate_xor_hash(X_1:bat[:lng], X_2:int, X_3:bat[:any_1]):bat[:int] ",  
"MKEYbulk_rotate_xor_hash;",    ""      ]
 [ "batcalc",   "second_interval",      "command 
batcalc.second_interval(X_1:int, X_2:bat[:bte], X_3:int, X_4:int):bat[:lng] ", 
"bte_batdec2second_interval;",  ""      ]
-[ "batcalc",   "second_interval",      "command 
batcalc.second_interval(X_1:int, X_2:bat[:hge], X_3:int, X_4:int):bat[:lng] ", 
"hge_batdec2second_interval;",  ""      ]
 [ "batcalc",   "second_interval",      "command 
batcalc.second_interval(X_1:int, X_2:bat[:int], X_3:int, X_4:int):bat[:lng] ", 
"int_batdec2second_interval;",  ""      ]
 [ "batcalc",   "second_interval",      "command 
batcalc.second_interval(X_1:int, X_2:bat[:lng], X_3:int, X_4:int):bat[:lng] ", 
"lng_batdec2second_interval;",  ""      ]
 [ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:bte], X_2:int, X_3:int):bat[:lng] ",  
"second_interval;",     ""      ]
 [ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:int], X_2:int, X_3:int):bat[:lng] ",  
"second_interval;",     ""      ]
 [ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:lng], X_2:int, X_3:int):bat[:lng] ",  
"second_interval;",     ""      ]
 [ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:sht], X_2:int, X_3:int):bat[:lng] ",  
"second_interval;",     ""      ]
+[ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:str], X_2:int, X_3:int):bat[:lng] ",  
"second_interval_str;", ""      ]
+[ "batcalc",   "second_interval",      "command 
batcalc.second_interval(X_1:int, X_2:bat[:sht], X_3:int, X_4:int):bat[:lng] ", 
"sht_batdec2second_interval;",  ""      ]
 [ "batcalc",   "sht",  "pattern batcalc.sht(X_1:bat[:bit]):bat[:sht] ",        
"CMDconvertsignal_sht;",        ""      ]
 [ "batcalc",   "sht",  "pattern batcalc.sht(X_1:bat[:bit], 
X_2:bat[:bit]):bat[:sht] ", "CMDconvertsignal_sht;",        ""      ]
 [ "batcalc",   "sht",  "pattern batcalc.sht(X_1:bat[:bit], 
X_2:bat[:oid]):bat[:sht] ", "CMDconvertsignal_sht;",        ""      ]
@@ -8962,7 +8964,7 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "month_interval",       "pattern calc.month_interval(X_1:int, 
X_2:int, X_3:int):int ",  "month_interval;",      ""      ]
 [ "calc",      "month_interval",       "pattern calc.month_interval(X_1:lng, 
X_2:int, X_3:int):int ",  "month_interval;",      ""      ]
 [ "calc",      "month_interval",       "pattern calc.month_interval(X_1:sht, 
X_2:int, X_3:int):int ",  "month_interval;",      ""      ]
-[ "calc",      "month_interval",       "command calc.month_interval(X_1:str, 
X_2:int, X_3:int):int ",  "month_interval_str;",  ""      ]
+[ "calc",      "month_interval",       "pattern calc.month_interval(X_1:str, 
X_2:int, X_3:int):int ",  "month_interval_str;",  ""      ]
 [ "calc",      "mul_noerror",  "pattern calc.mul_noerror(X_1:bte, X_2:bte):bte 
",      "CMDvarMUL;",   ""      ]
 [ "calc",      "mul_noerror",  "pattern calc.mul_noerror(X_1:bte, X_2:dbl):dbl 
",      "CMDvarMUL;",   ""      ]
 [ "calc",      "mul_noerror",  "pattern calc.mul_noerror(X_1:bte, X_2:flt):flt 
",      "CMDvarMUL;",   ""      ]
@@ -9046,7 +9048,7 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "second_interval",      "pattern calc.second_interval(X_1:lng, 
X_2:int, X_3:int):lng ", "second_interval;",     ""      ]
 [ "calc",      "second_interval",      "pattern calc.second_interval(X_1:sht, 
X_2:int, X_3:int):lng ", "second_interval;",     ""      ]
 [ "calc",      "second_interval",      "command 
calc.second_interval(X_1:daytime, X_2:int, X_3:int):lng ",     
"second_interval_daytime;",     ""      ]
-[ "calc",      "second_interval",      "command calc.second_interval(X_1:str, 
X_2:int, X_3:int):lng ", "second_interval_str;", ""      ]
+[ "calc",      "second_interval",      "pattern calc.second_interval(X_1:str, 
X_2:int, X_3:int):lng ", "second_interval_str;", ""      ]
 [ "calc",      "second_interval",      "command calc.second_interval(X_1:int, 
X_2:sht, X_3:int, X_4:int):lng ",        "sht_dec2second_interval;",     ""     
 ]
 [ "calc",      "sht",  "pattern calc.sht(X_1:bit):sht ",       
"CMDvarCONVERT;",       ""      ]
 [ "calc",      "sht",  "pattern calc.sht(X_1:bte):sht ",       
"CMDvarCONVERT;",       ""      ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -8476,6 +8476,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:int], X_2:int, X_3:int):bat[:int] ",   
"month_interval;",      ""      ]
 [ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:lng], X_2:int, X_3:int):bat[:int] ",   
"month_interval;",      ""      ]
 [ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:sht], X_2:int, X_3:int):bat[:int] ",   
"month_interval;",      ""      ]
+[ "batcalc",   "month_interval",       "pattern 
batcalc.month_interval(X_1:bat[:str], X_2:int, X_3:int):bat[:int] ",   
"month_interval_str;",  ""      ]
 [ "batcalc",   "mul_noerror",  "pattern batcalc.mul_noerror(X_1:bat[:bte], 
X_2:bat[:bte], X_3:bat[:oid], X_4:bat[:oid]):bat[:bte] ",   "CMDbatMUL;",   ""  
    ]
 [ "batcalc",   "mul_noerror",  "pattern batcalc.mul_noerror(X_1:bat[:bte], 
X_2:bat[:bte], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:bit]):bat[:bte] ",    
"CMDbatMUL;",   ""      ]
 [ "batcalc",   "mul_noerror",  "pattern batcalc.mul_noerror(X_1:bat[:bte], 
X_2:bat[:dbl], X_3:bat[:oid], X_4:bat[:oid]):bat[:dbl] ",   "CMDbatMUL;",   ""  
    ]
@@ -8988,6 +8989,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:int], X_2:int, X_3:int):bat[:lng] ",  
"second_interval;",     ""      ]
 [ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:lng], X_2:int, X_3:int):bat[:lng] ",  
"second_interval;",     ""      ]
 [ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:sht], X_2:int, X_3:int):bat[:lng] ",  
"second_interval;",     ""      ]
+[ "batcalc",   "second_interval",      "pattern 
batcalc.second_interval(X_1:bat[:str], X_2:int, X_3:int):bat[:lng] ",  
"second_interval_str;", ""      ]
 [ "batcalc",   "second_interval",      "command 
batcalc.second_interval(X_1:int, X_2:bat[:sht], X_3:int, X_4:int):bat[:lng] ", 
"sht_batdec2second_interval;",  ""      ]
 [ "batcalc",   "sht",  "pattern batcalc.sht(X_1:bat[:bit]):bat[:sht] ",        
"CMDconvertsignal_sht;",        ""      ]
 [ "batcalc",   "sht",  "pattern batcalc.sht(X_1:bat[:bit], 
X_2:bat[:bit]):bat[:sht] ", "CMDconvertsignal_sht;",        ""      ]
@@ -12255,7 +12257,7 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "month_interval",       "pattern calc.month_interval(X_1:int, 
X_2:int, X_3:int):int ",  "month_interval;",      ""      ]
 [ "calc",      "month_interval",       "pattern calc.month_interval(X_1:lng, 
X_2:int, X_3:int):int ",  "month_interval;",      ""      ]
 [ "calc",      "month_interval",       "pattern calc.month_interval(X_1:sht, 
X_2:int, X_3:int):int ",  "month_interval;",      ""      ]
-[ "calc",      "month_interval",       "command calc.month_interval(X_1:str, 
X_2:int, X_3:int):int ",  "month_interval_str;",  ""      ]
+[ "calc",      "month_interval",       "pattern calc.month_interval(X_1:str, 
X_2:int, X_3:int):int ",  "month_interval_str;",  ""      ]
 [ "calc",      "mul_noerror",  "pattern calc.mul_noerror(X_1:bte, X_2:bte):bte 
",      "CMDvarMUL;",   ""      ]
 [ "calc",      "mul_noerror",  "pattern calc.mul_noerror(X_1:bte, X_2:dbl):dbl 
",      "CMDvarMUL;",   ""      ]
 [ "calc",      "mul_noerror",  "pattern calc.mul_noerror(X_1:bte, X_2:flt):flt 
",      "CMDvarMUL;",   ""      ]
@@ -12366,7 +12368,7 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "second_interval",      "pattern calc.second_interval(X_1:lng, 
X_2:int, X_3:int):lng ", "second_interval;",     ""      ]
 [ "calc",      "second_interval",      "pattern calc.second_interval(X_1:sht, 
X_2:int, X_3:int):lng ", "second_interval;",     ""      ]
 [ "calc",      "second_interval",      "command 
calc.second_interval(X_1:daytime, X_2:int, X_3:int):lng ",     
"second_interval_daytime;",     ""      ]
-[ "calc",      "second_interval",      "command calc.second_interval(X_1:str, 
X_2:int, X_3:int):lng ", "second_interval_str;", ""      ]
+[ "calc",      "second_interval",      "pattern calc.second_interval(X_1:str, 
X_2:int, X_3:int):lng ", "second_interval_str;", ""      ]
 [ "calc",      "second_interval",      "command calc.second_interval(X_1:int, 
X_2:sht, X_3:int, X_4:int):lng ",        "sht_dec2second_interval;",     ""     
 ]
 [ "calc",      "sht",  "pattern calc.sht(X_1:bit):sht ",       
"CMDvarCONVERT;",       ""      ]
 [ "calc",      "sht",  "pattern calc.sht(X_1:bte):sht ",       
"CMDvarCONVERT;",       ""      ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1976,6 +1976,7 @@ char *msab_getUUID(char **ret);
 char *msab_getUplogInfo(sabuplog *ret, const sabdb *db);
 char *msab_marchConnection(const char *host, const int port);
 char *msab_marchScenario(const char *lang);
+char *msab_pickSecret(char **generated_secret);
 char *msab_registerStarted(void);
 char *msab_registerStarting(void);
 char *msab_registerStop(void);
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
@@ -3865,23 +3865,150 @@ SQLcst_alpha_bat(bat *res, const dbl *de
 }
 
 str
-month_interval_str(int *ret, const str *s, const int *d, const int *sk)
+month_interval_str(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       lng res;
-
-       if (interval_from_str(*s, *d, *sk, &res) < 0)
-               throw(SQL, "calc.month_interval", SQLSTATE(42000) "Wrong format 
(%s)", *s);
-       assert((lng) GDK_int_min <= res && res <= (lng) GDK_int_max);
-       *ret = (int) res;
-       return MAL_SUCCEED;
+       str msg = MAL_SUCCEED;
+       int *restrict ret = NULL;
+       int d = *getArgReference_int(stk, pci, 2), sk = 
*getArgReference_int(stk, pci, 3), tpe = getArgType(mb, pci, 1);
+       bool is_a_bat = false;
+       BAT *b = NULL, *res = NULL;
+       bat *r;
+       BUN q = 0;
+
+       (void) cntxt;
+       is_a_bat = isaBatType(tpe);
+       if (is_a_bat) {
+               tpe = getBatType(tpe);
+               if (!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1)))) {
+                       msg = createException(SQL, "calc.month_interval_str", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                       goto bailout;
+               }
+               q = BATcount(b);
+               if (!(res = COLnew(b->hseqbase, TYPE_int, q, TRANSIENT))) {
+                       msg = createException(SQL, "calc.month_interval_str", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       goto bailout;
+               }
+               r = getArgReference_bat(stk, pci, 0);
+               ret = (int*) Tloc(res, 0);
+       } else {
+               ret = getArgReference_int(stk, pci, 0);
+       }
+
+       if (is_a_bat) {
+               BATiter bi = bat_iterator(b);
+               for (BUN i = 0 ; i < q ; i++) {
+                       const str next = BUNtail(bi, i);
+
+                       if (strNil(next)) {
+                               *ret = int_nil;
+                       } else {
+                               lng upcast;
+                               if (interval_from_str(next, d, sk, &upcast) < 
0) {
+                                       msg = createException(SQL, 
"calc.month_interval_str", SQLSTATE(42000) "Wrong format (%s)", next);
+                                       goto bailout;
+                               }
+                               assert((lng) GDK_int_min <= upcast && upcast <= 
(lng) GDK_int_max);
+                               ret[i] = (int) upcast;
+                       }
+               }
+       } else {
+               const str next = *getArgReference_str(stk, pci, 1);
+
+               if (strNil(next)) {
+                       *ret = int_nil;
+               } else {
+                       lng upcast;
+                       if (interval_from_str(next, d, sk, &upcast) < 0) {
+                               msg = createException(SQL, 
"calc.month_interval_str", SQLSTATE(42000) "Wrong format (%s)", next);
+                               goto bailout;
+                       }
+                       assert((lng) GDK_int_min <= upcast && upcast <= (lng) 
GDK_int_max);
+                       *ret = (int) upcast;
+               }
+       }
+
+bailout:
+       if (res && !msg) {
+               BATsetcount(res, q);
+               res->tnil = b->tnil;
+               res->tnonil = b->tnonil;
+               res->tkey = BATcount(res) <= 1;
+               res->tsorted = BATcount(res) <= 1;
+               res->trevsorted = BATcount(res) <= 1;
+               BBPkeepref(*r = res->batCacheid);
+       } else if (res)
+               BBPreclaim(res);
+       if (b)
+               BBPunfix(b->batCacheid);
+       return msg;
 }
 
 str
-second_interval_str(lng *res, const str *s, const int *d, const int *sk)
+second_interval_str(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       if (interval_from_str(*s, *d, *sk, res) < 0)
-               throw(SQL, "calc.second_interval", SQLSTATE(42000) "Wrong 
format (%s)", *s);
-       return MAL_SUCCEED;
+       str msg = MAL_SUCCEED;
+       lng *restrict ret = NULL;
+       int d = *getArgReference_int(stk, pci, 2), sk = 
*getArgReference_int(stk, pci, 3), tpe = getArgType(mb, pci, 1);
+       bool is_a_bat = false;
+       BAT *b = NULL, *res = NULL;
+       bat *r;
+       BUN q = 0;
+
+       (void) cntxt;
+       is_a_bat = isaBatType(tpe);
+       if (is_a_bat) {
+               tpe = getBatType(tpe);
+               if (!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1)))) {
+                       msg = createException(SQL, "calc.second_interval_str", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                       goto bailout;
+               }
+               q = BATcount(b);
+               if (!(res = COLnew(b->hseqbase, TYPE_lng, q, TRANSIENT))) {
+                       msg = createException(SQL, "calc.second_interval_str", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       goto bailout;
+               }
+               r = getArgReference_bat(stk, pci, 0);
+               ret = (lng*) Tloc(res, 0);
+       } else {
+               ret = getArgReference_lng(stk, pci, 0);
+       }
+
+       if (is_a_bat) {
+               BATiter bi = bat_iterator(b);
+               for (BUN i = 0 ; i < q ; i++) {
+                       const str next = BUNtail(bi, i);
+
+                       if (strNil(next)) {
+                               ret[i] = lng_nil;
+                       } else if (interval_from_str(next, d, sk, &(ret[i])) < 
0) {
+                               msg = createException(SQL, 
"calc.second_interval_str", SQLSTATE(42000) "Wrong format (%s)", next);
+                               goto bailout;
+                       }
+               }
+       } else {
+               const str next = *getArgReference_str(stk, pci, 1);
+               if (strNil(next)) {
+                       *ret = lng_nil;
+               } if (interval_from_str(next, d, sk, ret) < 0) {
+                       msg = createException(SQL, "calc.second_interval_str", 
SQLSTATE(42000) "Wrong format (%s)", next);
+                       goto bailout;
+               }
+       }
+
+bailout:
+       if (res && !msg) {
+               BATsetcount(res, q);
+               res->tnil = b->tnil;
+               res->tnonil = b->tnonil;
+               res->tkey = BATcount(res) <= 1;
+               res->tsorted = BATcount(res) <= 1;
+               res->trevsorted = BATcount(res) <= 1;
+               BBPkeepref(*r = res->batCacheid);
+       } else if (res)
+               BBPreclaim(res);
+       if (b)
+               BBPunfix(b->batCacheid);
+       return msg;
 }
 
 #define interval_loop(FUNC, TPE) \
@@ -3900,7 +4027,6 @@ second_interval_str(lng *res, const str 
        do { \
                if (is_##TPE##_nil(IN)) { \
                        OUT = int_nil; \
-                       hasnil = 1; \
                } else { \
                        int r = (int) IN; \
                        r *= multiplier; \
@@ -3912,13 +4038,12 @@ str
 month_interval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        str msg = MAL_SUCCEED;
-       int *restrict ret = getArgReference_int(stk, pci, 0), multiplier = 1;
+       int *restrict ret = NULL, multiplier = 1;
        int k = digits2ek(*getArgReference_int(stk, pci, 2)), tpe = 
getArgType(mb, pci, 1);
        bool is_a_bat = false;
        BAT *b = NULL, *res = NULL;
        bat *r;
        BUN q = 0;
-       bit hasnil = 0;
 
        (void) cntxt;
        is_a_bat = isaBatType(tpe);
@@ -3975,18 +4100,18 @@ month_interval(Client cntxt, MalBlkPtr m
        }
 
 bailout:
-       if (b)
-               BBPunfix(b->batCacheid);
        if (res && !msg) {
                BATsetcount(res, q);
-               res->tnil = hasnil != 0;
-               res->tnonil = hasnil == 0;
+               res->tnil = b->tnil;
+               res->tnonil = b->tnonil;
                res->tkey = BATcount(res) <= 1;
                res->tsorted = BATcount(res) <= 1;
                res->trevsorted = BATcount(res) <= 1;
                BBPkeepref(*r = res->batCacheid);
        } else if (res)
                BBPreclaim(res);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to