Changeset: a3780e4d0491 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a3780e4d0491
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
Branch: typing
Log Message:

Merged with Oct2020


diffs (truncated from 1135 to 300 lines):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -116,9 +116,14 @@ BuildRequires: gcc
 BuildRequires: bison
 BuildRequires: /usr/bin/python3
 %if %{?rhel:1}%{!?rhel:0}
+# RH 7 (and for readline also 8)
 BuildRequires: bzip2-devel
+BuildRequires: unixODBC-devel
+BuildRequires: readline-devel
 %else
 BuildRequires: pkgconfig(bzip2)
+BuildRequires: pkgconfig(odbc)
+BuildRequires: pkgconfig(readline)
 %endif
 %if %{with fits}
 BuildRequires: pkgconfig(cfitsio)
@@ -128,23 +133,19 @@ BuildRequires: geos-devel >= 3.4.0
 %endif
 BuildRequires: pkgconfig(libcurl)
 BuildRequires: pkgconfig(liblzma)
-# BuildRequires: libmicrohttpd-devel
-BuildRequires: libuuid-devel
+BuildRequires: pkgconfig(uuid)
 BuildRequires: pkgconfig(libxml-2.0)
 BuildRequires: pkgconfig(openssl)
 %if %{with pcre}
 BuildRequires: pkgconfig(libpcre) >= 4.5
 %endif
-BuildRequires: readline-devel
-BuildRequires: unixODBC-devel
-# BuildRequires: uriparser-devel
 BuildRequires: pkgconfig(zlib)
 %if %{with py3integration}
-BuildRequires: python3-devel >= 3.5
+BuildRequires: pkgconfig(python3) >= 3.5
 BuildRequires: python3-numpy
 %endif
 %if %{with rintegration}
-BuildRequires: R-core-devel
+BuildRequires: pkgconfig(libR)
 %endif
 
 %if (0%{?fedora} >= 22)
diff --git a/README.rst b/README.rst
--- a/README.rst
+++ b/README.rst
@@ -105,9 +105,10 @@ The following packages are optional but 
 ``xz-devel``, ``zlib-devel``.
 
 The following packages are optional:
-``cfitsio-devel``, ``geos-devel``, ``libcurl-devel``, ``libxml2-devel``,
+``cfitsio-devel``, ``gdal-devel``, ``geos-devel``, ``libasan``,
+``libcurl-devel``, ``libxml2-devel``, ``netcdf-devel``, ``proj-devel``,
 ``python3-devel``, ``python3-numpy``, ``R-core-devel``,
-``unixODBC-devel``.
+``unixODBC-devel``, ``valgrind-devel``.
 
 On Ubuntu and Debian the following packages are required:
 ``bison``, ``cmake``, ``gcc``, ``libssl-dev``, ``pkg-config``,
@@ -118,9 +119,10 @@ The following packages are optional but 
 ``liblzma-dev``, ``zlib1g-dev``.
 
 The following packages are optional:
-``libcfitsio-dev``, ``libgeos-dev``, ``libcurl4-gnutls-dev``,
+``libasan5``, ``libcfitsio-dev``, ``libcurl4-gnutls-dev``,
+``libgdal-dev``, ``libgeos-dev``, ``libnetcdf-dev``, ``libproj-dev``,
 ``libxml2-dev``, ``python3-dev``, ``python3-numpy``, ``r-base-dev``,
-``unixodbc-dev``.
+``unixodbc-dev``, ``valgrind``.
 
 ``cmake`` must be at least version 3.12, ``python`` must be at least
 version 3.5.
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,9 @@ 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;",        ""      ]
 [ "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;",  ""      ]
