MonetDB: jitudf - When mprotect triggers, check if the address a...
Changeset: c5b67bdd8bcd for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5b67bdd8bcd Modified Files: sql/backends/monet5/UDF/capi/capi.c Branch: jitudf Log Message: When mprotect triggers, check if the address actually falls in the area we protected. diffs (192 lines): diff --git a/sql/backends/monet5/UDF/capi/capi.c b/sql/backends/monet5/UDF/capi/capi.c --- a/sql/backends/monet5/UDF/capi/capi.c +++ b/sql/backends/monet5/UDF/capi/capi.c @@ -27,8 +27,24 @@ typedef struct _allocated_region { struct _allocated_region *next; } allocated_region; -static __thread allocated_region *allocated_regions; -static __thread jmp_buf jump_buffer; +struct _mprotected_region; +typedef struct _mprotected_region { + void *addr; + size_t len; + + void* actual_addr; + size_t actual_len; + + struct _mprotected_region *next; +} mprotected_region; + +static char *mprotect_region(void *addr, size_t len, int flags, +mprotected_region **regions); +static char *clear_mprotect(void *addr, size_t len); + +static allocated_region *allocated_regions[THREADS]; +static mprotected_region **actual_mprotected_regions[THREADS]; +static jmp_buf jump_buffer[THREADS]; typedef char *(*jitted_function)(void **inputs, void **outputs, malloc_function_ptr malloc); @@ -81,19 +97,49 @@ static bool WriteTextToFile(FILE *f, con static void handler(int sig, siginfo_t *si, void *unused) { + int actually_protected_area = false; + mprotected_region* found_region = NULL; + int tid = THRgettid(); + (void)sig; - (void)si; (void)unused; // we caught a segfault or bus error - longjmp(jump_buffer, 1); -} + // this can be either because + // (1) the function accessed a protected piece of memory + // (2) the function caused a segfault by e.g. dereferencing a NULL pointer + // in the first case, this *might* be a valid memory access + // this is because we are required to align our mprotects on page boundaries + // thus sometimes we mprotect a page where only part of the page + // should actually be protected. Thus for this case we check if the access + // was actually an error -struct _mprotected_region; -typedef struct _mprotected_region { - void *addr; - size_t len; - struct _mprotected_region *next; -} mprotected_region; + if (actual_mprotected_regions[tid]) { + mprotected_region* region = *actual_mprotected_regions[tid]; + while(region) { + if (si->si_addr >= region->addr && (char*) si->si_addr <= (char*) region->addr + region->len) { + // the address belongs to this mprotected region + found_region = region; + if (si->si_addr >= region->actual_addr && + (char*) si->si_addr <= (char*) region->actual_addr + region->actual_len) { + // and the address is actually supposed to be protected + actually_protected_area = true; + break; + } + } + region = region->next; + } + } + if (found_region && !actually_protected_area) { + // this is NOT an actually protected area + // thus the segfault/bus error is invalid + // the nasty part here is that we have to unprotect the entire page now + // thus opening us up to future modifications of the data + clear_mprotect(found_region->addr, found_region->len); + found_region->addr = NULL; + } else { + longjmp(jump_buffer[tid], 1); + } +} static char *mprotect_region(void *addr, size_t len, int flags, mprotected_region **regions) @@ -101,6 +147,8 @@ static char *mprotect_region(void *addr, mprotected_region *region; int pagesize; void *page_begin; + void* actual_addr = addr; + size_t actual_len = len; if (len == 0) return NULL; // check if the region is page-aligned @@ -126,12 +174,16 @@ static char *mprotect_region(void *addr, region->addr = addr; region->len = len; region->next = *regions; + region->actual_addr = actual_addr; + region->actual_len = actual_len; *regions = region; return NULL; } static char *clear_mprotect(void *addr, size_t len) { + if (!addr) return NULL; + if (mprotect(addr, len, PROT_READ | PROT_WRITE) < 0) { return strerror(errno); } @@ -156,7 +208,7 @@ static
MonetDB: default - Merge with Jul2017 branch.
Changeset: 5733cdb6fa53 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5733cdb6fa53 Modified Files: sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade/Tests/upgrade.stable.out sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128 Branch: default Log Message: Merge with Jul2017 branch. diffs (truncated from 18042 to 300 lines): diff --git a/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 b/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 --- a/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 +++ b/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 @@ -54,7 +54,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out --- a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out +++ b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out @@ -54,7 +54,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 --- a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 +++ b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 @@ -5282,7 +5282,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 b/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 --- a/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 +++ b/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 @@ -53,7 +53,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out --- a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out +++ b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out @@ -53,7 +53,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY,
MonetDB: subjoin - merged with default
Changeset: 21bcc73d9cc4 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=21bcc73d9cc4 Added Files: sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.sql sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.sql sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.sql sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.stable.err sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.stable.out sql/test/Tests/ifexists-views.sql sql/test/Tests/ifexists-views.stable.err sql/test/Tests/ifexists-views.stable.out Modified Files: MonetDB.spec clients/ChangeLog.Dec2016 common/stream/stream.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_pushselect.c sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_upgrades.c sql/include/sql_catalog.h sql/scripts/51_sys_schema_extension.sql sql/server/rel_optimizer.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_parser.y sql/test/BugTracker-2017/Tests/All sql/test/Tests/All sql/test/Tests/copy-into-fwf.sql.in sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out tools/merovingian/daemon/controlrunner.c tools/merovingian/utils/control.c Branch: subjoin Log Message: merged with default diffs (truncated from 1135 to 300 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -311,6 +311,11 @@ MonetDB, you will very likely need this Summary: MonetDB - Monet Database Management System Client Programs Group: Applications/Databases Requires: %{name}-client%{?_isa} = %{version}-%{release} +%if (0%{?fedora} >= 22) +# tomograph executes these two: +Recommends: /usr/bin/gs +Recommends: /usr/bin/gnuplot +%endif %description client-tools MonetDB is a database management system that is developed from a diff --git a/clients/ChangeLog.Dec2016 b/clients/ChangeLog.Dec2016 --- a/clients/ChangeLog.Dec2016 +++ b/clients/ChangeLog.Dec2016 @@ -1,3 +1,7 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Mon Jun 12 2017 Sjoerd Mullender+- A bug was fixed in the implementation of the functions SQLTables in + the ODBC driver where not enough memory was allocated. + diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -5444,11 +5444,11 @@ typedef struct { char filler; // state size_t line_len; - char* in_buf; - char* out_buf; + char *in_buf; + char *out_buf; size_t out_buf_start; size_t out_buf_remaining; - char* nl_buf; + char nl_buf[1]; } stream_fwf_data; @@ -5458,10 +5458,11 @@ stream_fwf_read(stream *s, void *buf, si stream_fwf_data *fsd; size_t to_write = cnt; size_t buf_written = 0; - if (strcmp(s->name, STREAM_FWF_NAME) != 0 || elmsize != 1) { + + fsd = (stream_fwf_data*) s->stream_data.p; + if (fsd == NULL || elmsize != 1) { return -1; } - fsd = (stream_fwf_data*) s->stream_data.p; while (to_write > 0) { // input conversion @@ -5499,12 +5500,12 @@ stream_fwf_read(stream *s, void *buf, si // now we know something is in output_buf so deliver it if (fsd->out_buf_remaining <= to_write) { - memcpy((char*)buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); to_write -= fsd->out_buf_remaining; buf_written += fsd->out_buf_remaining; fsd->out_buf_remaining = 0; } else { - memcpy((char*) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); fsd->out_buf_start += to_write; fsd->out_buf_remaining -= to_write; buf_written += to_write; @@ -5518,25 +5519,35 @@ stream_fwf_read(stream *s, void *buf, si static void stream_fwf_close(stream *s) { - if (strcmp(s->name, STREAM_FWF_NAME) == 0) { + stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; + + if (fsd != NULL) { stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; mnstr_close(fsd->s); +
MonetDB: Jul2017 - Approve upgrade after changeset 3307d3f0424a ...
Changeset: 68e5985eba42 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=68e5985eba42 Modified Files: sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade/Tests/upgrade.stable.out sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128 Branch: Jul2017 Log Message: Approve upgrade after changeset 3307d3f0424a and release of Dec2016-SP5. diffs (truncated from 18042 to 300 lines): diff --git a/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 b/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 --- a/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 +++ b/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 @@ -54,7 +54,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out --- a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out +++ b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out @@ -54,7 +54,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 --- a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 +++ b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 @@ -5282,7 +5282,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 b/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 --- a/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 +++ b/sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 @@ -53,7 +53,7 @@ CREATE TABLE sys.function_languages ( language_id SMALLINT NOT NULL PRIMARY KEY, language_name VARCHAR(20) NOT NULL UNIQUE); INSERT INTO sys.function_languages (language_id, language_name) VALUES -(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (4, 'C'), (5, 'Java'), (6, 'Python'), (7, 'Python Mapped'); +(0, 'Internal C'), (1, 'MAL'), (2, 'SQL'), (3, 'R'), (6, 'Python'), (7, 'Python Mapped'), (8, 'Python2'), (9, 'Python2 Mapped'), (10, 'Python3'), (11, 'Python3 Mapped'); ALTER TABLE sys.function_languages SET READ ONLY; CREATE TABLE sys.key_types ( key_type_id SMALLINT NOT NULL PRIMARY KEY, diff --git a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out --- a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out +++ b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out @@ -53,7 +53,7 @@ CREATE TABLE sys.function_languages (
MonetDB: jitudf - Merge with default.
Changeset: c4a6d8f49f54 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c4a6d8f49f54 Added Files: sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.sql sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.sql sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.sql sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.stable.err sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.stable.out sql/test/Tests/ifexists-views.sql sql/test/Tests/ifexists-views.stable.err sql/test/Tests/ifexists-views.stable.out Modified Files: MonetDB.spec clients/ChangeLog.Dec2016 common/stream/stream.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_pushselect.c sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_upgrades.c sql/include/sql_catalog.h sql/scripts/51_sys_schema_extension.sql sql/server/rel_optimizer.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_parser.y sql/test/BugTracker-2017/Tests/All sql/test/Tests/All sql/test/Tests/copy-into-fwf.sql.in sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out tools/merovingian/daemon/controlrunner.c tools/merovingian/utils/control.c Branch: jitudf Log Message: Merge with default. diffs (truncated from 1128 to 300 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -311,6 +311,11 @@ MonetDB, you will very likely need this Summary: MonetDB - Monet Database Management System Client Programs Group: Applications/Databases Requires: %{name}-client%{?_isa} = %{version}-%{release} +%if (0%{?fedora} >= 22) +# tomograph executes these two: +Recommends: /usr/bin/gs +Recommends: /usr/bin/gnuplot +%endif %description client-tools MonetDB is a database management system that is developed from a diff --git a/clients/ChangeLog.Dec2016 b/clients/ChangeLog.Dec2016 --- a/clients/ChangeLog.Dec2016 +++ b/clients/ChangeLog.Dec2016 @@ -1,3 +1,7 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Mon Jun 12 2017 Sjoerd Mullender+- A bug was fixed in the implementation of the functions SQLTables in + the ODBC driver where not enough memory was allocated. + diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -5444,11 +5444,11 @@ typedef struct { char filler; // state size_t line_len; - char* in_buf; - char* out_buf; + char *in_buf; + char *out_buf; size_t out_buf_start; size_t out_buf_remaining; - char* nl_buf; + char nl_buf[1]; } stream_fwf_data; @@ -5458,10 +5458,11 @@ stream_fwf_read(stream *s, void *buf, si stream_fwf_data *fsd; size_t to_write = cnt; size_t buf_written = 0; - if (strcmp(s->name, STREAM_FWF_NAME) != 0 || elmsize != 1) { + + fsd = (stream_fwf_data*) s->stream_data.p; + if (fsd == NULL || elmsize != 1) { return -1; } - fsd = (stream_fwf_data*) s->stream_data.p; while (to_write > 0) { // input conversion @@ -5499,12 +5500,12 @@ stream_fwf_read(stream *s, void *buf, si // now we know something is in output_buf so deliver it if (fsd->out_buf_remaining <= to_write) { - memcpy((char*)buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); to_write -= fsd->out_buf_remaining; buf_written += fsd->out_buf_remaining; fsd->out_buf_remaining = 0; } else { - memcpy((char*) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); fsd->out_buf_start += to_write; fsd->out_buf_remaining -= to_write; buf_written += to_write; @@ -5518,25 +5519,35 @@ stream_fwf_read(stream *s, void *buf, si static void stream_fwf_close(stream *s) { - if (strcmp(s->name, STREAM_FWF_NAME) == 0) { + stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; + + if (fsd != NULL) { stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; mnstr_close(fsd->s); +
MonetDB: jitudf - Linux compilation fixes.
Changeset: ec71c22bf9bc for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ec71c22bf9bc Modified Files: sql/backends/monet5/UDF/capi/Tests/capi06.sql sql/backends/monet5/UDF/capi/capi.c Branch: jitudf Log Message: Linux compilation fixes. diffs (49 lines): diff --git a/sql/backends/monet5/UDF/capi/Tests/capi06.sql b/sql/backends/monet5/UDF/capi/Tests/capi06.sql --- a/sql/backends/monet5/UDF/capi/Tests/capi06.sql +++ b/sql/backends/monet5/UDF/capi/Tests/capi06.sql @@ -5,15 +5,16 @@ START TRANSACTION; CREATE FUNCTION capi06(inp INTEGER) RETURNS INTEGER LANGUAGE CPP { #include - std::vector elements; - for(size_t i = 0; i < inp.count; i++) { - elements.push_back(inp.data[i]); - } - std::sort(elements.begin(), elements.end()); - result->initialize(result, inp.count); - for(size_t i = 0; i < inp.count; i++) { - result->data[i] = elements[i]; - } +#include +std::vector elements; +for(size_t i = 0; i < inp.count; i++) { +elements.push_back(inp.data[i]); +} +std::sort(elements.begin(), elements.end()); +result->initialize(result, inp.count); +for(size_t i = 0; i < inp.count; i++) { +result->data[i] = elements[i]; +} }; CREATE TABLE integers(i INTEGER); diff --git a/sql/backends/monet5/UDF/capi/capi.c b/sql/backends/monet5/UDF/capi/capi.c --- a/sql/backends/monet5/UDF/capi/capi.c +++ b/sql/backends/monet5/UDF/capi/capi.c @@ -169,7 +169,7 @@ static void *wrapped_GDK_malloc(size_t s region->next = allocated_regions; allocated_regions = region; - return ptr + sizeof(allocated_region); + return (char*)ptr + sizeof(allocated_region); } #define GENERATE_BASE_HEADERS(type, tpename) \ @@ -571,6 +571,7 @@ static str CUDFeval(Client cntxt, MalBlk ATTEMPT_TO_WRITE_DATA_TO_FILE(f, exprStr + preprocessor_start, i - preprocessor_start); + ATTEMPT_TO_WRITE_TO_FILE(f, "\n"); for (j = preprocessor_start; j < i; j++) { // now overwrite the preprocessor directive in the // expression string with spaces ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: jitudf - Add function cache to avoid recompiling functi...
Changeset: 63378d373390 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=63378d373390 Added Files: sql/backends/monet5/UDF/capi/Tests/capi08.sql sql/backends/monet5/UDF/capi/Tests/capi08.stable.err sql/backends/monet5/UDF/capi/Tests/capi08.stable.out Modified Files: sql/backends/monet5/UDF/capi/Tests/All sql/backends/monet5/UDF/capi/capi.c Branch: jitudf Log Message: Add function cache to avoid recompiling functions constantly. diffs (truncated from 780 to 300 lines): diff --git a/sql/backends/monet5/UDF/capi/Tests/All b/sql/backends/monet5/UDF/capi/Tests/All --- a/sql/backends/monet5/UDF/capi/Tests/All +++ b/sql/backends/monet5/UDF/capi/Tests/All @@ -7,3 +7,4 @@ capi04 capi05 capi06 capi07 +capi08 diff --git a/sql/backends/monet5/UDF/capi/Tests/capi08.sql b/sql/backends/monet5/UDF/capi/Tests/capi08.sql new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi08.sql @@ -0,0 +1,34 @@ +# test caching behavior + +START TRANSACTION; + +CREATE FUNCTION capi08(inp INTEGER) RETURNS INTEGER LANGUAGE C { +result->initialize(result, inp.count); +for(size_t i = 0; i < inp.count; i++) { +result->data[i] = inp.data[i] * 2; +} +}; + +CREATE TABLE integers(i INTEGER); +INSERT INTO integers VALUES (1), (2), (3), (4), (5); + +SELECT capi08(i) FROM integers; +# this function should be loaded from the cache +SELECT capi08(i) FROM integers; + +DROP FUNCTION capi08; + +CREATE FUNCTION capi08(inp DOUBLE) RETURNS DOUBLE LANGUAGE C { +result->initialize(result, inp.count); +for(size_t i = 0; i < inp.count; i++) { +result->data[i] = inp.data[i] * 2; +} +}; + +# same code and same function name, but different parameters +# this needs to be recompiled now +SELECT capi08(i) FROM integers; +SELECT capi08(i) FROM integers; + + +ROLLBACK; diff --git a/sql/backends/monet5/UDF/capi/Tests/capi08.stable.err b/sql/backends/monet5/UDF/capi/Tests/capi08.stable.err new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi08.stable.err @@ -0,0 +1,34 @@ +stderr of test 'capi08` in directory 'sql/backends/monet5/UDF/capi` itself: + + +# 16:28:17 > +# 16:28:17 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37555" "--set" "mapi_usock=/var/tmp/mtest-59671/.s.monetdb.37555" "--set" "monet_prompt=" "--forcemito" "--dbpath=NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi" +# 16:28:17 > + +# builtin opt gdk_dbpath = /Users/myth/opt/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 5 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 37555 +# cmdline opt mapi_usock = /var/tmp/mtest-59671/.s.monetdb.37555 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /Users/myth/opt/mTests/sql/backends/monet5/UDF/capi/NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi +# cmdline opt gdk_debug = 536870922 + +# 16:28:17 > +# 16:28:17 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-59671" "--port=37555" +# 16:28:17 > + + +# 16:28:18 > +# 16:28:18 > "Done." +# 16:28:18 > + diff --git a/sql/backends/monet5/UDF/capi/Tests/capi08.stable.out b/sql/backends/monet5/UDF/capi/Tests/capi08.stable.out new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi08.stable.out @@ -0,0 +1,124 @@ +stdout of test 'capi08` in directory 'sql/backends/monet5/UDF/capi` itself: + + +# 16:28:17 > +# 16:28:17 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37555" "--set" "mapi_usock=/var/tmp/mtest-59671/.s.monetdb.37555" "--set" "monet_prompt=" "--forcemito" "--dbpath=NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi" +# 16:28:17 > + +# MonetDB 5 server v11.28.0 +# This is an unreleased version +# Serving database 'mTests_sql_backends_monet5_UDF_capi', using 4 threads +# Compiled for x86_64-apple-darwin15.6.0/64bit with 128bit integers +# Found 8.000 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved +# Visit https://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://dhcp-21.eduroam.cwi.nl:37555/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-59671/.s.monetdb.37555 +# MonetDB/SQL module loaded + +Ready. +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql +# loading sql script: 10_math.sql +# loading sql script: 11_times.sql +# loading sql script: 12_url.sql +# loading sql script: 13_date.sql +# loading sql script: 14_inet.sql +#
MonetDB: jitudf - Correctly support aggregates and add testcases.
Changeset: 579afc3ecc82 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=579afc3ecc82 Added Files: sql/backends/monet5/UDF/capi/Tests/capi06.sql sql/backends/monet5/UDF/capi/Tests/capi06.stable.err sql/backends/monet5/UDF/capi/Tests/capi06.stable.out sql/backends/monet5/UDF/capi/Tests/capi07.sql sql/backends/monet5/UDF/capi/Tests/capi07.stable.err sql/backends/monet5/UDF/capi/Tests/capi07.stable.out Modified Files: sql/backends/monet5/UDF/capi/Tests/All sql/backends/monet5/UDF/capi/capi.c Branch: jitudf Log Message: Correctly support aggregates and add testcases. diffs (truncated from 331 to 300 lines): diff --git a/sql/backends/monet5/UDF/capi/Tests/All b/sql/backends/monet5/UDF/capi/Tests/All --- a/sql/backends/monet5/UDF/capi/Tests/All +++ b/sql/backends/monet5/UDF/capi/Tests/All @@ -5,3 +5,5 @@ capi02 capi03 capi04 capi05 +capi06 +capi07 diff --git a/sql/backends/monet5/UDF/capi/Tests/capi06.sql b/sql/backends/monet5/UDF/capi/Tests/capi06.sql new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi06.sql @@ -0,0 +1,24 @@ + +# test CPP UDFs + +START TRANSACTION; + +CREATE FUNCTION capi06(inp INTEGER) RETURNS INTEGER LANGUAGE CPP { +#include + std::vector elements; + for(size_t i = 0; i < inp.count; i++) { + elements.push_back(inp.data[i]); + } + std::sort(elements.begin(), elements.end()); + result->initialize(result, inp.count); + for(size_t i = 0; i < inp.count; i++) { + result->data[i] = elements[i]; + } +}; + +CREATE TABLE integers(i INTEGER); +INSERT INTO integers VALUES (3), (4), (1), (2), (5); + +SELECT capi06(i) FROM integers; + +ROLLBACK; diff --git a/sql/backends/monet5/UDF/capi/Tests/capi06.stable.err b/sql/backends/monet5/UDF/capi/Tests/capi06.stable.err new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi06.stable.err @@ -0,0 +1,34 @@ +stderr of test 'capi06` in directory 'sql/backends/monet5/UDF/capi` itself: + + +# 14:53:38 > +# 14:53:38 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=38582" "--set" "mapi_usock=/var/tmp/mtest-20999/.s.monetdb.38582" "--set" "monet_prompt=" "--forcemito" "--dbpath=NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi" +# 14:53:38 > + +# builtin opt gdk_dbpath = /Users/myth/opt/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 5 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 38582 +# cmdline opt mapi_usock = /var/tmp/mtest-20999/.s.monetdb.38582 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /Users/myth/opt/mTests/sql/backends/monet5/UDF/capi/NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi +# cmdline opt gdk_debug = 536870922 + +# 14:53:38 > +# 14:53:38 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-20999" "--port=38582" +# 14:53:38 > + + +# 14:53:39 > +# 14:53:39 > "Done." +# 14:53:39 > + diff --git a/sql/backends/monet5/UDF/capi/Tests/capi06.stable.out b/sql/backends/monet5/UDF/capi/Tests/capi06.stable.out new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi06.stable.out @@ -0,0 +1,93 @@ +stdout of test 'capi06` in directory 'sql/backends/monet5/UDF/capi` itself: + + +# 14:53:38 > +# 14:53:38 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=38582" "--set" "mapi_usock=/var/tmp/mtest-20999/.s.monetdb.38582" "--set" "monet_prompt=" "--forcemito" "--dbpath=NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi" +# 14:53:38 > + +# MonetDB 5 server v11.28.0 +# This is an unreleased version +# Serving database 'mTests_sql_backends_monet5_UDF_capi', using 4 threads +# Compiled for x86_64-apple-darwin15.6.0/64bit with 128bit integers +# Found 8.000 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved +# Visit https://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://dhcp-21.eduroam.cwi.nl:38582/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-20999/.s.monetdb.38582 +# MonetDB/SQL module loaded + +Ready. +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql +# loading sql script: 10_math.sql +# loading sql script: 11_times.sql +# loading sql script: 12_url.sql +# loading sql script: 13_date.sql +# loading sql script: 14_inet.sql +# loading sql script: 15_querylog.sql +# loading sql script: 16_tracelog.sql +# loading sql script:
MonetDB: jitudf - Formatting.
Changeset: 86e62d4bfe87 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=86e62d4bfe87 Modified Files: sql/backends/monet5/UDF/capi/capi.c sql/backends/monet5/UDF/capi/capi.h sql/backends/monet5/UDF/capi/capi.mal sql/backends/monet5/UDF/capi/cheader.h sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.c sql/include/sql_catalog.h sql/server/rel_psm.c sql/server/sql_parser.y Branch: jitudf Log Message: Formatting. diffs (truncated from 1538 to 300 lines): diff --git a/sql/backends/monet5/UDF/capi/capi.c b/sql/backends/monet5/UDF/capi/capi.c --- a/sql/backends/monet5/UDF/capi/capi.c +++ b/sql/backends/monet5/UDF/capi/capi.c @@ -24,67 +24,73 @@ struct _allocated_region; typedef struct _allocated_region { - struct _allocated_region* next; + struct _allocated_region *next; } allocated_region; - -static __thread allocated_region* allocated_regions; +static __thread allocated_region *allocated_regions; static __thread jmp_buf jump_buffer; -static str -CUDFeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, bit grouped); +static str CUDFeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, + bit grouped); -str CUDFevalStd(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { +str CUDFevalStd(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ return CUDFeval(cntxt, mb, stk, pci, 0); } -str CUDFevalAggr(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { +str CUDFevalAggr(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ return CUDFeval(cntxt, mb, stk, pci, 1); } -str CUDFprelude(void *ret) { - (void) ret; +str CUDFprelude(void *ret) +{ + (void)ret; return MAL_SUCCEED; } -typedef char* (*jitted_function)(void** inputs, void** outputs, malloc_function_ptr malloc); +typedef char *(*jitted_function)(void **inputs, void **outputs, + malloc_function_ptr malloc); -static bool -WriteDataToFile(FILE* f, const void* data, size_t data_size) { +static bool WriteDataToFile(FILE *f, const void *data, size_t data_size) +{ fwrite(data, data_size, 1, f); return (!ferror(f)); } -static bool -WriteTextToFile(FILE* f, const char* data) { +static bool WriteTextToFile(FILE *f, const char *data) +{ return WriteDataToFile(f, data, strlen(data)); } -static void handler(int sig, siginfo_t *si, void *unused) { - (void) sig; - (void) si; - (void) unused; +static void handler(int sig, siginfo_t *si, void *unused) +{ + (void)sig; + (void)si; + (void)unused; // we caught a segfault or bus error longjmp(jump_buffer, 1); } struct _mprotected_region; typedef struct _mprotected_region { - void* addr; + void *addr; size_t len; - struct _mprotected_region* next; + struct _mprotected_region *next; } mprotected_region; -static char* -mprotect_region(void* addr, size_t len, int flags, mprotected_region** regions) { - mprotected_region* region; +static char *mprotect_region(void *addr, size_t len, int flags, +mprotected_region **regions) +{ + mprotected_region *region; int pagesize; - void* page_begin; - if (len == 0) return NULL; + void *page_begin; + if (len == 0) + return NULL; // check if the region is page-aligned - + pagesize = getpagesize(); - page_begin = (void*)((size_t)addr - (size_t)addr % pagesize); + page_begin = (void *)((size_t)addr - (size_t)addr % pagesize); if (page_begin != addr) { // data is not page-aligned len += ((size_t)addr - (size_t)page_begin); @@ -108,60 +114,60 @@ mprotect_region(void* addr, size_t len, return NULL; } -static char* -clear_mprotect(void* addr, size_t len) { +static char *clear_mprotect(void *addr, size_t len) +{ if (mprotect(addr, len, PROT_READ | PROT_WRITE) < 0) { return strerror(errno); } return NULL; } -#define ATTEMPT_TO_WRITE_TO_FILE(f, data) \ - if (!WriteTextToFile(f, data)) { \ - errno = 0; \ - msg = createException(MAL, "cudf.eval", "Write error."); \ - goto wrapup; \ +#define ATTEMPT_TO_WRITE_TO_FILE(f, data) \ + if (!WriteTextToFile(f, data)) { \ + errno = 0; \ + msg = createException(MAL, "cudf.eval", "Write error."); \ + goto wrapup; \ } - -#define ATTEMPT_TO_WRITE_DATA_TO_FILE(f, data,
MonetDB: default - Merge with Jul2017 branch.
Changeset: e75ebf8fbbdd for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e75ebf8fbbdd Added Files: sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.sql sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.sql sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.sql sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.stable.err sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.stable.out sql/test/Tests/ifexists-views.sql sql/test/Tests/ifexists-views.stable.err sql/test/Tests/ifexists-views.stable.out Modified Files: MonetDB.spec clients/ChangeLog.Dec2016 common/stream/stream.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_pushselect.c sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_upgrades.c sql/include/sql_catalog.h sql/scripts/51_sys_schema_extension.sql sql/server/rel_optimizer.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_parser.y sql/test/BugTracker-2017/Tests/All sql/test/Tests/All sql/test/Tests/copy-into-fwf.sql.in sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out tools/merovingian/daemon/controlrunner.c tools/merovingian/utils/control.c Branch: default Log Message: Merge with Jul2017 branch. diffs (truncated from 1135 to 300 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -311,6 +311,11 @@ MonetDB, you will very likely need this Summary: MonetDB - Monet Database Management System Client Programs Group: Applications/Databases Requires: %{name}-client%{?_isa} = %{version}-%{release} +%if (0%{?fedora} >= 22) +# tomograph executes these two: +Recommends: /usr/bin/gs +Recommends: /usr/bin/gnuplot +%endif %description client-tools MonetDB is a database management system that is developed from a diff --git a/clients/ChangeLog.Dec2016 b/clients/ChangeLog.Dec2016 --- a/clients/ChangeLog.Dec2016 +++ b/clients/ChangeLog.Dec2016 @@ -1,3 +1,7 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Mon Jun 12 2017 Sjoerd Mullender+- A bug was fixed in the implementation of the functions SQLTables in + the ODBC driver where not enough memory was allocated. + diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -5444,11 +5444,11 @@ typedef struct { char filler; // state size_t line_len; - char* in_buf; - char* out_buf; + char *in_buf; + char *out_buf; size_t out_buf_start; size_t out_buf_remaining; - char* nl_buf; + char nl_buf[1]; } stream_fwf_data; @@ -5458,10 +5458,11 @@ stream_fwf_read(stream *s, void *buf, si stream_fwf_data *fsd; size_t to_write = cnt; size_t buf_written = 0; - if (strcmp(s->name, STREAM_FWF_NAME) != 0 || elmsize != 1) { + + fsd = (stream_fwf_data*) s->stream_data.p; + if (fsd == NULL || elmsize != 1) { return -1; } - fsd = (stream_fwf_data*) s->stream_data.p; while (to_write > 0) { // input conversion @@ -5499,12 +5500,12 @@ stream_fwf_read(stream *s, void *buf, si // now we know something is in output_buf so deliver it if (fsd->out_buf_remaining <= to_write) { - memcpy((char*)buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); to_write -= fsd->out_buf_remaining; buf_written += fsd->out_buf_remaining; fsd->out_buf_remaining = 0; } else { - memcpy((char*) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); fsd->out_buf_start += to_write; fsd->out_buf_remaining -= to_write; buf_written += to_write; @@ -5518,25 +5519,35 @@ stream_fwf_read(stream *s, void *buf, si static void stream_fwf_close(stream *s) { - if (strcmp(s->name, STREAM_FWF_NAME) == 0) { + stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; + + if (fsd != NULL) { stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; mnstr_close(fsd->s); +
MonetDB: Jul2017 - Merge with Dec2016 branch.
Changeset: 8e4dbdde17af for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8e4dbdde17af Added Files: sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.sql Modified Files: clients/ChangeLog.Dec2016 common/stream/stream.c sql/server/rel_optimizer.c sql/server/rel_updates.c sql/test/BugTracker-2017/Tests/All sql/test/Tests/copy-into-fwf.sql.in sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out tools/merovingian/utils/control.c Branch: Jul2017 Log Message: Merge with Dec2016 branch. diffs (273 lines): diff --git a/clients/ChangeLog.Dec2016 b/clients/ChangeLog.Dec2016 --- a/clients/ChangeLog.Dec2016 +++ b/clients/ChangeLog.Dec2016 @@ -1,3 +1,7 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Mon Jun 12 2017 Sjoerd Mullender+- A bug was fixed in the implementation of the functions SQLTables in + the ODBC driver where not enough memory was allocated. + diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -5444,11 +5444,11 @@ typedef struct { char filler; // state size_t line_len; - char* in_buf; - char* out_buf; + char *in_buf; + char *out_buf; size_t out_buf_start; size_t out_buf_remaining; - char* nl_buf; + char nl_buf[1]; } stream_fwf_data; @@ -5458,10 +5458,11 @@ stream_fwf_read(stream *s, void *buf, si stream_fwf_data *fsd; size_t to_write = cnt; size_t buf_written = 0; - if (strcmp(s->name, STREAM_FWF_NAME) != 0 || elmsize != 1) { + + fsd = (stream_fwf_data*) s->stream_data.p; + if (fsd == NULL || elmsize != 1) { return -1; } - fsd = (stream_fwf_data*) s->stream_data.p; while (to_write > 0) { // input conversion @@ -5499,12 +5500,12 @@ stream_fwf_read(stream *s, void *buf, si // now we know something is in output_buf so deliver it if (fsd->out_buf_remaining <= to_write) { - memcpy((char*)buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); to_write -= fsd->out_buf_remaining; buf_written += fsd->out_buf_remaining; fsd->out_buf_remaining = 0; } else { - memcpy((char*) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); fsd->out_buf_start += to_write; fsd->out_buf_remaining -= to_write; buf_written += to_write; @@ -5518,25 +5519,35 @@ stream_fwf_read(stream *s, void *buf, si static void stream_fwf_close(stream *s) { - if (strcmp(s->name, STREAM_FWF_NAME) == 0) { + stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; + + if (fsd != NULL) { stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; mnstr_close(fsd->s); + mnstr_destroy(fsd->s); free(fsd->widths); free(fsd->in_buf); free(fsd->out_buf); - free(fsd->nl_buf); free(fsd); - } - // FIXME destroy(s); -} - -stream* + s->stream_data.p = NULL; + } +} + +static void +stream_fwf_destroy(stream *s) +{ + stream_fwf_close(s); + destroy(s); +} + +stream * stream_fwf_create (stream *s, size_t num_fields, size_t *widths, char filler) { stream *ns; stream_fwf_data *fsd = malloc(sizeof(stream_fwf_data)); size_t i, out_buf_len; - if (!fsd) { + + if (fsd == NULL) { return NULL; } fsd->s = s; @@ -5548,34 +5559,27 @@ stream_fwf_create (stream *s, size_t num fsd->line_len += widths[i]; } fsd->in_buf = malloc(fsd->line_len); - if (!fsd->in_buf) { + if (fsd->in_buf == NULL) { free(fsd); return NULL; } out_buf_len = fsd->line_len * 3; fsd->out_buf = malloc(out_buf_len); - if (!fsd->out_buf) { + if (fsd->out_buf == NULL) { free(fsd->in_buf); free(fsd); return NULL; } fsd->out_buf_remaining = 0; - fsd->nl_buf = malloc(1); - if (!fsd->nl_buf) { + if ((ns = create_stream(STREAM_FWF_NAME)) == NULL) { free(fsd->in_buf); free(fsd->out_buf); free(fsd); return NULL; } - if ((ns =
MonetDB: Jul2017 - Recommend ghostscript (gs) and gnuplot for to...
Changeset: 22fc7046aa54 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=22fc7046aa54 Modified Files: MonetDB.spec Branch: Jul2017 Log Message: Recommend ghostscript (gs) and gnuplot for tomograph. diffs (15 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -311,6 +311,11 @@ MonetDB, you will very likely need this Summary: MonetDB - Monet Database Management System Client Programs Group: Applications/Databases Requires: %{name}-client%{?_isa} = %{version}-%{release} +%if (0%{?fedora} >= 22) +# tomograph executes these two: +Recommends: /usr/bin/gs +Recommends: /usr/bin/gnuplot +%endif %description client-tools MonetDB is a database management system that is developed from a ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Dec2016 - Fix test.
Changeset: b0ee92754265 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b0ee92754265 Modified Files: sql/test/Tests/copy-into-fwf.sql.in Branch: Dec2016 Log Message: Fix test. diffs (12 lines): diff --git a/sql/test/Tests/copy-into-fwf.sql.in b/sql/test/Tests/copy-into-fwf.sql.in --- a/sql/test/Tests/copy-into-fwf.sql.in +++ b/sql/test/Tests/copy-into-fwf.sql.in @@ -12,7 +12,7 @@ create table mtcars ( carb DOUBLE PRECISION ); -copy into mtcars from '$TSTSRCDIR/mtcars' using delimiters 'a','b','c' null as '' fwf (4, 2, 6, 4, 5, 6, 6, 2, 2, 2, 2); +copy into mtcars from '$QTSTSRCDIR/mtcars' using delimiters 'a','b','c' null as '' fwf (4, 2, 6, 4, 5, 6, 6, 2, 2, 2, 2); select * from mtcars; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Dec2016 - Plug a few memory leaks.
Changeset: 041e2f015b9a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=041e2f015b9a Modified Files: common/stream/stream.c sql/server/rel_updates.c Branch: Dec2016 Log Message: Plug a few memory leaks. diffs (148 lines): diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -4712,11 +4712,11 @@ typedef struct { char filler; // state size_t line_len; - char* in_buf; - char* out_buf; + char *in_buf; + char *out_buf; size_t out_buf_start; size_t out_buf_remaining; - char* nl_buf; + char nl_buf[1]; } stream_fwf_data; @@ -4726,10 +4726,11 @@ stream_fwf_read(stream *s, void *buf, si stream_fwf_data *fsd; size_t to_write = cnt; size_t buf_written = 0; - if (strcmp(s->name, STREAM_FWF_NAME) != 0 || elmsize != 1) { + + fsd = (stream_fwf_data*) s->stream_data.p; + if (fsd == NULL || elmsize != 1) { return -1; } - fsd = (stream_fwf_data*) s->stream_data.p; while (to_write > 0) { // input conversion @@ -4767,12 +4768,12 @@ stream_fwf_read(stream *s, void *buf, si // now we know something is in output_buf so deliver it if (fsd->out_buf_remaining <= to_write) { - memcpy((char*)buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, fsd->out_buf_remaining); to_write -= fsd->out_buf_remaining; buf_written += fsd->out_buf_remaining; fsd->out_buf_remaining = 0; } else { - memcpy((char*) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); + memcpy((char *) buf + buf_written, fsd->out_buf + fsd->out_buf_start, to_write); fsd->out_buf_start += to_write; fsd->out_buf_remaining -= to_write; buf_written += to_write; @@ -4786,25 +4787,35 @@ stream_fwf_read(stream *s, void *buf, si static void stream_fwf_close(stream *s) { - if (strcmp(s->name, STREAM_FWF_NAME) == 0) { + stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; + + if (fsd != NULL) { stream_fwf_data *fsd = (stream_fwf_data*) s->stream_data.p; mnstr_close(fsd->s); + mnstr_destroy(fsd->s); free(fsd->widths); free(fsd->in_buf); free(fsd->out_buf); - free(fsd->nl_buf); free(fsd); + s->stream_data.p = NULL; } - // FIXME destroy(s); } -stream* +static void +stream_fwf_destroy(stream *s) +{ + stream_fwf_close(s); + destroy(s); +} + +stream * stream_fwf_create (stream *s, size_t num_fields, size_t *widths, char filler) { stream *ns; stream_fwf_data *fsd = malloc(sizeof(stream_fwf_data)); size_t i, out_buf_len; - if (!fsd) { + + if (fsd == NULL) { return NULL; } fsd->s = s; @@ -4816,34 +4827,27 @@ stream_fwf_create (stream *s, size_t num fsd->line_len += widths[i]; } fsd->in_buf = malloc(fsd->line_len); - if (!fsd->in_buf) { + if (fsd->in_buf == NULL) { free(fsd); return NULL; } out_buf_len = fsd->line_len * 3; fsd->out_buf = malloc(out_buf_len); - if (!fsd->out_buf) { + if (fsd->out_buf == NULL) { free(fsd->in_buf); free(fsd); return NULL; } fsd->out_buf_remaining = 0; - fsd->nl_buf = malloc(1); - if (!fsd->nl_buf) { + if ((ns = create_stream(STREAM_FWF_NAME)) == NULL) { free(fsd->in_buf); free(fsd->out_buf); free(fsd); return NULL; } - if ((ns = create_stream(STREAM_FWF_NAME)) == NULL) { - free(fsd->in_buf); - free(fsd->out_buf); - free(fsd->nl_buf); - free(fsd); - return NULL; - } ns->read = stream_fwf_read; ns->close = stream_fwf_close; + ns->destroy = stream_fwf_destroy; ns->write = NULL; ns->flush = NULL; ns->access = ST_READ; diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -1173,7 +1173,7 @@ rel_import(mvc *sql, sql_table *t, char sql_exp *import; sql_schema *sys = mvc_bind_schema(sql, "sys"); sql_subfunc *f = sql_find_func(sql->sa, sys, "copyfrom", 10, F_UNION, NULL); - char* fwf_string = NULL; + char *fwf_string = NULL;
MonetDB: Dec2016 - Added changelog message for changeset b6ed5ac...
Changeset: 30e815b5acef for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=30e815b5acef Modified Files: clients/ChangeLog.Dec2016 Branch: Dec2016 Log Message: Added changelog message for changeset b6ed5ac2f6f5. diffs (11 lines): diff --git a/clients/ChangeLog.Dec2016 b/clients/ChangeLog.Dec2016 --- a/clients/ChangeLog.Dec2016 +++ b/clients/ChangeLog.Dec2016 @@ -1,3 +1,7 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Mon Jun 12 2017 Sjoerd Mullender+- A bug was fixed in the implementation of the functions SQLTables in + the ODBC driver where not enough memory was allocated. + ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: jitudf - Add test for automatically freeing stray mallocs.
Changeset: 718daabfbf43 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=718daabfbf43 Added Files: sql/backends/monet5/UDF/capi/Tests/capi05.sql sql/backends/monet5/UDF/capi/Tests/capi05.stable.err sql/backends/monet5/UDF/capi/Tests/capi05.stable.out Modified Files: sql/backends/monet5/UDF/capi/Tests/All Branch: jitudf Log Message: Add test for automatically freeing stray mallocs. diffs (165 lines): diff --git a/sql/backends/monet5/UDF/capi/Tests/All b/sql/backends/monet5/UDF/capi/Tests/All --- a/sql/backends/monet5/UDF/capi/Tests/All +++ b/sql/backends/monet5/UDF/capi/Tests/All @@ -4,3 +4,4 @@ capi01 capi02 capi03 capi04 +capi05 diff --git a/sql/backends/monet5/UDF/capi/Tests/capi05.sql b/sql/backends/monet5/UDF/capi/Tests/capi05.sql new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi05.sql @@ -0,0 +1,20 @@ +# memory leak test +# randomly allocate some buffers + + +START TRANSACTION; + +CREATE FUNCTION capi05(inp INTEGER) RETURNS INTEGER LANGUAGE C { + char* mydata = malloc(1000); + result->initialize(result, inp.count); + for(size_t i = 0; i < inp.count; i++) { + result->data[i] = inp.data[i] * 2; + } +}; + +CREATE TABLE integers(i INTEGER); +INSERT INTO integers VALUES (1), (2), (3), (4), (5); + +SELECT capi05(i) FROM integers; + +ROLLBACK; diff --git a/sql/backends/monet5/UDF/capi/Tests/capi05.stable.err b/sql/backends/monet5/UDF/capi/Tests/capi05.stable.err new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi05.stable.err @@ -0,0 +1,34 @@ +stderr of test 'capi05` in directory 'sql/backends/monet5/UDF/capi` itself: + + +# 12:58:52 > +# 12:58:52 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=39823" "--set" "mapi_usock=/var/tmp/mtest-37374/.s.monetdb.39823" "--set" "monet_prompt=" "--forcemito" "--dbpath=NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi" +# 12:58:52 > + +# builtin opt gdk_dbpath = /Users/myth/opt/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 5 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 39823 +# cmdline opt mapi_usock = /var/tmp/mtest-37374/.s.monetdb.39823 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /Users/myth/opt/mTests/sql/backends/monet5/UDF/capi/NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi +# cmdline opt gdk_debug = 536870922 + +# 12:58:52 > +# 12:58:52 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-37374" "--port=39823" +# 12:58:52 > + + +# 12:58:53 > +# 12:58:53 > "Done." +# 12:58:53 > + diff --git a/sql/backends/monet5/UDF/capi/Tests/capi05.stable.out b/sql/backends/monet5/UDF/capi/Tests/capi05.stable.out new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/UDF/capi/Tests/capi05.stable.out @@ -0,0 +1,88 @@ +stdout of test 'capi05` in directory 'sql/backends/monet5/UDF/capi` itself: + + +# 12:58:52 > +# 12:58:52 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=39823" "--set" "mapi_usock=/var/tmp/mtest-37374/.s.monetdb.39823" "--set" "monet_prompt=" "--forcemito" "--dbpath=NONE/var/MonetDB/mTests_sql_backends_monet5_UDF_capi" +# 12:58:52 > + +# MonetDB 5 server v11.28.0 +# This is an unreleased version +# Serving database 'mTests_sql_backends_monet5_UDF_capi', using 4 threads +# Compiled for x86_64-apple-darwin15.6.0/64bit with 128bit integers +# Found 8.000 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved +# Visit https://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://dhcp-21.eduroam.cwi.nl:39823/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-37374/.s.monetdb.39823 +# MonetDB/SQL module loaded + +Ready. +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql +# loading sql script: 10_math.sql +# loading sql script: 11_times.sql +# loading sql script: 12_url.sql +# loading sql script: 13_date.sql +# loading sql script: 14_inet.sql +# loading sql script: 15_querylog.sql +# loading sql script: 16_tracelog.sql +# loading sql script: 17_temporal.sql +# loading sql script: 18_index.sql +# loading sql script: 20_vacuum.sql +# loading sql script: 21_dependency_functions.sql +# loading sql script: 22_clients.sql +# loading sql script: 23_skyserver.sql +# loading sql script: 25_debug.sql +# loading sql script: 26_sysmon.sql +# loading sql script: 27_rejects.sql +# loading sql script: 39_analytics.sql +# loading sql
MonetDB: jitudf - Automatically clean up any mallocs performed i...
Changeset: dce7fa42e62a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dce7fa42e62a Modified Files: sql/backends/monet5/UDF/capi/Tests/capi04.sql sql/backends/monet5/UDF/capi/Tests/capi04.stable.out sql/backends/monet5/UDF/capi/capi.c Branch: jitudf Log Message: Automatically clean up any mallocs performed in the jitted function. diffs (190 lines): diff --git a/sql/backends/monet5/UDF/capi/Tests/capi04.sql b/sql/backends/monet5/UDF/capi/Tests/capi04.sql --- a/sql/backends/monet5/UDF/capi/Tests/capi04.sql +++ b/sql/backends/monet5/UDF/capi/Tests/capi04.sql @@ -10,8 +10,6 @@ CREATE FUNCTION capi04(inp STRING) RETUR if (inp.is_null(inp.data[i])) { result->data[i] = result->null_value; } else { - // the contract says we must use "malloc" to allocate for the result strings - // "malloc" is a function pointer that actually points to GDKmalloc result->data[i] = malloc(strlen(inp.data[i]) + 2); strcpy(result->data[i] + 1, inp.data[i]); result->data[i][0] = 'H'; @@ -35,8 +33,28 @@ CREATE FUNCTION capi04(inp STRING) RETUR }; SELECT capi04(i) FROM strings; +ROLLBACK; + +START TRANSACTION; +# return constant strings, instead of allocated strings +CREATE FUNCTION capi04(inp STRING) RETURNS STRING LANGUAGE C { +#include + + result->initialize(result, inp.count); + for(size_t i = 0; i < inp.count; i++) { + if (inp.is_null(inp.data[i])) { + result->data[i] = result->null_value; + } else { + result->data[i] = malloc(strlen(inp.data[i]) + 2); + strcpy(result->data[i] + 1, inp.data[i]); + result->data[i] = "hello"; + } + } +}; + +CREATE TABLE strings(i STRING); +INSERT INTO strings VALUES ('ello'), ('ow'), (NULL), ('onestly?'), ('annes'); + +SELECT capi04(i) FROM strings; ROLLBACK; - - - diff --git a/sql/backends/monet5/UDF/capi/Tests/capi04.stable.out b/sql/backends/monet5/UDF/capi/Tests/capi04.stable.out --- a/sql/backends/monet5/UDF/capi/Tests/capi04.stable.out +++ b/sql/backends/monet5/UDF/capi/Tests/capi04.stable.out @@ -54,14 +54,10 @@ Ready. # loading sql script: 90_generator.sql # loading sql script: 90_generator_hge.sql # loading sql script: 99_system.sql -Hello -How -Honestly? -Hannes -# 15:50:30 > -# 15:50:30 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-20003" "--port=32751" -# 15:50:30 > +# 12:56:26 > +# 12:56:26 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-37150" "--port=31836" +# 12:56:26 > #START TRANSACTION; #CREATE FUNCTION capi04(inp STRING) RETURNS STRING LANGUAGE C { @@ -98,6 +94,35 @@ Hannes # } #}; #ROLLBACK; +#START TRANSACTION; +#CREATE FUNCTION capi04(inp STRING) RETURNS STRING LANGUAGE C { +##include +# +# result->initialize(result, inp.count); +# for(size_t i = 0; i < inp.count; i++) { +# if (inp.is_null(inp.data[i])) { +# result->data[i] = result->null_value; +# } else { +# result->data[i] = malloc(strlen(inp.data[i]) + 2); +# strcpy(result->data[i] + 1, inp.data[i]); +# result->data[i] = "hello"; +# } +# } +#}; +#CREATE TABLE strings(i STRING); +#INSERT INTO strings VALUES ('ello'), ('ow'), (NULL), ('onestly?'), ('annes'); +[ 5] +#SELECT capi04(i) FROM strings; +% sys.L2 # table_name +% L2 # name +% clob # type +% 5 # length +[ "hello" ] +[ "hello" ] +[ NULL ] +[ "hello" ] +[ "hello" ] +#ROLLBACK; # 15:50:31 > # 15:50:31 > "Done." diff --git a/sql/backends/monet5/UDF/capi/capi.c b/sql/backends/monet5/UDF/capi/capi.c --- a/sql/backends/monet5/UDF/capi/capi.c +++ b/sql/backends/monet5/UDF/capi/capi.c @@ -22,6 +22,13 @@ #include #include +struct _allocated_region; +typedef struct _allocated_region { + struct _allocated_region* next; +} allocated_region; + + +static __thread allocated_region* allocated_regions; static __thread jmp_buf jump_buffer; static str @@ -125,7 +132,7 @@ clear_mprotect(void* addr, size_t len) { } -static void* wrapped_GDK_malloc(size_t size) { +static void* jump_GDK_malloc(size_t size) { void* ptr = GDKmalloc(size); if (!ptr) { longjmp(jump_buffer, 2); @@ -133,11 +140,21 @@ static void* wrapped_GDK_malloc(size_t s return ptr; } +static void* wrapped_GDK_malloc(size_t size) { + allocated_region* region; + void* ptr = jump_GDK_malloc(size + sizeof(allocated_region)); + region = (allocated_region*)ptr; + region->next = allocated_regions; + allocated_regions = region; + + return ptr + sizeof(allocated_region); +} + #define
MonetDB: jitudf - Create temporary files in the LEFTOVERS direct...
Changeset: 1b9f39d82528 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1b9f39d82528 Modified Files: sql/backends/monet5/UDF/capi/Tests/capi03.stable.err sql/backends/monet5/UDF/capi/Tests/capi03.stable.out sql/backends/monet5/UDF/capi/Tests/capi04.sql sql/backends/monet5/UDF/capi/capi.c Branch: jitudf Log Message: Create temporary files in the LEFTOVERS directory of the BBP farm. diffs (151 lines): diff --git a/sql/backends/monet5/UDF/capi/Tests/capi03.stable.err b/sql/backends/monet5/UDF/capi/Tests/capi03.stable.err --- a/sql/backends/monet5/UDF/capi/Tests/capi03.stable.err +++ b/sql/backends/monet5/UDF/capi/Tests/capi03.stable.err @@ -36,6 +36,12 @@ ERROR = !No data returned. MAPI = (monetdb) /var/tmp/mtest-2836/.s.monetdb.35915 QUERY = SELECT capi03(i) FROM integers; ERROR = !Something went wrong! +MAPI = (monetdb) /var/tmp/mtest-25067/.s.monetdb.39212 +QUERY = SELECT capi03(i) FROM integers; +ERROR = !Attempting to write to the input or triggered a segfault/bus error +MAPI = (monetdb) /var/tmp/mtest-25067/.s.monetdb.39212 +QUERY = SELECT capi03(i) FROM integers; +ERROR = !Attempting to write to the input or triggered a segfault/bus error # 17:24:55 > # 17:24:55 > "Done." diff --git a/sql/backends/monet5/UDF/capi/Tests/capi03.stable.out b/sql/backends/monet5/UDF/capi/Tests/capi03.stable.out --- a/sql/backends/monet5/UDF/capi/Tests/capi03.stable.out +++ b/sql/backends/monet5/UDF/capi/Tests/capi03.stable.out @@ -87,6 +87,26 @@ Ready. #INSERT INTO integers VALUES (1), (2), (3), (4), (5); [ 5] #ROLLBACK; +#START TRANSACTION; +#CREATE FUNCTION capi03(inp INTEGER) RETURNS INTEGER LANGUAGE C { +# inp.data[0] = 10; +# result->initialize(result, inp.count); +# for(size_t i = 0; i < inp.count; i++) { +# result->data[i] = inp.data[i] * 2; +# } +#}; +#CREATE TABLE integers(i INTEGER); +#INSERT INTO integers VALUES (1), (2), (3), (4), (5); +[ 5] +#ROLLBACK; +#START TRANSACTION; +#CREATE FUNCTION capi03(inp INTEGER) RETURNS INTEGER LANGUAGE C { +# int x = *((int*)NULL); +#}; +#CREATE TABLE integers(i INTEGER); +#INSERT INTO integers VALUES (1), (2), (3), (4), (5); +[ 5] +#ROLLBACK; # 17:24:55 > # 17:24:55 > "Done." diff --git a/sql/backends/monet5/UDF/capi/Tests/capi04.sql b/sql/backends/monet5/UDF/capi/Tests/capi04.sql --- a/sql/backends/monet5/UDF/capi/Tests/capi04.sql +++ b/sql/backends/monet5/UDF/capi/Tests/capi04.sql @@ -15,7 +15,6 @@ CREATE FUNCTION capi04(inp STRING) RETUR result->data[i] = malloc(strlen(inp.data[i]) + 2); strcpy(result->data[i] + 1, inp.data[i]); result->data[i][0] = 'H'; - printf("%s\n", result->data[i]); } } }; diff --git a/sql/backends/monet5/UDF/capi/capi.c b/sql/backends/monet5/UDF/capi/capi.c --- a/sql/backends/monet5/UDF/capi/capi.c +++ b/sql/backends/monet5/UDF/capi/capi.c @@ -223,6 +223,8 @@ static daytime time_from_data(cudf_data_ static void data_from_timestamp(timestamp d, cudf_data_timestamp* ptr); static timestamp timestamp_from_data(cudf_data_timestamp* ptr); +static char valid_path_characters[] = "abcdefghijklmnopqrstuvwxyz"; + static str CUDFeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, bit grouped) { sql_func * sqlfun = NULL; @@ -232,6 +234,7 @@ CUDFeval(Client cntxt, MalBlkPtr mb, Mal char argbuf[64]; char buf[BUFSIZ]; char fname[BUFSIZ]; + char oname[BUFSIZ]; char libname[BUFSIZ]; char error_buf[BUFSIZ]; char total_error_buf[8192]; @@ -358,9 +361,52 @@ CUDFeval(Client cntxt, MalBlkPtr mb, Mal } } - // name of the source file and lib file that will be generated - snprintf(fname, BUFSIZ, "%s.c", funcname); - snprintf(libname, BUFSIZ, "lib%s%s", funcname, SO_EXT); + { + const int RANDOM_NAME_SIZE = 32; + char* path = NULL; + const char* prefix = "LEFTOVERS"DIR_SEP_STR; + size_t prefix_size = strlen(prefix); + + memcpy(buf, prefix, sizeof(char) * strlen(prefix)); + // generate a random 32-character name for the temporary files + for(i = prefix_size; i < prefix_size + RANDOM_NAME_SIZE; i++) { + buf[i] = valid_path_characters[rand() % (sizeof(valid_path_characters) - 1)]; + } + buf[i] = '\0'; + path = GDKfilepath(0, BATDIR, buf, "c"); + if (!path) { + msg = createException(MAL, "cudf.eval", MAL_MALLOC_FAIL); + goto wrapup; + } + strcpy(fname, path); + strcpy(oname, fname); + oname[strlen(oname) - 1] = 'o'; + GDKfree(path); + + memmove(buf + strlen(SO_PREFIX) + prefix_size, buf + prefix_size, i
MonetDB: subjoin - only set the need_left when the order is real...
Changeset: 969e826b209b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=969e826b209b Modified Files: sql/backends/monet5/rel_bin.c Branch: subjoin Log Message: only set the need_left when the order is realy needed. diffs (18 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -1695,12 +1695,12 @@ rel2bin_join(backend *be, sql_rel *rel, node *en = NULL, *n; stmt *left = NULL, *right = NULL, *join = NULL, *jl, *jr, *lsel = NULL, *rsel = NULL, *oleft = NULL, *oright = NULL; stmt *ld = NULL, *rd = NULL; - int need_left = (rel->flag == LEFT_JOIN || rel->op == op_left || rel->op == op_full); + int need_left = (rel->flag == LEFT_JOIN); if (rel->l) { /* first construct the left sub relation */ left = subrel_bin(be, rel->l, refs); if (left && left->type == st_project) { - if (need_left) { + if (need_left || rel->op == op_left || rel->op == op_full) { left = rel2bin_post_project(be, left); } else { printf("# JOIN Left post_project \n"); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list