Changeset: 3738c58550ac for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3738c58550ac
Modified Files:
        clients/Tests/MAL-signatures-hge.test
        clients/Tests/MAL-signatures.test
        monetdb5/modules/kernel/batstr.c
Branch: Jun2023
Log Message:

Add missing BATSTRasciify with candidate + approve new signature.


diffs (136 lines):

diff --git a/clients/Tests/MAL-signatures-hge.test 
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -34585,7 +34585,12 @@ STRbatAscii;
 Return unicode of head of string
 batstr
 asciify
-command batstr.asciify(X_0:bat[:str]):bat[:str] 
+pattern batstr.asciify(X_0:bat[:str]):bat[:str] 
+BATSTRasciify;
+Transform BAT of strings from UTF8 to ASCII
+batstr
+asciify
+pattern batstr.asciify(X_0:bat[:str], X_1:bat[:oid]):bat[:str] 
 BATSTRasciify;
 Transform BAT of strings from UTF8 to ASCII
 batstr
diff --git a/clients/Tests/MAL-signatures.test 
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -25635,7 +25635,12 @@ STRbatAscii;
 Return unicode of head of string
 batstr
 asciify
-command batstr.asciify(X_0:bat[:str]):bat[:str] 
+pattern batstr.asciify(X_0:bat[:str]):bat[:str] 
+BATSTRasciify;
+Transform BAT of strings from UTF8 to ASCII
+batstr
+asciify
+pattern batstr.asciify(X_0:bat[:str], X_1:bat[:oid]):bat[:str] 
 BATSTRasciify;
 Transform BAT of strings from UTF8 to ASCII
 batstr
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
@@ -5093,13 +5093,19 @@ bailout:
 }
 
 static str
-BATSTRasciify(bat *ret, bat *bid)
+BATSTRasciify(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
 #ifdef HAVE_ICONV
-       BAT *b = NULL, *bn = NULL;
+       (void)cntxt;
+       (void)mb;
+       bat *rid = getArgReference_bat(stk, pci, 0),
+               *bid = getArgReference_bat(stk, pci, 1),
+               *sid = pci->argc == 2 ? NULL : getArgReference_bat(stk, pci, 2);
+       BAT *b = NULL, *bs = NULL, *bn = NULL;
        BATiter bi;
-       BUN p, q = 0;
-       bool nils = false;
+       struct canditer ci = {0};
+       oid off;
+       bool nils = false, dense = false;
        size_t prev_out_len = 0, in_len = 0, out_len = 0;
        str s = NULL, out = NULL, in = NULL, msg = MAL_SUCCEED;
        iconv_t cd;
@@ -5108,20 +5114,34 @@ BATSTRasciify(bat *ret, bat *bid)
        /* man iconv; /TRANSLIT */
        if ((cd = iconv_open(t, f)) == (iconv_t)(-1))
                throw(MAL, "batstr.asciify", "ICONV: cannot convert from (%s) 
to (%s).", f, t);
-       if ((b = BATdescriptor(*bid)) == NULL)
+
+       if (!(b = BATdescriptor(*bid)))
                throw(MAL, "batstr.asciify", RUNTIME_OBJECT_MISSING);
-       if ((bn = COLnew(b->hseqbase, TYPE_str, BATcount(b), TRANSIENT)) == 
NULL) {
+
+       if (sid && !is_bat_nil(*sid) && !(bs = BATdescriptor(*sid)))
+               throw(MAL, "batstr.asciify", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+
+       canditer_init(&ci, b, bs);
+
+       if ((bn = COLnew(ci.hseq, TYPE_str, ci.ncand, TRANSIENT)) == NULL) {
                BBPreclaim(b);
+               BBPreclaim(bs);
                throw(MAL, "batstr.asciify", GDK_EXCEPTION);
        }
+
+       off = b->hseqbase;
        bi = bat_iterator(b);
+
        if ((s = out = GDKmalloc(64*1024)) == NULL) {
                msg = createException(MAL,"batstr.asciify", MAL_MALLOC_FAIL);
                goto exit;
        }
        prev_out_len = 64*1024;
-       BATloop(b, p, q) {
-               in = (str) BUNtail(bi, p);
+
+       dense = ci.tpe == cand_dense ? true : false;
+       for (BUN i = 0; i < ci.ncand; i++) {
+               oid p = dense ? (canditer_next_dense(&ci) - off) : 
(canditer_next(&ci) - off);
+               in = BUNtvar(bi, p);
                if (strNil(in)) {
                        if (BUNappend(bn, str_nil, false) != GDK_SUCCEED) {
                                msg = createException(MAL,"batstr.asciify", 
"BUNappend failed.");
@@ -5130,7 +5150,8 @@ BATSTRasciify(bat *ret, bat *bid)
                        nils = true;
                        continue;
                }
-               in_len = strlen(in), out_len = in_len*4; /* over sized as 
single utf8 symbols change into multiple ascii characters */
+               /* over sized as single utf8 symbols change into multiple ascii 
characters */
+               in_len = strlen(in), out_len = in_len*4;
                if (out_len > prev_out_len) {
                        if ((out = GDKrealloc(s, out_len)) == NULL) {
                                msg = createException(MAL,"batstr.asciify", 
MAL_MALLOC_FAIL);
@@ -5150,12 +5171,13 @@ BATSTRasciify(bat *ret, bat *bid)
                        goto exit;
                }
        }
+
  exit:
        GDKfree(s);
        bat_iterator_end(&bi);
        iconv_close(cd);
-       finalize_output(ret, bn, msg, nils, q);
-       BBPreclaim(b);
+       finalize_output(rid, bn, msg, nils, ci.ncand);
+       unfix_inputs(2, b, bs);
        return msg;
 #else
        throw(MAL, "batstr.asciify", "ICONV library not available.");
@@ -5452,7 +5474,8 @@ mel_func batstr_init_funcs[] = {
        pattern("batstr", "repeat", STRbatrepeat_strcst, false, "", args(1,4, 
batarg("",str),arg("s",str),batarg("c",int),batarg("s",oid))),
        pattern("batstr", "space", STRbatSpace, false, "", args(1,2, 
batarg("",str),batarg("l",int))),
        pattern("batstr", "space", STRbatSpace, false, "", args(1,3, 
batarg("",str),batarg("l",int),batarg("s",oid))),
-       command("batstr", "asciify", BATSTRasciify, false, "Transform BAT of 
strings from UTF8 to ASCII", args(1, 2, batarg("",str), batarg("b",str))),
+       pattern("batstr", "asciify", BATSTRasciify, false, "Transform BAT of 
strings from UTF8 to ASCII", args(1, 2, batarg("",str), batarg("b",str))),
+       pattern("batstr", "asciify", BATSTRasciify, false, "Transform BAT of 
strings from UTF8 to ASCII", args(1, 3, batarg("",str), 
batarg("b",str),batarg("s",oid))),
        command("batstr", "reverse", BATSTRreverse, false, "Reverse a BAT of 
strings", args(1, 2, batarg("",str), batarg("b",str))),
        { .imp=NULL }
 };
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to