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

Reply via email to