Changeset: f2a3cca4816f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f2a3cca4816f
Modified Files:
monetdb5/modules/kernel/batstr.c
Branch: alloc-less-str
Log Message:
Added missing bulk implementations
diffs (truncated from 378 to 300 lines):
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
@@ -39,7 +39,7 @@ do_batstr_int(bat *res, const bat *l, co
str x, msg = MAL_SUCCEED;
bool nils = false;
- if ((b = BATdescriptor(*l)) == NULL) {
+ if (!(b = BATdescriptor(*l))) {
msg = createException(MAL, name, SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -147,7 +147,7 @@ STRbatFromWChr(bat *res, const bat *l)
msg = createException(MAL, "batstr.unicode", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- if ((b = BATdescriptor(*l)) == NULL) {
+ if (!(b = BATdescriptor(*l))) {
msg = createException(MAL, "batstr.unicode", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -200,7 +200,7 @@ STRbatSpace(bat *res, const bat *l)
msg = createException(MAL, "batstr.space", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- if ((b = BATdescriptor(*l)) == NULL) {
+ if (!(b = BATdescriptor(*l))) {
msg = createException(MAL, "batstr.space", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -1468,6 +1468,89 @@ STRbatsubstringTailcst(bat *ret, const b
}
static str
+do_batstr_strcst(bat *res, const str *cst, const bat *l, const char *name, str
(*func)(str*, size_t*, const char*, int))
+{
+ BAT *bn = NULL, *b = NULL;
+ BUN p, q;
+ size_t buflen = INITIAL_STR_BUFFER_LENGTH;
+ const char *s = *cst;
+ int *restrict vals;
+ str buf = GDKmalloc(buflen), msg = MAL_SUCCEED;
+ bool nils = false;
+
+ if (!buf) {
+ msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (!(b = BATdescriptor(*l))) {
+ msg = createException(MAL, name, SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ q = BATcount(b);
+ if (!(bn = COLnew(b->hseqbase, TYPE_str, q, TRANSIENT))) {
+ msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ vals = Tloc(b, 0);
+ for (p = 0; p < q ; p++) {
+ if ((msg = (*func)(&buf, &buflen, s, vals[p])) != MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != GDK_SUCCEED) {
+ msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils |= strNil(buf);
+ }
+
+bailout:
+ GDKfree(buf);
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (bn && !msg) {
+ BATsetcount(bn, q);
+ bn->tnil = nils;
+ bn->tnonil = !nils;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = BATcount(bn) <= 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn)
+ BBPreclaim(bn);
+ return msg;
+}
+
+static str
+STRbatprefix_strcst(bat *ret, const str *cst, const bat *l)
+{
+ return do_batstr_strcst(ret, cst, l, "batstr.prefix", str_prefix);
+}
+
+static str
+STRbatsuffix_strcst(bat *ret, const str *cst, const bat *l)
+{
+ return do_batstr_strcst(ret, cst, l, "batstr.suffix", str_suffix);
+}
+
+static str
+STRbatrepeat_strcst(bat *ret, const str *cst, const bat *l)
+{
+ return do_batstr_strcst(ret, cst, l, "batstr.repeat", str_repeat);
+}
+
+static str
+STRbatTail_strcst(bat *ret, const str *cst, const bat *l)
+{
+ return do_batstr_strcst(ret, cst, l, "batstr.tail", str_tail);
+}
+
+static str
+STRbatsubstringTail_strcst(bat *ret, const str *cst, const bat *l)
+{
+ return do_batstr_strcst(ret, cst, l, "batstr.substring",
str_substring_tail);
+}
+
+static str
do_batstr_str_int(bat *res, const bat *l, const bat *r, const char *name, str
(*func)(str*, size_t*, const char*, int))
{
BATiter lefti;
@@ -1574,7 +1657,7 @@ STRbatSubstitutecst(bat *res, const bat
msg = createException(MAL, "batstr.substritute",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
goto bailout;
}
- if ((b = BATdescriptor(*bid)) == NULL) {
+ if (!(b = BATdescriptor(*bid))) {
msg = createException(MAL, "batstr.substritute",
SQLSTATE(HY005) RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -1699,7 +1782,7 @@ STRbatsplitpartcst(bat *res, const bat *
msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- if ((b = BATdescriptor(*bid)) == NULL) {
+ if (!(b = BATdescriptor(*bid))) {
msg = createException(MAL, "batstr.splitpart", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -1962,7 +2045,7 @@ STRbatInsertcst(bat *res, const bat *bid
msg = createException(MAL, "batstr.insert", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- if ((b = BATdescriptor(*bid)) == NULL) {
+ if (!(b = BATdescriptor(*bid))) {
msg = createException(MAL, "batstr.insert", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -2020,7 +2103,7 @@ STRbatsubstringcst(bat *res, const bat *
msg = createException(MAL, "batstr.substring", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- if ((b = BATdescriptor(*bid)) == NULL) {
+ if (!(b = BATdescriptor(*bid))) {
msg = createException(MAL, "batstr.substring", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -2061,6 +2144,130 @@ bailout:
}
static str
+STRbatsubstringcst_startcst(bat *res, const bat *bid, const int *start, const
bat *l)
+{
+ BATiter bi;
+ BAT *bn = NULL, *b = NULL, *lb = NULL;
+ BUN p, q;
+ size_t buflen = INITIAL_STR_BUFFER_LENGTH;
+ int s = *start, *len;
+ str x, buf = GDKmalloc(buflen), msg = MAL_SUCCEED;
+ bool nils = false;
+
+ if (!buf) {
+ msg = createException(MAL, "batstr.substring", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (!(b = BATdescriptor(*bid)) || !(lb = BATdescriptor(*l))) {
+ msg = createException(MAL, "batstr.substring", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ if (BATcount(b) != BATcount(lb)) {
+ msg = createException(MAL, "batstr.substring", 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.substring", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ bi = bat_iterator(b);
+ len = Tloc(lb, 0);
+ for (p = 0; p < q ; p++) {
+ x = (str) BUNtail(bi, p);
+
+ if ((msg = str_sub_string(&buf, &buflen, x, s, len[p])) !=
MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != GDK_SUCCEED) {
+ msg = createException(MAL, "batstr.substring",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils |= strNil(buf);
+ }
+
+bailout:
+ GDKfree(buf);
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (lb)
+ BBPunfix(lb->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
+STRbatsubstringcst_indexcst(bat *res, const bat *bid, const bat *l, const int
*index)
+{
+ BATiter bi;
+ BAT *bn = NULL, *b = NULL, *lb = NULL;
+ BUN p, q;
+ size_t buflen = INITIAL_STR_BUFFER_LENGTH;
+ int *start, in = *index;
+ str x, buf = GDKmalloc(buflen), msg = MAL_SUCCEED;
+ bool nils = false;
+
+ if (!buf) {
+ msg = createException(MAL, "batstr.substring", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (!(b = BATdescriptor(*bid)) || !(lb = BATdescriptor(*l))) {
+ msg = createException(MAL, "batstr.substring", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ if (BATcount(b) != BATcount(lb)) {
+ msg = createException(MAL, "batstr.substring", 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.substring", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ bi = bat_iterator(b);
+ start = Tloc(lb, 0);
+ for (p = 0; p < q ; p++) {
+ x = (str) BUNtail(bi, p);
+
+ if ((msg = str_sub_string(&buf, &buflen, x, start[p], in)) !=
MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != GDK_SUCCEED) {
+ msg = createException(MAL, "batstr.substring",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils |= strNil(buf);
+ }
+
+bailout:
+ GDKfree(buf);
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (lb)
+ BBPunfix(lb->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
STRbatsubstring(bat *res, const bat *l, const bat *r, const bat *t)
{
BATiter lefti;
@@ -2172,6 +2379,52 @@ bailout:
}
static str
+STRbatstrLocate_strcst(bat *res, const str *s, const bat *l)
+{
+ BATiter bi;
+ BAT *bn = NULL, *b = NULL;
+ BUN p, q;
+ int *restrict vals, next;
+ str x = *s, y, msg = MAL_SUCCEED;
+ bool nils = false;
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list