Changeset: 010a9c4cd72e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=010a9c4cd72e
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/test/miscellaneous/Tests/simple_selects.stable.out
Branch: typing
Log Message:

Merged with Oct2020


diffs (truncated from 3557 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
@@ -5877,9 +5877,14 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "window_bound", "pattern batsql.window_bound(X_1:bat[:bit], 
X_2:bat[:any_1], X_3:int, X_4:int, X_5:int, X_6:int):bat[:lng] ",   
"SQLwindow_bound;",     ""      ]
 [ "batsql",    "window_bound", "pattern batsql.window_bound(X_1:bat[:bit], 
X_2:bat[:any_1], X_3:int, X_4:int, X_5:int, X_6:lng):bat[:lng] ",   
"SQLwindow_bound;",     ""      ]
 [ "batsql",    "window_bound", "pattern batsql.window_bound(X_1:bat[:bit], 
X_2:bat[:any_1], X_3:int, X_4:int, X_5:int, X_6:sht):bat[:lng] ",   
"SQLwindow_bound;",     ""      ]
+[ "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",    "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;", ""      ]
+[ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",       "STRbatstrLocate;",     ""      ]
+[ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrLocatecst;",  ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:bat[:str]):bat[:str] ",  "STRbatLpad2_bat_bat;", ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:str):bat[:str] ",        "STRbatLpad2_bat_const;",       ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:int, 
X_3:bat[:str]):bat[:str] ",        "STRbatLpad2_const_bat;",       ""      ]
@@ -5892,7 +5897,8 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "nbytes",       "command batstr.nbytes(X_1:bat[:str]):bat[:int] 
",      "STRbatBytes;", ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",     "STRbatRstrSearch;",    ""      ]
 [ "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:int):bat[:str] ",     "STRbatrepeat;",        ""      ]
+[ "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",    "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;",       ""      ]
@@ -5908,8 +5914,10 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:str):bat[:bit] ", "STRbatPrefixcst;",     ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatTail;",  ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatTailcst;",       ""      ]
-[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefix;",        ""      ]
-[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffix;",        ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",   "STRbatprefix;",        ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefixcst;",     ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",  "STRbatsuffix;",        ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffixcst;",     ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:str, X_3:str, X_4:bit):bat[:str] ",       "STRbatSubstitutecst;", ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:bat[:int]):bat[:str] ",     "STRbatsubstring;",     ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
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
@@ -8153,9 +8153,14 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "window_bound", "pattern batsql.window_bound(X_1:bat[:bit], 
X_2:bat[:any_1], X_3:int, X_4:int, X_5:int, X_6:int):bat[:lng] ",   
"SQLwindow_bound;",     ""      ]
 [ "batsql",    "window_bound", "pattern batsql.window_bound(X_1:bat[:bit], 
X_2:bat[:any_1], X_3:int, X_4:int, X_5:int, X_6:lng):bat[:lng] ",   
"SQLwindow_bound;",     ""      ]
 [ "batsql",    "window_bound", "pattern batsql.window_bound(X_1:bat[:bit], 
X_2:bat[:any_1], X_3:int, X_4:int, X_5:int, X_6:sht):bat[:lng] ",   
"SQLwindow_bound;",     ""      ]
+[ "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",    "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;", ""      ]
+[ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",       "STRbatstrLocate;",     ""      ]
+[ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrLocatecst;",  ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:bat[:str]):bat[:str] ",  "STRbatLpad2_bat_bat;", ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:str):bat[:str] ",        "STRbatLpad2_bat_const;",       ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:int, 
X_3:bat[:str]):bat[:str] ",        "STRbatLpad2_const_bat;",       ""      ]
@@ -8168,7 +8173,8 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "nbytes",       "command batstr.nbytes(X_1:bat[:str]):bat[:int] 
",      "STRbatBytes;", ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",     "STRbatRstrSearch;",    ""      ]
 [ "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:int):bat[:str] ",     "STRbatrepeat;",        ""      ]
+[ "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",    "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;",       ""      ]
@@ -8184,8 +8190,10 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:str):bat[:bit] ", "STRbatPrefixcst;",     ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatTail;",  ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatTailcst;",       ""      ]
-[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefix;",        ""      ]
-[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffix;",        ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",   "STRbatprefix;",        ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefixcst;",     ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",  "STRbatsuffix;",        ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffixcst;",     ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:str, X_3:str, X_4:bit):bat[:str] ",       "STRbatSubstitutecst;", ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:bat[:int]):bat[:str] ",     "STRbatsubstring;",     ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -1709,11 +1709,7 @@ setWidth(void)
                else
 #endif
                {
-#ifdef WIN32
-                       pagewidth = 79;  /* 80 columns minus 1 for the edge */
-#else
                        pagewidth = -1;
-#endif
                }
        }
 }
diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -128,17 +128,17 @@ SQLhelp sqlhelp1[] = {
        {"CREATE AGGREGATE",
         "Create an user-defined aggregate function. The body of the aggregate 
function\n"
         "can also be defined in other programming languages such as Python, R, 
C or CPP.",
-        "CREATE [ OR REPLACE ] AGGREGATE qname '(' { '*' | [ param [',' ...]] 
} ')'\n"
+        "CREATE [ OR REPLACE ] AGGREGATE [ FUNCTION ] qname '(' { '*' | [ 
param [',' ...]] } ')'\n"
         "    RETURNS data_type\n"
         "    EXTERNAL NAME ident ',' ident\n"
-        "CREATE [ OR REPLACE ] AGGREGATE qname '(' { '*' | [ param [',' ...]] 
} ')'\n"
+        "CREATE [ OR REPLACE ] AGGREGATE [ FUNCTION ] qname '(' { '*' | [ 
param [',' ...]] } ')'\n"
         "    RETURNS data_type\n"
         "    LANGUAGE language_keyword external_code",
         "qname,param,data_type,ident,language_keyword,external_code",
         "See also 
https://www.monetdb.org/Documentation/Manuals/SQLreference/Functions"},
        {"CREATE FILTER FUNCTION",
         "",
-        "CREATE [ OR REPLACE ] FILTER FUNCTION qname '(' { '*' | [ param [',' 
...]] } ')'\n"
+        "CREATE [ OR REPLACE ] FILTER [ FUNCTION ] qname '(' { '*' | [ param 
[',' ...]] } ')'\n"
         "    RETURNS { data_type | TABLE '(' function_return [',' ...] ')' }\n"
         "    EXTERNAL NAME ident ',' ident",
         "qname,param,data_type,function_return,ident",
@@ -164,7 +164,7 @@ SQLhelp sqlhelp1[] = {
         "See also 
https://www.monetdb.org/Documentation/Manuals/SQLreference/Indices"},
        {"CREATE LOADER",
         "Create a custom (external) data loader function. The body is defined 
in Python language",
-        "CREATE [ OR REPLACE ] LOADER qname '(' [ param [',' ...]] ')'\n"
+        "CREATE [ OR REPLACE ] LOADER [ FUNCTION ] qname '(' [ param [',' 
...]] ')'\n"
         "    LANGUAGE PYTHON external_code",
         "qname,param,external_code",
         "See also 
