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

Reply via email to