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 <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;
 }
 
@@ -125,6 +125,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;
 }
 
@@ -172,8 +173,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;
+               }
        }
 }
 
@@ -1563,7 +1567,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++) 
@@ -1889,6 +1894,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

Reply via email to