Changeset: 443cbe736c85 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=443cbe736c85 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/modules/kernel/batstr.c Branch: Oct2020 Log Message:
More missing bulk str implementations diffs (truncated from 333 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 @@ -5910,6 +5910,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "rtrim", "command batstr.rtrim(X_1:bat[:str]):bat[:str] ", "STRbatRtrim;", "" ] [ "batstr", "search", "command batstr.search(X_1:bat[:str], X_2:bat[:str]):bat[:int] ", "STRbatstrSearch;", "" ] [ "batstr", "search", "command batstr.search(X_1:bat[:str], X_2:str):bat[:int] ", "STRbatstrSearchcst;", "" ] +[ "batstr", "splitpart", "command batstr.splitpart(X_1:bat[:str], X_2:bat[:str], X_3:bat[:int]):bat[:str] ", "STRbatsplitpart;", "" ] +[ "batstr", "splitpart", "command batstr.splitpart(X_1:bat[:str], X_2:str, X_3:int):bat[:str] ", "STRbatsplitpartcst;", "" ] [ "batstr", "startsWith", "command batstr.startsWith(X_1:bat[:str], X_2:bat[:str]):bat[:bit] ", "STRbatPrefix;", "" ] [ "batstr", "startsWith", "command batstr.startsWith(X_1:bat[:str], X_2:str):bat[:bit] ", "STRbatPrefixcst;", "" ] [ "batstr", "string", "command batstr.string(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatTail;", "" ] @@ -5918,6 +5920,7 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "stringleft", "command batstr.stringleft(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatprefixcst;", "" ] [ "batstr", "stringright", "command batstr.stringright(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatsuffix;", "" ] [ "batstr", "stringright", "command batstr.stringright(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatsuffixcst;", "" ] +[ "batstr", "substitute", "command batstr.substitute(X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ", "STRbatSubstitute;", "" ] [ "batstr", "substitute", "command batstr.substitute(X_1:bat[:str], X_2:str, X_3:str, X_4:bit):bat[:str] ", "STRbatSubstitutecst;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:bat[:int], X_3:bat[:int]):bat[:str] ", "STRbatsubstring;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatsubstringTail;", "" ] 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 @@ -8186,6 +8186,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "rtrim", "command batstr.rtrim(X_1:bat[:str]):bat[:str] ", "STRbatRtrim;", "" ] [ "batstr", "search", "command batstr.search(X_1:bat[:str], X_2:bat[:str]):bat[:int] ", "STRbatstrSearch;", "" ] [ "batstr", "search", "command batstr.search(X_1:bat[:str], X_2:str):bat[:int] ", "STRbatstrSearchcst;", "" ] +[ "batstr", "splitpart", "command batstr.splitpart(X_1:bat[:str], X_2:bat[:str], X_3:bat[:int]):bat[:str] ", "STRbatsplitpart;", "" ] +[ "batstr", "splitpart", "command batstr.splitpart(X_1:bat[:str], X_2:str, X_3:int):bat[:str] ", "STRbatsplitpartcst;", "" ] [ "batstr", "startsWith", "command batstr.startsWith(X_1:bat[:str], X_2:bat[:str]):bat[:bit] ", "STRbatPrefix;", "" ] [ "batstr", "startsWith", "command batstr.startsWith(X_1:bat[:str], X_2:str):bat[:bit] ", "STRbatPrefixcst;", "" ] [ "batstr", "string", "command batstr.string(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatTail;", "" ] @@ -8194,6 +8196,7 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "stringleft", "command batstr.stringleft(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatprefixcst;", "" ] [ "batstr", "stringright", "command batstr.stringright(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatsuffix;", "" ] [ "batstr", "stringright", "command batstr.stringright(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatsuffixcst;", "" ] +[ "batstr", "substitute", "command batstr.substitute(X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ", "STRbatSubstitute;", "" ] [ "batstr", "substitute", "command batstr.substitute(X_1:bat[:str], X_2:str, X_3:str, X_4:bit):bat[:str] ", "STRbatSubstitutecst;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:bat[:int], X_3:bat[:int]):bat[:str] ", "STRbatsubstring;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatsubstringTail;", "" ] diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c --- a/monetdb5/modules/kernel/batstr.c +++ b/monetdb5/modules/kernel/batstr.c @@ -1283,40 +1283,233 @@ STRbatsubstringTail(bat *ret, const bat static str STRbatSubstitutecst(bat *ret, const bat *l, const str *arg2, const str *arg3, const bit *rep) { - BATiter bi; - BAT *bn, *b; - BUN p, q; - str x; - str y; - str err = MAL_SUCCEED; + BATiter lefti; + BAT *bn, *left; + BUN p,q; + str y = NULL, err = MAL_SUCCEED; + + if (!(left = BATdescriptor(*l))) { + err = createException(MAL, "batstr.substritute", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + goto bailout; + } + if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) { + err = createException(MAL, "batstr.substritute", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } + bn->tnonil=true; + bn->tnil=false; + + lefti = bat_iterator(left); + BATloop(left, p, q) { + str x = (str) BUNtvar(lefti,p); + + if ((err = STRSubstitute(&y, &x, arg2, arg3, rep)) != MAL_SUCCEED) + goto bailout; + if (bunfastappVAR(bn, y) != GDK_SUCCEED) { + GDKfree(y); + goto bailout; + } + if (strNil(y)) { + bn->tnonil = false; + bn->tnil = true; + } + GDKfree(y); + } - prepareOperand(b, l, "subString"); - prepareResult(bn, b, TYPE_int, "subString"); +bailout: + if (err) { + BBPreclaim(bn); + } else { + BATsetcount(bn, BATcount(left)); + bn->tkey = BATcount(bn) <= 1; + bn->tsorted = BATcount(bn) <= 1; + bn->trevsorted = BATcount(bn) <= 1; + BBPkeepref(*ret = bn->batCacheid); + } + if (left) + BBPunfix(left->batCacheid); + return err; +} + +static str +STRbatSubstitute(bat *ret, const bat *l, const bat *arg2, const bat *arg3, const bat *rep) +{ + BATiter lefti, arg2i, arg3i; + BAT *bn, *left, *arg2b, *arg3b, *repb; + BUN p,q; + str y = NULL, err = MAL_SUCCEED; + bit *restrict repi; - bi = bat_iterator(b); + if (!(left = BATdescriptor(*l)) || !(arg2b= BATdescriptor(*arg2)) || !(arg3b= BATdescriptor(*arg3)) || !(repb= BATdescriptor(*rep))) { + err = createException(MAL, "batstr.substritute", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + goto bailout; + } + if (BATcount(left) != BATcount(arg2b) || BATcount(arg2b) != BATcount(arg3b) || BATcount(arg3b) != BATcount(repb)) { + err = createException(MAL, "batstr.substritute", ILLEGAL_ARGUMENT " Requires bats of identical size"); + goto bailout; + } + if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) { + err = createException(MAL, "batstr.substritute", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } + bn->tnonil=true; + bn->tnil=false; + + lefti = bat_iterator(left); + arg2i = bat_iterator(arg2b); + arg3i = bat_iterator(arg3b); + repi = Tloc(repb, 0); + BATloop(left, p, q) { + str n2 = (str) BUNtvar(arg2i,p); + str n3 = (str) BUNtvar(arg3i,p); + str x = (str) BUNtvar(lefti,p); + + if ((err = STRSubstitute(&y, &x, &n2, &n3, &(repi[p]))) != MAL_SUCCEED) + goto bailout; + if (bunfastappVAR(bn, y) != GDK_SUCCEED) { + GDKfree(y); + goto bailout; + } + if (strNil(y)) { + bn->tnonil = false; + bn->tnil = true; + } + GDKfree(y); + } - BATloop(b, p, q) { - y = (str) str_nil; - x = (str) BUNtvar(bi, p); - if (!strNil(x) && - (err = STRSubstitute(&y, &x, arg2, arg3, rep)) != MAL_SUCCEED) - goto bunins_failed; - if (bunfastappVAR(bn, y) != GDK_SUCCEED) - goto bunins_failed; - if (y != str_nil) +bailout: + if (err) { + BBPreclaim(bn); + } else { + BATsetcount(bn, BATcount(left)); + bn->tkey = BATcount(bn) <= 1; + bn->tsorted = BATcount(bn) <= 1; + bn->trevsorted = BATcount(bn) <= 1; + BBPkeepref(*ret = bn->batCacheid); + } + if (left) + BBPunfix(left->batCacheid); + if (arg2b) + BBPunfix(arg2b->batCacheid); + if (arg3b) + BBPunfix(arg3b->batCacheid); + if (repb) + BBPunfix(repb->batCacheid); + return err; +} + +static str +STRbatsplitpartcst(bat *ret, const bat *bid, const str *needle, const int *field) +{ + BATiter lefti; + BAT *bn, *left; + BUN p,q; + str y = NULL, err = MAL_SUCCEED; + + if (!(left = BATdescriptor(*bid))) { + err = createException(MAL, "batstr.splitpart", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + goto bailout; + } + if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) { + err = createException(MAL, "batstr.splitpart", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } + bn->tnonil=true; + bn->tnil=false; + + lefti = bat_iterator(left); + BATloop(left, p, q) { + str x = (str) BUNtvar(lefti,p); + + if ((err = STRsplitpart(&y, &x, (str*)needle, (int*)field)) != MAL_SUCCEED) + goto bailout; + if (bunfastappVAR(bn, y) != GDK_SUCCEED) { GDKfree(y); + goto bailout; + } + if (strNil(y)) { + bn->tnonil = false; + bn->tnil = true; + } + GDKfree(y); + } + +bailout: + if (err) { + BBPreclaim(bn); + } else { + BATsetcount(bn, BATcount(left)); + bn->tkey = BATcount(bn) <= 1; + bn->tsorted = BATcount(bn) <= 1; + bn->trevsorted = BATcount(bn) <= 1; + BBPkeepref(*ret = bn->batCacheid); } - bn->tnonil = false; - finalizeResult(ret, bn, b); - return MAL_SUCCEED; -bunins_failed: - if (err == MAL_SUCCEED && y != str_nil) + if (left) + BBPunfix(left->batCacheid); + return err; +} + +static str +STRbatsplitpart(bat *ret, const bat *l, const bat *r, const bat *t) +{ + BATiter lefti, arg2i; + BAT *bn, *left, *arg2b, *arg3b; + BUN p,q; + str y = NULL, err = MAL_SUCCEED; + int *restrict fieldi; + + if (!(left = BATdescriptor(*l)) || !(arg2b= BATdescriptor(*r)) || !(arg3b= BATdescriptor(*t))) { + err = createException(MAL, "batstr.splitpart", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + goto bailout; + } + if (BATcount(left) != BATcount(arg2b) || BATcount(arg2b) != BATcount(arg3b) ) { + err = createException(MAL, "batstr.splitpart", ILLEGAL_ARGUMENT " Requires bats of identical size"); + goto bailout; + } + if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) { + err = createException(MAL, "batstr.splitpart", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } + bn->tnonil=true; + bn->tnil=false; + + lefti = bat_iterator(left); + arg2i = bat_iterator(arg2b); + fieldi = Tloc(arg3b, 0); + BATloop(left, p, q) { + str x = (str) BUNtvar(lefti,p); + str needle = (str) BUNtvar(arg2i,p); + + if ((err = STRsplitpart(&y, &x, &needle, &(fieldi[p]))) != MAL_SUCCEED) + goto bailout; + if (bunfastappVAR(bn, y) != GDK_SUCCEED) { + GDKfree(y); + goto bailout; + } + if (strNil(y)) { + bn->tnonil = false; + bn->tnil = true; + } GDKfree(y); - BBPunfix(b->batCacheid); - BBPunfix(bn->batCacheid); - if (err) - return err; - throw(MAL, "batstr.subString", OPERATION_FAILED " During bulk operation"); + } + +bailout: + if (err) { + BBPreclaim(bn); + } else { + BATsetcount(bn, BATcount(left)); + bn->tkey = BATcount(bn) <= 1; + bn->tsorted = BATcount(bn) <= 1; + bn->trevsorted = BATcount(bn) <= 1; + BBPkeepref(*ret = bn->batCacheid); + } + if (left) + BBPunfix(left->batCacheid); + if (arg2b) + BBPunfix(arg2b->batCacheid); + if (arg3b) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list