https://www.monetdb.org/blog/monetdbpython-loader-functions"},
@@ -308,14 +308,20 @@ SQLhelp sqlhelp1[] = {
         NULL},
        {"DROP AGGREGATE",
         "",
-        "DROP ALL AGGREGATE qname [ RESTRICT | CASCADE ]\n"
-        "DROP AGGREGATE [ IF EXISTS ] qname [ '(' [ param [',' ...]] ')' ] [ 
RESTRICT | CASCADE ]",
+        "DROP ALL AGGREGATE [ FUNCTION ] qname [ RESTRICT | CASCADE ]\n"
+        "DROP AGGREGATE [ FUNCTION ] [ IF EXISTS ] qname [ '(' [ param [',' 
...]] ')' ] [ RESTRICT | CASCADE ]",
+        "param",
+        NULL},
+       {"DROP FILTER FUNCTION",
+        "",
+        "DROP ALL FILTER [ FUNCTION ] qname [ RESTRICT | CASCADE ]\n"
+        "DROP FILTER [ FUNCTION ] [ IF EXISTS ] qname [ '(' [ param [',' ...]] 
')' ] [ RESTRICT | CASCADE ]",
         "param",
         NULL},
        {"DROP FUNCTION",
         "",
-        "DROP ALL [FILTER] FUNCTION qname [ RESTRICT | CASCADE ]\n"
-        "DROP [FILTER] FUNCTION [ IF EXISTS ] qname [ '(' [ param [',' ...]] 
')' ] [ RESTRICT | CASCADE ]",
+        "DROP ALL FUNCTION qname [ RESTRICT | CASCADE ]\n"
+        "DROP FUNCTION [ IF EXISTS ] qname [ '(' [ param [',' ...]] ')' ] [ 
RESTRICT | CASCADE ]",
         "param",
         NULL},
        {"DROP INDEX",
@@ -325,8 +331,8 @@ SQLhelp sqlhelp1[] = {
         NULL},
        {"DROP LOADER",
         "",
-        "DROP ALL LOADER qname [ RESTRICT | CASCADE ]\n"
-        "DROP LOADER [ IF EXISTS ] qname [ '(' [ param [',' ...]] ')' ] [ 
RESTRICT | CASCADE ]",
+        "DROP ALL LOADER [ FUNCTION ] qname [ RESTRICT | CASCADE ]\n"
+        "DROP LOADER [ FUNCTION ] [ IF EXISTS ] qname [ '(' [ param [',' ...]] 
')' ] [ RESTRICT | CASCADE ]",
         "param",
         NULL},
        {"DROP PROCEDURE",
@@ -375,10 +381,10 @@ SQLhelp sqlhelp1[] = {
         "DROP VIEW [ IF EXISTS ] qname [ RESTRICT | CASCADE ]",
         NULL,
         NULL},
-       {"DROP WINDOW",
+       {"DROP WINDOW [ FUNCTION ]",
         "",
-        "DROP ALL WINDOW qname [ RESTRICT | CASCADE ]\n"
-        "DROP WINDOW [ IF EXISTS ] qname [ '(' [ param [',' ...]] ')' ] [ 
RESTRICT | CASCADE ]",
+        "DROP ALL WINDOW [ FUNCTION ] qname [ RESTRICT | CASCADE ]\n"
+        "DROP WINDOW [ FUNCTION ] [ IF EXISTS ] qname [ '(' [ param [',' ...]] 
')' ] [ RESTRICT | CASCADE ]",
         "param",
         NULL},
        {"EXECUTE",
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -86,7 +86,7 @@ get_tl_error_buf(void)
                p = malloc(sizeof(*p));
                if (p == NULL)
                        return NULL;
-               *p = (struct tl_error_buf) { 0 };
+               *p = (struct tl_error_buf) { .msg = 0 };
                pthread_setspecific(tl_error_key, p);
                struct tl_error_buf *second_attempt = 
pthread_getspecific(tl_error_key);
                assert(p == second_attempt /* maybe mnstr_init has not been 
called? */);
@@ -124,7 +124,7 @@ get_tl_error_buf(void)
                p = malloc(sizeof(*p));
                if (p == NULL)
                        return NULL;
-               *p = (struct tl_error_buf) { 0 };
+               *p = (struct tl_error_buf) { .msg = 0 };
                if (!TlsSetValue(tl_error_key, p)) {
                        free(p);
                        return NULL;
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -14075,7 +14075,7 @@ BATconvert(BAT *b, BAT *s, int tp, bool 
 
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
-       if ((bn->ttype != TYPE_bit && b->ttype != TYPE_str) ||
+       if ((bn->ttype != TYPE_str && bn->ttype != TYPE_bit && b->ttype != 
TYPE_str) ||
            BATcount(bn) < 2) {
                bn->tsorted = nils == 0 && b->tsorted;
                bn->trevsorted = nils == 0 && b->trevsorted;
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
@@ -118,6 +118,42 @@ STRbatBytes(bat *ret, const bat *l)
 }
 
 static str
+STRbatAscii(bat *ret, const bat *l)
+{
+       BATiter bi;
+       BAT *bn, *b;
+       BUN p, q;
+       str x;
+       int y;
+       str msg = MAL_SUCCEED;
+
+       prepareOperand(b, l, "batstr.Ascii");
+       prepareResult(bn, b, TYPE_int, "batstr.Ascii");
+
+       bi = bat_iterator(b);
+
+       BATloop(b, p, q) {
+               x = (str) BUNtvar(bi, p);
+               if ((msg = STRascii(&y, &x)) != MAL_SUCCEED)
+                       goto bunins_failed;
+               if (is_int_nil(y)) {
+                       bn->tnonil = false;
+                       bn->tnil = true;
+               }
+               if (bunfastappTYPE(int, bn, &y) != GDK_SUCCEED)
+                       goto bunins_failed;
+       }
+       finalizeResult(ret, bn, b);
+       return MAL_SUCCEED;
+bunins_failed:
+       BBPunfix(b->batCacheid);
+       BBPunfix(bn->batCacheid);
+       if (msg != MAL_SUCCEED)
+               return msg;
+       throw(MAL, "batstr.Ascii", OPERATION_FAILED " During bulk operation");
+}
+
+static str
 do_batstr_str(bat *ret, const bat *l, const char *name, str (*func)(str *, 
const str *))
 {
        BATiter bi;
@@ -996,85 +1032,6 @@ STRbatRstrSearchcst(bat *ret, const bat 
 }
 
 static str
-STRbatTail(bat *ret, const bat *l, const bat *r)
-{
-       BATiter lefti, righti;
-       BAT *bn, *left, *right;
-       BUN p,q;
-       str v;
-       str msg = MAL_SUCCEED;
-
-       prepareOperand2(left,l,right,r,"batstr.string");
-       if(BATcount(left) != BATcount(right)) {
-               BBPunfix(left->batCacheid);
-               BBPunfix(right->batCacheid);
-               throw(MAL, "batstr.string", ILLEGAL_ARGUMENT " Requires bats of 
identical size");
-       }
-       prepareResult2(bn,left,right,TYPE_str,"batstr.string");
-
-       lefti = bat_iterator(left);
-       righti = bat_iterator(right);
-
-       BATloop(left, p, q) {
-               str tl = (str) BUNtvar(lefti,p);
-               int *tr = (int *) BUNtloc(righti,p);
-               if ((msg = STRTail(&v, &tl, tr)) != MAL_SUCCEED)
-                       goto bunins_failed;
-               if (bunfastappVAR(bn, v) != GDK_SUCCEED)
-                       goto bunins_failed;
-               GDKfree(v);
-       }
-       bn->tnonil = false;
-       BBPunfix(right->batCacheid);
-       finalizeResult(ret,bn,left);
-       return MAL_SUCCEED;
-
-bunins_failed:
-       BBPunfix(left->batCacheid);
-       BBPunfix(right->batCacheid);
-       BBPunfix(*ret);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to