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

Reply via email to