Changeset: 2d290c436ed2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2d290c436ed2
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
monetdb5/modules/kernel/batstr.c
Branch: alloc-less-str
Log Message:
Added missing bulk versions of splitpart function
diffs (168 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
@@ -6494,6 +6494,8 @@ stdout of test 'MAL-signatures` in direc
[ "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:bat[:str], X_3:int):bat[:str] ", "STRbatsplitpart_fieldcst;", "" ]
+[ "batstr", "splitpart", "command batstr.splitpart(X_1:bat[:str],
X_2:str, X_3:bat[:int]):bat[:str] ", "STRbatsplitpart_needlecst;", "" ]
[ "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;", "" ]
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
@@ -9094,6 +9094,8 @@ stdout of test 'MAL-signatures` in direc
[ "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:bat[:str], X_3:int):bat[:str] ", "STRbatsplitpart_fieldcst;", "" ]
+[ "batstr", "splitpart", "command batstr.splitpart(X_1:bat[:str],
X_2:str, X_3:bat[:int]):bat[:str] ", "STRbatsplitpart_needlecst;", "" ]
[ "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;", "" ]
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
@@ -1814,6 +1814,131 @@ bailout:
}
static str
+STRbatsplitpart_needlecst(bat *res, const bat *bid, const str *needle, const
bat *fid)
+{
+ BATiter bi;
+ BAT *bn = NULL, *b = NULL, *f = NULL;
+ BUN p, q;
+ size_t buflen = INITIAL_STR_BUFFER_LENGTH;
+ int *restrict field;
+ str x, y = *needle, buf = GDKmalloc(buflen), msg = MAL_SUCCEED;
+ bool nils = false;
+
+ if (!buf) {
+ msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (!(b = BATdescriptor(*bid)) || !(f = BATdescriptor(*fid))) {
+ msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ if (BATcount(b) != BATcount(f)) {
+ msg = createException(MAL, "batstr.splitpart", ILLEGAL_ARGUMENT
" Requires bats of identical size");
+ goto bailout;
+ }
+ q = BATcount(b);
+ if (!(bn = COLnew(b->hseqbase, TYPE_str, q, TRANSIENT))) {
+ msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ bi = bat_iterator(b);
+ field = Tloc(f, 0);
+ for (p = 0; p < q ; p++) {
+ x = (str) BUNtail(bi, p);
+
+ if ((msg = str_splitpart(&buf, &buflen, x, y, field[p])) !=
MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != GDK_SUCCEED) {
+ msg = createException(MAL, "batstr.splitpart",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils |= strNil(buf);
+ }
+
+bailout:
+ GDKfree(buf);
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (f)
+ BBPunfix(f->batCacheid);
+ if (bn && !msg) {
+ BATsetcount(bn, q);
+ bn->tnil = nils;
+ bn->tnonil = !nils;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = b->tsorted;
+ bn->trevsorted = b->trevsorted;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn)
+ BBPreclaim(bn);
+ return msg;
+}
+
+static str
+STRbatsplitpart_fieldcst(bat *res, const bat *bid, const bat *nid, const int
*field)
+{
+ BATiter bi, ni;
+ BAT *bn = NULL, *b = NULL, *n = NULL;
+ BUN p, q;
+ size_t buflen = INITIAL_STR_BUFFER_LENGTH;
+ int f = *field;
+ str x, y, buf = GDKmalloc(buflen), msg = MAL_SUCCEED;
+ bool nils = false;
+
+ if (!buf) {
+ msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (!(b = BATdescriptor(*bid)) || !(n = BATdescriptor(*nid))) {
+ msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ if (BATcount(b) != BATcount(n)) {
+ msg = createException(MAL, "batstr.splitpart", ILLEGAL_ARGUMENT
" Requires bats of identical size");
+ goto bailout;
+ }
+ q = BATcount(b);
+ if (!(bn = COLnew(b->hseqbase, TYPE_str, q, TRANSIENT))) {
+ msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ bi = bat_iterator(b);
+ ni = bat_iterator(n);
+ for (p = 0; p < q ; p++) {
+ x = (str) BUNtail(bi, p);
+ y = (str) BUNtail(ni, p);
+
+ if ((msg = str_splitpart(&buf, &buflen, x, y, f)) !=
MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != GDK_SUCCEED) {
+ msg = createException(MAL, "batstr.splitpart",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils |= strNil(buf);
+ }
+
+bailout:
+ GDKfree(buf);
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (n)
+ BBPunfix(n->batCacheid);
+ if (bn && !msg) {
+ BATsetcount(bn, q);
+ bn->tnil = nils;
+ bn->tnonil = !nils;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = b->tsorted;
+ bn->trevsorted = b->trevsorted;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn)
+ BBPreclaim(bn);
+ return msg;
+}
+
+static str
STRbatsplitpart(bat *res, const bat *l, const bat *r, const bat *t)
{
BATiter arg1i, arg2i;
@@ -2605,6 +2730,8 @@ mel_func batstr_init_funcs[] = {
command("batstr", "endsWith", STRbatSuffixcst, false, "Suffix check.",
args(1,3, batarg("",bit),batarg("s",str),arg("suffix",str))),
command("batstr", "splitpart", STRbatsplitpart, false, "Split string on
delimiter. Returns\ngiven field (counting from one.)", args(1,4,
batarg("",str),batarg("s",str),batarg("needle",str),batarg("field",int))),
command("batstr", "splitpart", STRbatsplitpartcst, false, "Split string on
delimiter. Returns\ngiven field (counting from one.)", args(1,4,
batarg("",str),batarg("s",str),arg("needle",str),arg("field",int))),
+ command("batstr", "splitpart", STRbatsplitpart_needlecst, false, "Split
string on delimiter. Returns\ngiven field (counting from one.)", args(1,4,
batarg("",str),batarg("s",str),arg("needle",str),batarg("field",int))),
+ command("batstr", "splitpart", STRbatsplitpart_fieldcst, false, "Split string
on delimiter. Returns\ngiven field (counting from one.)", args(1,4,
batarg("",str),batarg("s",str),batarg("needle",str),arg("field",int))),
command("batstr", "search", STRbatstrSearch, false, "Search for a substring.
Returns position, -1 if not found.", args(1,3,
batarg("",int),batarg("s",str),batarg("c",str))),
command("batstr", "search", STRbatstrSearchcst, false, "Search for a
substring. Returns position, -1 if not found.", args(1,3,
batarg("",int),batarg("s",str),arg("c",str))),
command("batstr", "r_search", STRbatRstrSearch, false, "Reverse search for a
substring. Returns position, -1 if not found.", args(1,3,
batarg("",int),batarg("s",str),batarg("c",str))),
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list