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