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