@@ -5918,14 +5925,18 @@ stdout of test 'MAL-signatures` in direc
 [ "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:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ",     
"STRbatSubstitute;",    ""      ]
 [ "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:bat[:int]):bat[:str] ",    "STRbatsubstringTail;", ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int):bat[:str] ",  "STRbatsubstringTailcst;",      ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
 [ "batstr",    "toLower",      "command 
batstr.toLower(X_1:bat[:str]):bat[:str] ",     "STRbatLower;", ""      ]
 [ "batstr",    "toUpper",      "command 
batstr.toUpper(X_1:bat[:str]):bat[:str] ",     "STRbatUpper;", ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str], 
X_2:bat[:str]):bat[:str] ", "STRbatStrip2_bat;",    ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str], X_2:str):bat[:str] 
",       "STRbatStrip2_const;",  ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str]):bat[:str] ",        
"STRbatStrip;", ""      ]
+[ "batstr",    "unicode",      "command 
batstr.unicode(X_1:bat[:int]):bat[:str] ",     "STRbatFromWChr;",      ""      ]
 [ "batstr",    "unicodeAt",    "command batstr.unicodeAt(X_1:bat[:str], 
X_2:bat[:int]):bat[:int] ",    "STRbatWChrAt;",        ""      ]
 [ "batstr",    "unicodeAt",    "command batstr.unicodeAt(X_1:bat[:str], 
X_2:int):bat[:int] ",  "STRbatWChrAtcst;",     ""      ]
 [ "batudf",    "fuse", "command batudf.fuse(X_1:bat[:bte], 
X_2:bat[:bte]):bat[:sht] ", "UDFBATfuse;",  ""      ]
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,9 @@ 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;",        ""      ]
 [ "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;",  ""      ]
@@ -8194,14 +8201,18 @@ stdout of test 'MAL-signatures` in direc
 [ "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:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ",     
"STRbatSubstitute;",    ""      ]
 [ "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:bat[:int]):bat[:str] ",    "STRbatsubstringTail;", ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int):bat[:str] ",  "STRbatsubstringTailcst;",      ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
 [ "batstr",    "toLower",      "command 
batstr.toLower(X_1:bat[:str]):bat[:str] ",     "STRbatLower;", ""      ]
 [ "batstr",    "toUpper",      "command 
batstr.toUpper(X_1:bat[:str]):bat[:str] ",     "STRbatUpper;", ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str], 
X_2:bat[:str]):bat[:str] ", "STRbatStrip2_bat;",    ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str], X_2:str):bat[:str] 
",       "STRbatStrip2_const;",  ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str]):bat[:str] ",        
"STRbatStrip;", ""      ]
+[ "batstr",    "unicode",      "command 
batstr.unicode(X_1:bat[:int]):bat[:str] ",     "STRbatFromWChr;",      ""      ]
 [ "batstr",    "unicodeAt",    "command batstr.unicodeAt(X_1:bat[:str], 
X_2:bat[:int]):bat[:int] ",    "STRbatWChrAt;",        ""      ]
 [ "batstr",    "unicodeAt",    "command batstr.unicodeAt(X_1:bat[:str], 
X_2:int):bat[:int] ",  "STRbatWChrAtcst;",     ""      ]
 [ "batudf",    "fuse", "command batudf.fuse(X_1:bat[:bte], 
X_2:bat[:bte]):bat[:sht] ", "UDFBATfuse;",  ""      ]
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
@@ -154,6 +154,89 @@ bunins_failed:
 }
 
 static str
+STRbatFromWChr(bat *ret, const bat *l)
+{
+       BAT *bn, *b;
+       BUN q;
+       str y;
+       int *restrict input;
+       str msg = MAL_SUCCEED;
+
+       prepareOperand(b, l, "batstr.unicode");
+       prepareResult(bn, b, TYPE_str, "batstr.unicode");
+       input = Tloc(b, 0);
+       q = BATcount(b);
+
+       for (BUN p = 0 ; p < q; p++) {
+               int x = input[p];
+               gdk_return res;
+
+               if ((msg = STRFromWChr(&y, &x)) != MAL_SUCCEED)
+                       goto bailout;
+               res = bunfastappVAR(bn, y);
+               GDKfree(y);
+               if (res != GDK_SUCCEED)
+                       goto bailout;
+       }
+       bn->tnonil = b->tnonil;
+       bn->tnil = b->tnonil;
+       finalizeResult(ret, bn, b);
+       return MAL_SUCCEED;
+
+bailout:
+       BBPunfix(b->batCacheid);
+       BBPunfix(bn->batCacheid);
+       if (msg != MAL_SUCCEED)
+               return msg;
+       throw(MAL, "batstr.unicode", OPERATION_FAILED " During bulk operation");
+}
+
+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;
@@ -1162,6 +1245,12 @@ STRbatTailcst(bat *ret, const bat *l, co
 }
 
 static str
+STRbatsubstringTailcst(bat *ret, const bat *l, const int *cst)
+{
+       return do_batstr_str_int_cst(ret, l, cst, "batstr.substring", 
STRsubstringTail);
+}
+
+static str
 do_batstr_str_int(bat *ret, const bat *l, const bat *r, const char *name, str 
(*func)(str *, const str *, const int *))
 {
        BATiter lefti;
@@ -1231,42 +1320,472 @@ STRbatTail(bat *ret, const bat *l, const
 }
 
 static str
+STRbatsubstringTail(bat *ret, const bat *l, const bat *r)
+{
+       return do_batstr_str_int(ret, l, r, "batstr.substring", 
STRsubstringTail);
+}
+
+static str
 STRbatSubstitutecst(bat *ret, const bat *l, const str *arg2, const str *arg3, 
const bit *rep)
 {
-       BATiter bi;
-       BAT *bn, *b;
-       BUN p, q;
-       str x;
-       str y;
-       str err = MAL_SUCCEED;
+       BATiter lefti;
+       BAT *bn, *left;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to