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 <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/monetdb5/optimizer/opt_mergetable.c b/monetdb5/optimizer/opt_mergetable.c --- a/monetdb5/optimizer/opt_mergetable.c +++ b/monetdb5/optimizer/opt_mergetable.c @@ -32,6 +32,7 @@ typedef struct mat { typedef struct matlist { mat_t *v; + int *vars; /* result variable is a mat */ int top; int size; @@ -50,11 +51,10 @@ mat_type( mat_t *mat, int n) } static int -is_a_mat(int idx, matlist_t *ml){ - int i; - for(i =0; i<ml->top; i++) - if (!ml->v[i].packed && ml->v[i].mv == idx) - return i; +is_a_mat(int idx, matlist_t *ml) +{ + if (ml->vars[idx] && !ml->v[ml->vars[idx]].packed) + return ml->vars[idx]; return -1; } @@ -112,6 +112,7 @@ mat_add_var(matlist_t *ml, InstrPtr q, I dst->pm = parentmat; dst->packed = 0; dst->pushed = pushed; + ml->vars[var] = ml->top; ++ml->top; } @@ -159,8 +160,11 @@ checksize(matlist_t *ml, int v) ml->vsize *= 2; ml->horigin = (int*) GDKrealloc(ml->horigin, sizeof(int)* ml->vsize); ml->torigin = (int*) GDKrealloc(ml->torigin, sizeof(int)* ml->vsize); - for (i = sz; i < ml->vsize; i++) + ml->vars = (int*) GDKrealloc(ml->vars, sizeof(int)* ml->vsize); + for (i = sz; i < ml->vsize; i++) { ml->horigin[i] = ml->torigin[i] = -1; + ml->vars[i] = 0; + } } } @@ -1546,7 +1550,8 @@ OPTmergetableImplementation(Client cntxt ml.vsize = mb->vsize; ml.horigin = (int*) GDKmalloc(sizeof(int)* ml.vsize); ml.torigin = (int*) GDKmalloc(sizeof(int)* ml.vsize); - if ( ml.v == NULL || ml.horigin == NULL || ml.torigin == NULL) { + ml.vars = (int*) GDKzalloc(sizeof(int)* ml.vsize); + if ( ml.v == NULL || ml.horigin == NULL || ml.torigin == NULL || ml.vars == NULL) { goto cleanup; } for (i=0; i<ml.vsize; i++) @@ -1867,6 +1872,7 @@ cleanup: if (ml.v) GDKfree(ml.v); if (ml.horigin) GDKfree(ml.horigin); if (ml.torigin) GDKfree(ml.torigin); + if (ml.vars) GDKfree(ml.vars); /* Defense line against incorrect plans */ if( actions > 0){ chkTypes(cntxt->fdout, cntxt->nspace, mb, FALSE); diff --git a/monetdb5/optimizer/opt_pushselect.c b/monetdb5/optimizer/opt_pushselect.c --- a/monetdb5/optimizer/opt_pushselect.c +++ b/monetdb5/optimizer/opt_pushselect.c @@ -485,9 +485,10 @@ OPTpushselectImplementation(Client cntxt InstrPtr r = copyInstruction(p); InstrPtr s = copyInstruction(q); + rslices[getArg(p,0)] = 1; /* mark slice as rewriten */ /* keep new output of slice */ slices[getArg(s, 1)] = getArg(p, 0); - rslices[getArg(p,0)] = 1; + rslices[getArg(q,0)] = 1; /* mark projectdelta as rewriten */ /* slice the candidates */ setFunctionId(r, sliceRef); getArg(r, 0) = getArg(p, 0); @@ -498,11 +499,12 @@ OPTpushselectImplementation(Client cntxt /* dummy result for the old q, will be removed by deadcode optimizer */ getArg(q, 0) = newTmpVariable(mb, getArgType(mb, q, 0)); - getArg(s, 1) = getArg(r, 0); /* use result of subslice */ + getArg(s, 1) = getArg(r, 0); /* use result of slice */ pushInstruction(mb, s); freeInstruction(p); old[i] = r; + continue; } } @@ -513,11 +515,31 @@ OPTpushselectImplementation(Client cntxt */ else if (getModuleId(p) == algebraRef && getFunctionId(p) == projectionRef) { int var = getArg(p, 1); - InstrPtr r = old[vars[var]]; + InstrPtr r = old[vars[var]], q; - if (r && isSlice(r) && rslices[getArg(p,1)] != 0 && getArg(r, 0) == getArg(p, 1)) { - InstrPtr q = newAssignment(mb); + if (r && isSlice(r) && rslices[var] && getArg(r, 0) == getArg(p, 1)) { + if (!rslices[getArg(p,2)]) { /* was the deltaproject rewriten (sliced) */ + int col = getArg(p,2); + InstrPtr s = old[vars[col]], u = NULL; + if (s && getModuleId(s) == algebraRef && getFunctionId(s) == projectRef) { + col = getArg(s, 1); + u = s; + s = old[vars[col]]; + } + if (s && getModuleId(s) == sqlRef && getFunctionId(s) == projectdeltaRef) { + InstrPtr t = copyInstruction(s); + + getArg(t, 1) = getArg(r, 0); /* use result of slice */ + rslices[col] = 1; + pushInstruction(mb, t); + if (u) { /* add again */ + t = copyInstruction(u); + pushInstruction(mb, t); + } + } + } + q = newAssignment(mb); getArg(q, 0) = getArg(p, 0); (void) pushArgument(mb, q, getArg(p, 2)); actions++; diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -297,7 +297,7 @@ drop_table(mvc *sql, char *sname, char * } static char * -drop_view(mvc *sql, char *sname, char *tname, int drop_action) +drop_view(mvc *sql, char *sname, char *tname, int drop_action, int if_exists) { sql_table *t = NULL; sql_schema *ss = NULL; @@ -309,10 +309,12 @@ drop_view(mvc *sql, char *sname, char *t ss = cur_schema(sql); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list