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 <sjo...@acm.org> +- 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 = 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_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -5656,6 +5656,21 @@ positional_exps_mark_used( sql_rel *rel, } static void +exps_mark_dependent(sql_rel *rel) +{ + if (rel->exps) { + node *n; + + for (n=rel->exps->h; n; n = n->next) { + sql_exp *e = n->data; + + if (e->used) + exp_mark_used(rel, e); + } + } +} + +static void exps_mark_used(sql_allocator *sa, sql_rel *rel, sql_rel *subrel) { int nr = 0; @@ -5781,6 +5796,8 @@ rel_mark_used(mvc *sql, sql_rel *rel, in if (proj && rel->l) { exps_mark_used(sql->sa, rel, rel->l); rel_mark_used(sql, rel->l, 0); + } else if (proj) { + exps_mark_dependent(rel); } break; case op_update: 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", 11, F_UNION, NULL); - char* fwf_string = NULL; + char *fwf_string = NULL; if (!f) /* we do expect copyfrom to be there */ return NULL; @@ -1189,7 +1189,7 @@ rel_import(mvc *sql, sql_table *t, char if (fwf_widths && dlist_length(fwf_widths) > 0) { dnode *dn; int ncol = 0; - char* fwf_string_cur = fwf_string = GDKmalloc(20 * dlist_length(fwf_widths) + 1); // a 64 bit int needs 19 characters in decimal representation plus the separator + char *fwf_string_cur = fwf_string = sa_alloc(sql->sa, 20 * dlist_length(fwf_widths) + 1); // a 64 bit int needs 19 characters in decimal representation plus the separator if (!fwf_string) return NULL; diff --git a/sql/test/BugTracker-2017/Tests/All b/sql/test/BugTracker-2017/Tests/All --- a/sql/test/BugTracker-2017/Tests/All +++ b/sql/test/BugTracker-2017/Tests/All @@ -53,4 +53,5 @@ distinct_minus_count_distinct.Bug-6296 all_minus_count_star.Bug-6297 simplify_math.Bug-6324 push_subslice.Bug-6322 +crash-dce.Bug-6330 delete_from_merge_table.Bug-3743 diff --git a/sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.sql b/sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.sql @@ -0,0 +1,1 @@ +SELECT 45 - - CASE + + 70 WHEN COUNT ( * ) + SUM ( DISTINCT 91 ) + MIN ( DISTINCT 41 ) / 65 THEN + 98 END * + - 0 - - COUNT ( * ) AS col0; 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; diff --git a/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql b/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql --- a/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql +++ b/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql @@ -8,6 +8,9 @@ SELECT COUNT(*) AS duplicates, schema_id SELECT COUNT(*) AS duplicates, table_id, name FROM sys._columns GROUP BY table_id, name HAVING COUNT(*) > 1; SELECT COUNT(*) AS duplicates, table_id, name FROM tmp._columns GROUP BY table_id, name HAVING COUNT(*) > 1; SELECT COUNT(*) AS duplicates, table_id, name FROM sys.columns GROUP BY table_id, name HAVING COUNT(*) > 1; +SELECT COUNT(*) AS duplicates, table_id, number FROM sys._columns GROUP BY table_id, number HAVING COUNT(*) > 1; +SELECT COUNT(*) AS duplicates, table_id, number FROM tmp._columns GROUP BY table_id, number HAVING COUNT(*) > 1; +SELECT COUNT(*) AS duplicates, table_id, number FROM sys.columns GROUP BY table_id, number HAVING COUNT(*) > 1; -- The id values from sys.schemas, sys._tables, sys._columns and sys.functions combined must be exclusive (see FK from sys.privileges.obj_id) SELECT COUNT(*) AS duplicates, T.id FROM (SELECT id FROM sys.schemas UNION ALL SELECT id FROM sys._tables UNION ALL SELECT id FROM sys._columns UNION ALL SELECT id FROM sys.functions) T GROUP BY T.id HAVING COUNT(*) > 1; diff --git a/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out b/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out --- a/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out +++ b/sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out @@ -64,6 +64,21 @@ Ready. % duplicates, table_id, name # name % bigint, int, varchar # type % 1, 1, 0 # length +#SELECT COUNT(*) AS duplicates, table_id, number FROM sys._columns GROUP BY table_id, number HAVING COUNT(*) > 1; +% sys.L3, sys._columns, sys._columns # table_name +% duplicates, table_id, number # name +% bigint, int, int # type +% 1, 1, 1 # length +#SELECT COUNT(*) AS duplicates, table_id, number FROM tmp._columns GROUP BY table_id, number HAVING COUNT(*) > 1; +% tmp.L3, tmp._columns, tmp._columns # table_name +% duplicates, table_id, number # name +% bigint, int, int # type +% 1, 1, 1 # length +#SELECT COUNT(*) AS duplicates, table_id, number FROM sys.columns GROUP BY table_id, number HAVING COUNT(*) > 1; +% .L15, .columns, .columns # table_name +% duplicates, table_id, number # name +% bigint, int, int # type +% 1, 1, 1 # length #SELECT COUNT(*) AS duplicates, T.id FROM (SELECT id FROM sys.schemas UNION ALL SELECT id FROM sys._tables UNION ALL SELECT id FROM sys._columns UNION ALL SELECT id FROM sys.functions) T GROUP BY T.id HAVING COUNT(*) > 1; % .L26, .t # table_name % duplicates, id # name diff --git a/tools/merovingian/utils/control.c b/tools/merovingian/utils/control.c --- a/tools/merovingian/utils/control.c +++ b/tools/merovingian/utils/control.c @@ -330,7 +330,7 @@ char* control_send( rbuf[len - 1] = '\0'; } - if (strcmp(rbuf, "=OK") != 0 && strcmp(rbuf, "OK") != 0) { + if (strncmp(rbuf, "=OK", 3) != 0 && strncmp(rbuf, "OK", 2) != 0) { buf = rbuf; if (*buf == '!') buf++; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list