Changeset: 14adcbd67a10 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=14adcbd67a10 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 gdk/gdk_batop.c gdk/gdk_project.c gdk/gdk_select.c monetdb5/mal/mal_runtime.c monetdb5/modules/atoms/blob.c sql/backends/monet5/rel_bin.c sql/server/rel_optimizer.c testing/Mtest.py.in Branch: unlock Log Message:
merged with default diffs (truncated from 4325 to 300 lines): diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -796,3 +796,5 @@ 929f5e280bc1532a2bfaab127ca7915dc3b69a33 742b7847cfdcea39a6c19ab29eb35471d46bb2bb Oct2020_11 929f5e280bc1532a2bfaab127ca7915dc3b69a33 Oct2020_SP2_release 742b7847cfdcea39a6c19ab29eb35471d46bb2bb Oct2020_SP2_release +17d27ad30941c81e4bc700300912e84e9b9a8c37 Oct2020_13 +17d27ad30941c81e4bc700300912e84e9b9a8c37 Oct2020_SP3_release diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -84,7 +84,7 @@ Group: Applications/Databases License: MPLv2.0 URL: https://www.monetdb.org/ BugURL: https://bugs.monetdb.org/ -Source: https://www.monetdb.org/downloads/sources/Oct2020-SP2/%{name}-%{version}.tar.bz2 +Source: https://www.monetdb.org/downloads/sources/Oct2020-SP3/%{name}-%{version}.tar.bz2 # The Fedora packaging document says we need systemd-rpm-macros for # the _unitdir and _tmpfilesdir macros to exist; however on RHEL 7 @@ -828,6 +828,10 @@ else fi %changelog +* Thu Feb 11 2021 Sjoerd Mullender <sjo...@acm.org> - 11.39.13-20210211 +- Rebuilt. +- GH#7049: Implement DISTINCT for GROUP_CONCAT + * Mon Jan 18 2021 Sjoerd Mullender <sjo...@acm.org> - 11.39.11-20210118 - Rebuilt. - GH#3772: Any user can grant a role. 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 @@ -3818,6 +3818,7 @@ stdout of test 'MAL-signatures` in direc [ "batcalc", "bit_noerror", "pattern batcalc.bit_noerror(X_1:bat[:sht], X_2:bat[:oid]):bat[:bit] ", "CMDconvert_bit;", "" ] [ "batcalc", "bit_noerror", "pattern batcalc.bit_noerror(X_1:bat[:str]):bat[:bit] ", "CMDconvert_bit;", "" ] [ "batcalc", "bit_noerror", "pattern batcalc.bit_noerror(X_1:bat[:str], X_2:bat[:oid]):bat[:bit] ", "CMDconvert_bit;", "" ] +[ "batcalc", "blob", "command batcalc.blob(X_1:bat[:blob], X_2:bat[:oid]):bat[:blob] ", "BLOBblob_blob_bulk;", "" ] [ "batcalc", "blob", "command batcalc.blob(X_1:bat[:str], X_2:bat[:oid]):bat[:blob] ", "batstr_2_blob;", "" ] [ "batcalc", "bte", "pattern batcalc.bte(X_1:bat[:bit]):bat[:bte] ", "CMDconvertsignal_bte;", "" ] [ "batcalc", "bte", "pattern batcalc.bte(X_1:bat[:bit], X_2:bat[:oid]):bat[:bte] ", "CMDconvertsignal_bte;", "" ] 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 @@ -5442,6 +5442,7 @@ stdout of test 'MAL-signatures` in direc [ "batcalc", "bit_noerror", "pattern batcalc.bit_noerror(X_1:bat[:sht], X_2:bat[:oid]):bat[:bit] ", "CMDconvert_bit;", "" ] [ "batcalc", "bit_noerror", "pattern batcalc.bit_noerror(X_1:bat[:str]):bat[:bit] ", "CMDconvert_bit;", "" ] [ "batcalc", "bit_noerror", "pattern batcalc.bit_noerror(X_1:bat[:str], X_2:bat[:oid]):bat[:bit] ", "CMDconvert_bit;", "" ] +[ "batcalc", "blob", "command batcalc.blob(X_1:bat[:blob], X_2:bat[:oid]):bat[:blob] ", "BLOBblob_blob_bulk;", "" ] [ "batcalc", "blob", "command batcalc.blob(X_1:bat[:str], X_2:bat[:oid]):bat[:blob] ", "batstr_2_blob;", "" ] [ "batcalc", "bte", "pattern batcalc.bte(X_1:bat[:bit]):bat[:bte] ", "CMDconvertsignal_bte;", "" ] [ "batcalc", "bte", "pattern batcalc.bte(X_1:bat[:bit], X_2:bat[:oid]):bat[:bte] ", "CMDconvertsignal_bte;", "" ] diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -882,6 +882,34 @@ dump_column_definition(Mapi mid, stream mnstr_printf(toConsole, "\t"); space = dquoted_print(toConsole, c_name, " "); mnstr_printf(toConsole, "%*s", CAP(slen - space), ""); + if (s != NULL && t != NULL && + strcmp(c_type, "char") == 0 && strcmp(c_type_digits, "0") == 0) { + /* if the number of characters is not specified (due to a bug), + * calculate a size */ + char *c = descape(c_name); + if (c != NULL) { + size_t qlen = strlen(c) + strlen(s) + strlen(t) + 64; + char *q = malloc(qlen); + if (q != NULL) { + snprintf(q, qlen, "SELECT max(length(\"%s\")) FROM \"%s\".\"%s\"", c, s, t); + MapiHdl h = mapi_query(mid, q); + if (h != NULL) { + if (mapi_fetch_row(h) != 0) { + const char *d = mapi_fetch_field(h, 0); + free(c_type_digits); + /* if NULL, i.e. no non-NULL values, fill in 1 */ + c_type_digits = strdup(d ? d : "1"); + fprintf(stderr, "Warning: fixing size of CHAR column for %s of table %s.%s\n", c_name, schema, tname); + } + mapi_close_handle(h); + } + free(q); + } + free(c); + } + if (c_type_digits == NULL) + goto bailout; + } space = dump_type(mid, toConsole, c_type, c_type_digits, c_type_scale, hashge); if (strcmp(c_null, "false") == 0) { mnstr_printf(toConsole, "%*s NOT NULL", @@ -1256,7 +1284,11 @@ describe_table(Mapi mid, const char *sch goto bailout; while (mapi_fetch_row(hdl) != 0) expr = mapi_fetch_field(hdl, 0); - mnstr_printf(toConsole, " PARTITION BY %s %s (%s)", phow, pusing, expr); + mnstr_printf(toConsole, " PARTITION BY %s %s (", phow, pusing); + if (column) + dquoted_print(toConsole, expr, ")"); + else + mnstr_printf(toConsole, "%s)", expr); mapi_close_handle(hdl); } } diff --git a/cmake/monetdb-versions.cmake b/cmake/monetdb-versions.cmake --- a/cmake/monetdb-versions.cmake +++ b/cmake/monetdb-versions.cmake @@ -50,7 +50,7 @@ set(MONETDB_VERSION "${MONETDB_VERSION_M # version of the GDK library (subdirectory gdk; also includes # common/options and common/utils) set(GDK_VERSION_CURRENT "22") -set(GDK_VERSION_REVISION "1") +set(GDK_VERSION_REVISION "2") set(GDK_VERSION_AGE "1") math(EXPR GDK_VERSION_MAJOR "${GDK_VERSION_CURRENT} - ${GDK_VERSION_AGE}") set(GDK_VERSION "${GDK_VERSION_MAJOR}.${GDK_VERSION_AGE}.${GDK_VERSION_REVISION}") @@ -64,7 +64,7 @@ set(MAPI_VERSION "${MAPI_VERSION_MAJOR}. # version of the MONETDB5 library (subdirectory monetdb5, not including extras or sql) set(MONETDB5_VERSION_CURRENT "30") -set(MONETDB5_VERSION_REVISION "4") +set(MONETDB5_VERSION_REVISION "5") set(MONETDB5_VERSION_AGE "0") math(EXPR MONETDB5_VERSION_MAJOR "${MONETDB5_VERSION_CURRENT} - ${MONETDB5_VERSION_AGE}") set(MONETDB5_VERSION "${MONETDB5_VERSION_MAJOR}.${MONETDB5_VERSION_AGE}.${MONETDB5_VERSION_REVISION}") diff --git a/common/stream/Tests/All b/common/stream/Tests/All --- a/common/stream/Tests/All +++ b/common/stream/Tests/All @@ -14,3 +14,7 @@ HAVE_CURL?urlstream read_iconv write_iconv +HAVE_LIBBZ2?read_concatenated_bz2 +HAVE_LIBZ?read_concatenated_gz +HAVE_LIBLZ4&HAVE_PYTHON_LZ4?read_concatenated_lz4 +HAVE_LIBLZMA?read_concatenated_xz diff --git a/common/stream/Tests/read_concatenated_bz2.py b/common/stream/Tests/read_concatenated_bz2.py new file mode 100644 --- /dev/null +++ b/common/stream/Tests/read_concatenated_bz2.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 + +import sys, os +sys.path.append(os.environ.get('TSTSRCDIR','.')) +import read_tests + +read_tests.read_concatenated('bz2') diff --git a/common/stream/Tests/read_concatenated_gz.py b/common/stream/Tests/read_concatenated_gz.py new file mode 100644 --- /dev/null +++ b/common/stream/Tests/read_concatenated_gz.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 + +import sys, os +sys.path.append(os.environ.get('TSTSRCDIR','.')) +import read_tests + +read_tests.read_concatenated('gz') diff --git a/common/stream/Tests/read_concatenated_lz4.py b/common/stream/Tests/read_concatenated_lz4.py new file mode 100644 --- /dev/null +++ b/common/stream/Tests/read_concatenated_lz4.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 + +import sys, os +sys.path.append(os.environ.get('TSTSRCDIR','.')) +import read_tests + +read_tests.read_concatenated('lz4') diff --git a/common/stream/Tests/read_concatenated_xz.py b/common/stream/Tests/read_concatenated_xz.py new file mode 100644 --- /dev/null +++ b/common/stream/Tests/read_concatenated_xz.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 + +import sys, os +sys.path.append(os.environ.get('TSTSRCDIR','.')) +import read_tests + +read_tests.read_concatenated('xz') diff --git a/common/stream/Tests/read_tests.py b/common/stream/Tests/read_tests.py --- a/common/stream/Tests/read_tests.py +++ b/common/stream/Tests/read_tests.py @@ -115,6 +115,27 @@ def all_tests(filename_filter): return failures +def read_concatenated(ext): + tf1 = TestFile("concatenated1", ext) + tf1.write(b"hi") + compressed_content = open(tf1.path(), "rb").read() + + tf2 = TestFile("concatenated2", ext) + tf2.write_raw(compressed_content + compressed_content) + + cmd = ['streamcat', 'read', tf2.path(), "rstream"] + results = subprocess.run( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if results.returncode != 0 or results.stderr: + raise SystemExit(f"Command {cmd} returned with exit code {results.returncode}:\n{results.stderr or ''}") + + output = results.stdout + + expected = b'hihi' + if output != expected: + raise SystemExit(f"Expected {expected!r}, got {output!r}") + + if __name__ == "__main__": # generate test data for manual testing if len(sys.argv) == 1: diff --git a/common/stream/Tests/testdata.py b/common/stream/Tests/testdata.py --- a/common/stream/Tests/testdata.py +++ b/common/stream/Tests/testdata.py @@ -218,6 +218,13 @@ class TestFile: f.write(content) return filename + + def write_raw(self, content): + filename = self.path() + f = open(filename, 'wb') + f.write(content) + return filename + def read(self): filename = self.path() if not self.compression: diff --git a/common/stream/bz2_stream.c b/common/stream/bz2_stream.c --- a/common/stream/bz2_stream.c +++ b/common/stream/bz2_stream.c @@ -20,6 +20,7 @@ struct inner_state { bz_stream strm; int (*work)(bz_stream *strm, int flush); int (*end)(bz_stream *strm); + void (*reset)(inner_state_t *inner_state); bool eof_reached; char buf[64*1024]; }; @@ -108,6 +109,11 @@ work(inner_state_t *inner_state, pump_ac /* flushing and finishing is not yet done */ return PUMP_OK; case BZ_STREAM_END: + if (action == PUMP_NO_FLUSH && inner_state->reset != NULL) { + // attempt to read concatenated additional bz2 stream + inner_state->reset(inner_state); + return PUMP_OK; + } inner_state->eof_reached = true; return PUMP_END; default: @@ -122,6 +128,13 @@ finalizer(inner_state_t *inner_state) free(inner_state); } +static const char* +bz2_get_error(inner_state_t *inner_state) +{ + int dummy; + return BZ2_bzerror(&inner_state->strm, &dummy); +} + static int BZ2_bzDecompress_wrapper(bz_stream *strm, int a) { @@ -129,6 +142,17 @@ BZ2_bzDecompress_wrapper(bz_stream *strm return BZ2_bzDecompress(strm); } +static void +bz2_decompress_reset(inner_state_t *inner_state) +{ + pump_buffer src = get_src_win(inner_state); + pump_buffer dst = get_dst_win(inner_state); + BZ2_bzDecompressEnd(&inner_state->strm); + BZ2_bzDecompressInit(&inner_state->strm, 0, 0); + set_src_win(inner_state, src); + set_dst_win(inner_state, dst); +} + stream * bz2_stream(stream *inner, int level) { @@ -148,12 +172,14 @@ bz2_stream(stream *inner, int level) state->set_dst_win = set_dst_win; state->get_buffer = get_buffer; state->worker = work; + state->get_error = bz2_get_error; state->finalizer = finalizer; int ret; if (inner->readonly) { bz->work = BZ2_bzDecompress_wrapper; bz->end = BZ2_bzDecompressEnd; + bz->reset = bz2_decompress_reset; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list