Changeset: 923a2addb76f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=923a2addb76f Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/modules/kernel/batstr.c sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out Branch: Oct2020 Log Message:
Implemented remaining missing bulk implementations for string functions. This closes bug 6870. diffs (truncated from 413 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 @@ -5880,6 +5880,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "ascii", "command batstr.ascii(X_1:bat[:str]):bat[:int] ", "STRbatAscii;", "" ] [ "batstr", "endsWith", "command batstr.endsWith(X_1:bat[:str], X_2:bat[:str]):bat[:bit] ", "STRbatSuffix;", "" ] [ "batstr", "endsWith", "command batstr.endsWith(X_1:bat[:str], X_2:str):bat[:bit] ", "STRbatSuffixcst;", "" ] +[ "batstr", "insert", "command batstr.insert(X_1:bat[:str], X_2:bat[:int], X_3:bat[:int], X_4:bat[:str]):bat[:str] ", "STRbatInsert;", "" ] +[ "batstr", "insert", "command batstr.insert(X_1:bat[:str], X_2:int, X_3:int, X_4:str):bat[:str] ", "STRbatInsertcst;", "" ] [ "batstr", "length", "command batstr.length(X_1:bat[:str]):bat[:int] ", "STRbatLength;", "" ] [ "batstr", "locate", "command batstr.locate(X_1:bat[:str], X_2:bat[:str], X_3:bat[:int]):bat[:int] ", "STRbatstrLocate2;", "" ] [ "batstr", "locate", "command batstr.locate(X_1:bat[:str], X_2:str, X_3:int):bat[:int] ", "STRbatstrLocate2cst;", "" ] @@ -5899,6 +5901,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "r_search", "command batstr.r_search(X_1:bat[:str], X_2:str):bat[:int] ", "STRbatRstrSearchcst;", "" ] [ "batstr", "repeat", "command batstr.repeat(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatrepeat;", "" ] [ "batstr", "repeat", "command batstr.repeat(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatrepeatcst;", "" ] +[ "batstr", "replace", "command batstr.replace(X_1:bat[:str], X_2:bat[:str], X_3:bat[:str]):bat[:str] ", "STRbatReplace;", "" ] +[ "batstr", "replace", "command batstr.replace(X_1:bat[:str], X_2:str, X_3:str):bat[:str] ", "STRbatReplacecst;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:bat[:str]):bat[:str] ", "STRbatRpad2_bat_bat;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:str):bat[:str] ", "STRbatRpad2_bat_const;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:int, X_3:bat[:str]):bat[:str] ", "STRbatRpad2_const_bat;", "" ] @@ -5910,6 +5914,7 @@ 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", "space", "command batstr.space(X_1:bat[:int]):bat[:str] ", "STRbatSpace;", "" ] [ "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;", "" ] 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 @@ -8156,6 +8156,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "ascii", "command batstr.ascii(X_1:bat[:str]):bat[:int] ", "STRbatAscii;", "" ] [ "batstr", "endsWith", "command batstr.endsWith(X_1:bat[:str], X_2:bat[:str]):bat[:bit] ", "STRbatSuffix;", "" ] [ "batstr", "endsWith", "command batstr.endsWith(X_1:bat[:str], X_2:str):bat[:bit] ", "STRbatSuffixcst;", "" ] +[ "batstr", "insert", "command batstr.insert(X_1:bat[:str], X_2:bat[:int], X_3:bat[:int], X_4:bat[:str]):bat[:str] ", "STRbatInsert;", "" ] +[ "batstr", "insert", "command batstr.insert(X_1:bat[:str], X_2:int, X_3:int, X_4:str):bat[:str] ", "STRbatInsertcst;", "" ] [ "batstr", "length", "command batstr.length(X_1:bat[:str]):bat[:int] ", "STRbatLength;", "" ] [ "batstr", "locate", "command batstr.locate(X_1:bat[:str], X_2:bat[:str], X_3:bat[:int]):bat[:int] ", "STRbatstrLocate2;", "" ] [ "batstr", "locate", "command batstr.locate(X_1:bat[:str], X_2:str, X_3:int):bat[:int] ", "STRbatstrLocate2cst;", "" ] @@ -8175,6 +8177,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "r_search", "command batstr.r_search(X_1:bat[:str], X_2:str):bat[:int] ", "STRbatRstrSearchcst;", "" ] [ "batstr", "repeat", "command batstr.repeat(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatrepeat;", "" ] [ "batstr", "repeat", "command batstr.repeat(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatrepeatcst;", "" ] +[ "batstr", "replace", "command batstr.replace(X_1:bat[:str], X_2:bat[:str], X_3:bat[:str]):bat[:str] ", "STRbatReplace;", "" ] +[ "batstr", "replace", "command batstr.replace(X_1:bat[:str], X_2:str, X_3:str):bat[:str] ", "STRbatReplacecst;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:bat[:str]):bat[:str] ", "STRbatRpad2_bat_bat;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:str):bat[:str] ", "STRbatRpad2_bat_const;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:int, X_3:bat[:str]):bat[:str] ", "STRbatRpad2_const_bat;", "" ] @@ -8186,6 +8190,7 @@ 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", "space", "command batstr.space(X_1:bat[:int]):bat[:str] ", "STRbatSpace;", "" ] [ "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;", "" ] 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 @@ -192,6 +192,51 @@ bailout: } static str +STRbatSpace(bat *ret, const bat *l) +{ + BAT *bn, *b; + BUN q; + str y, msg = MAL_SUCCEED; + int *restrict input; + + prepareOperand(b, l, "batstr.Space"); + prepareResult(bn, b, TYPE_str, "batstr.Space"); + bn->tnonil=true; + bn->tnil=false; + + input = Tloc(b, 0); + q = BATcount(b); + + for (BUN p = 0; p < q; p++) { + if ((msg = STRspace(&y, &input[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); + } + +bailout: + if (msg) { + BBPreclaim(bn); + } else { + BATsetcount(bn, q); + bn->tkey = BATcount(bn) <= 1; + bn->tsorted = BATcount(bn) <= 1; + bn->trevsorted = BATcount(bn) <= 1; + BBPkeepref(*ret = bn->batCacheid); + } + if (b) + BBPunfix(b->batCacheid); + return msg; +} + +static str do_batstr_str(bat *ret, const bat *l, const char *name, str (*func)(str *, const str *)) { BATiter bi; @@ -1512,6 +1557,237 @@ bailout: return err; } +static str +STRbatReplacecst(bat *ret, const bat *bid, const str *pat, const str *s2) +{ + BATiter lefti; + BAT *bn, *left; + BUN p,q; + str y = NULL, err = MAL_SUCCEED; + + if (!(left = BATdescriptor(*bid))) { + err = createException(MAL, "batstr.replace", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + goto bailout; + } + if (!(bn = COLnew(left->hseqbase, TYPE_str, BATcount(left), TRANSIENT))) { + err = createException(MAL, "batstr.replace", 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 = STRreplace(&y, &x, (str*)pat, (str*)s2)) != 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); + } + if (left) + BBPunfix(left->batCacheid); + return err; +} + +static str +STRbatReplace(bat *ret, const bat *l, const bat *s, const bat *s2) +{ + BATiter lefti, arg2i, arg3i; + BAT *bn, *left, *arg2b, *arg3b; + BUN p,q; + str y = NULL, err = MAL_SUCCEED; + + if (!(left = BATdescriptor(*l)) || !(arg2b= BATdescriptor(*s)) || !(arg3b= BATdescriptor(*s2))) { + err = createException(MAL, "batstr.replace", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + goto bailout; + } + if (BATcount(left) != BATcount(arg2b) || BATcount(arg2b) != BATcount(arg3b) ) { + err = createException(MAL, "batstr.replace", ILLEGAL_ARGUMENT " Requires bats of identical size"); + goto bailout; + } + if (!(bn = COLnew(left->hseqbase, TYPE_str, BATcount(left), TRANSIENT))) { + err = createException(MAL, "batstr.replace", 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); + BATloop(left, p, q) { + str x = (str) BUNtvar(lefti,p); + str n1 = (str) BUNtvar(arg2i,p); + str n2 = (str) BUNtvar(arg3i,p); + + if ((err = STRreplace(&y, &x, &n1, &n2)) != 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); + } + if (left) + BBPunfix(left->batCacheid); + if (arg2b) + BBPunfix(arg2b->batCacheid); + if (arg3b) + BBPunfix(arg3b->batCacheid); + return err; +} + +static str +STRbatInsert(bat *ret, const bat *l, const bat *start, const bat *ll, const bat *s2) +{ + BATiter lefti, s2i; + BAT *bn, *left, *startb, *lb, *s2b; + BUN p,q; + str y = NULL, err = MAL_SUCCEED; + int *starti, *li; + + if (!(left = BATdescriptor(*l)) || !(startb= BATdescriptor(*start)) || !(lb= BATdescriptor(*ll)) || !(s2b= BATdescriptor(*s2))) { + err = createException(MAL, "batstr.insert", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + goto bailout; + } + if (BATcount(left) != BATcount(startb) || BATcount(startb) != BATcount(lb) || BATcount(lb) != BATcount(s2b)) { + err = createException(MAL, "batstr.insert", ILLEGAL_ARGUMENT " Requires bats of identical size"); + goto bailout; + } + if (!(bn = COLnew(left->hseqbase, TYPE_str, BATcount(left), TRANSIENT))) { + err = createException(MAL, "batstr.insert", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto bailout; + } + bn->tnonil=true; + bn->tnil=false; + + lefti = bat_iterator(left); + s2i = bat_iterator(s2b); + starti = Tloc(startb, 0); + li = Tloc(lb, 0); + BATloop(left, p, q) { + str x = (str) BUNtvar(lefti,p); + str ss2 = (str) BUNtvar(s2i,p); + + if ((err = STRinsert(&y, &x, &(starti[p]), &(li[p]), &ss2)) != 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); + } + if (left) + BBPunfix(left->batCacheid); + if (startb) + BBPunfix(startb->batCacheid); + if (lb) + BBPunfix(lb->batCacheid); + if (s2b) + BBPunfix(s2b->batCacheid); + return err; +} + +static str +STRbatInsertcst(bat *ret, const bat *bid, const int *start, const int *nchars, const str *input2) +{ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list