Changeset: a5f4d195d7ed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5f4d195d7ed
Modified Files:
        clients/Tests/exports.stable.out
        clients/mapiclient/dump.c
        clients/odbc/driver/ODBCConvert.c
        clients/odbc/driver/ODBCDesc.h
        clients/odbc/driver/SQLFetch.c
        common/stream/stream.c
        gdk/gdk.h
        gdk/gdk_utils.c
        monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
        
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
        monetdb5/mal/mal_client.c
        monetdb5/mal/mal_scenario.c
        monetdb5/mal/mal_scenario.h
        monetdb5/modules/mal/mal_mapi.c
        monetdb5/optimizer/Tests/inlineFunction.malC
        monetdb5/optimizer/Tests/inlineFunction.stable.out
        monetdb5/optimizer/Tests/inlineFunction1.malC
        monetdb5/optimizer/Tests/inlineFunction1.stable.out
        monetdb5/optimizer/Tests/inlineFunction4.malC
        monetdb5/optimizer/Tests/inlineFunction4.stable.out
        monetdb5/optimizer/opt_aliases.c
        monetdb5/optimizer/opt_coercion.c
        monetdb5/optimizer/opt_garbageCollector.c
        monetdb5/optimizer/opt_pipes.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_remap.c
        sql/ChangeLog.Apr2019
        sql/backends/monet5/sql_scenario.c
        sql/server/rel_optimizer.c
        
sql/test/BugTracker-2012/Tests/aggregate_incorrect_precision_scale.Bug-3182.stable.out
        
sql/test/BugTracker-2012/Tests/aggregate_incorrect_precision_scale.Bug-3182.stable.out.int128
        sql/test/BugTracker-2012/Tests/algebra_find.Bug-2728.stable.out
        
sql/test/BugTracker-2012/Tests/cast_varchar_to_double.Bug-3071.stable.out
        
sql/test/BugTracker-2012/Tests/correlated_groupby_in_selection.Bug-3011.stable.out
        
sql/test/BugTracker-2012/Tests/fixed_limit_for_prepare.Bug-3208.stable.out
        
sql/test/BugTracker-2012/Tests/many-columns-truncated.Bug-3161.stable.out
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        
sql/test/BugTracker-2012/Tests/row_number_does_not_work_in_complex_query.Bug-2805.stable.out
        sql/test/BugTracker-2012/Tests/server-crash.Bug-3046.stable.out
        sql/test/BugTracker-2012/Tests/set_operation.Bug-3059.stable.out
        sql/test/BugTracker-2012/Tests/simple_select.Bug-2988.stable.out
        
sql/test/BugTracker-2012/Tests/tuples_INTERSECT_vs_count_intersect_differs.Bug-2659.stable.out
        sql/test/BugTracker-2012/Tests/with_and_exists.Bug-3099.stable.out
        sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.stable.out
        sql/test/BugTracker/Tests/auto_increment.SF-1834820.stable.out
        sql/test/BugTracker/Tests/bug_in_selection.SF-1892413.stable.out
        sql/test/BugTracker/Tests/case_in_aggr_bug.SF-1506545.stable.out
        sql/test/BugTracker/Tests/case_with_aggr.SF-1876779.stable.out.int128
        sql/test/BugTracker/Tests/count_crash.SF-1918780.stable.out
        sql/test/BugTracker/Tests/crash_on_delete.SF-1639108.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        
sql/test/BugTracker/Tests/groupby_with_alias.SF-1520575.stable.out.int128
        sql/test/BugTracker/Tests/insert_not_exists.SF-1380287.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/BugTracker/Tests/large_prepare_2.SF-1363729.stable.out
        sql/test/BugTracker/Tests/proc_insert_into.SF-1958572.stable.out
        
sql/test/BugTracker/Tests/rand_not_executed_for_every_row.SF-1723791.stable.out
        sql/test/Tests/setoptimizer.stable.out
        sql/test/remote/Tests/partition_elim.stable.out
        sql/test/remote/Tests/ssbm.stable.out.int128
        tools/mserver/mserver5.1.in
Branch: default
Log Message:

Merge with Apr2019 branch.


diffs (truncated from 2002 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -335,7 +335,6 @@ Thread THRget(int tid);
 void *THRgetdata(int);
 int THRgettid(void);
 int THRhighwater(void);
-Thread THRnew(const char *name);
 void THRsetdata(int, void *);
 void TMabort(void);
 gdk_return TMcommit(void);
@@ -2641,7 +2640,6 @@ str startRef;
 str startTrace(str path);
 str starttraceRef;
 str stopProfiler(void);
-str stopRef;
 str stopTrace(str path);
 str stoptraceRef;
 void strAfterCall(ValPtr v, ValPtr bak);
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -2677,7 +2677,7 @@ dump_database(Mapi mid, stream *toConsol
                                        mnstr_printf(toConsole, ")");
                                }
                                if (found_nil) {
-                                       mnstr_printf(toConsole, " WITH NULL 
VALUES");
+                                       mnstr_printf(toConsole, " %s NULL 
VALUES", (i == 0) ? "FOR" : "WITH");
                                }
                        } else { /* by range */
                                char *minv = NULL, *maxv = NULL, *wnulls = NULL;
@@ -2710,7 +2710,7 @@ dump_database(Mapi mid, stream *toConsol
                                        squoted_print(toConsole, maxv, '\'');
                                }
                                if (strcmp(wnulls, "true") == 0) {
-                                       mnstr_printf(toConsole, " WITH NULL 
VALUES");
+                                       mnstr_printf(toConsole, " %s NULL 
VALUES", (minv && maxv) ? "WITH" : "FOR");
                                }
                                mapi_close_handle(shdl);
                        }
diff --git a/clients/odbc/driver/ODBCConvert.c 
b/clients/odbc/driver/ODBCConvert.c
--- a/clients/odbc/driver/ODBCConvert.c
+++ b/clients/odbc/driver/ODBCConvert.c
@@ -1282,14 +1282,16 @@ ODBCFetch(ODBCStmt *stmt,
                case SQL_WVARCHAR:
                case SQL_WLONGVARCHAR:
                case SQL_GUID:
-                       if (irdrec->already_returned >= datalen) {
+                       if (irdrec->already_returned < 0)
+                               irdrec->already_returned = 0;
+                       else if ((size_t) irdrec->already_returned >= datalen) {
                                /* no more data to return */
                                if (type == SQL_C_WCHAR && ptr)
                                        free(ptr);
                                return SQL_NO_DATA;
                        }
                        data += irdrec->already_returned;
-                       datalen -= irdrec->already_returned;
+                       datalen -= (size_t) irdrec->already_returned;
                        if (ptr) {
                                copyString(data, datalen, ptr, buflen, lenp,
                                           SQLLEN, addStmtError, stmt,
@@ -1919,7 +1921,9 @@ ODBCFetch(ODBCStmt *stmt,
                case SQL_LONGVARBINARY:
                        break;
                }
-               if (irdrec->already_returned >= datalen) {
+               if (irdrec->already_returned < 0)
+                       irdrec->already_returned = 0;
+               else if ((size_t) irdrec->already_returned >= datalen) {
                        /* no more data to return */
                        return SQL_NO_DATA;
                }
diff --git a/clients/odbc/driver/ODBCDesc.h b/clients/odbc/driver/ODBCDesc.h
--- a/clients/odbc/driver/ODBCDesc.h
+++ b/clients/odbc/driver/ODBCDesc.h
@@ -48,7 +48,7 @@ typedef struct {
        SQLSMALLINT sql_desc_unnamed;
        SQLSMALLINT sql_desc_unsigned;
        SQLSMALLINT sql_desc_updatable;
-       size_t already_returned;
+       ssize_t already_returned;
 } ODBCDescRec;
 
 typedef struct {
diff --git a/clients/odbc/driver/SQLFetch.c b/clients/odbc/driver/SQLFetch.c
--- a/clients/odbc/driver/SQLFetch.c
+++ b/clients/odbc/driver/SQLFetch.c
@@ -115,7 +115,7 @@ MNDBFetch(ODBCStmt *stmt, SQLUSMALLINT *
                stmt->rowSetSize++;
 
                for (i = 1; i <= ird->sql_desc_count; i++)
-                       ird->descRec[i].already_returned = 0;
+                       ird->descRec[i].already_returned = -1;
 
                for (i = 1; i <= ard->sql_desc_count; i++) {
                        rec = &ard->descRec[i];
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -2934,16 +2934,20 @@ static ssize_t
 pipe_read(stream *restrict s, void *restrict buf, size_t elmsize, size_t cnt)
 {
        HANDLE h = s->stream_data.p;
-       size_t n = elmsize * cnt;
-       unsigned char *p = buf;
+       size_t n;
+       unsigned char *p;
        DWORD nread;
 
        if (h == NULL) {
                s->errnr = MNSTR_READ_ERROR;
                return -1;
        }
-       if (n == 0)
+       if (elmsize == 0 || cnt == 0)
                return 0;
+  tailrecurse:
+       n = elmsize * cnt;
+       p = buf;
+
        for (;;) {
                DWORD ret = PeekNamedPipe(h, NULL, 0, NULL, &nread, NULL);
                if (ret == 0) {
@@ -2963,7 +2967,7 @@ pipe_read(stream *restrict s, void *rest
                return -1;
        }
        /* when in text mode, convert \r\n line endings to \n */
-       if (!s->binary) {
+       if (!s->binary && nread > 0) {
                char *p1, *p2, *pe;
 
                p1 = buf;
@@ -2978,6 +2982,11 @@ pipe_read(stream *restrict s, void *rest
                                *p2++ = *p1;
                        p1++;
                }
+               if (nread == 0) {
+                       /* try again after removing \r and ending up
+                        * with nothing */
+                       goto tailrecurse;
+               }
        }
        return nread / elmsize;
 }
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2308,7 +2308,6 @@ typedef struct threadStruct {
 
 gdk_export int THRgettid(void);
 gdk_export Thread THRget(int tid);
-gdk_export Thread THRnew(const char *name);
 gdk_export MT_Id THRcreate(void (*f) (void *), void *arg, enum MT_thr_detach 
d, const char *name);
 gdk_export void THRdel(Thread t);
 gdk_export void THRsetdata(int, void *);
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1361,50 +1361,46 @@ GDK_find_self(void)
        return GDK_find_thread(MT_getpid());
 }
 
-Thread
+static Thread
 THRnew(const char *name)
 {
        int tid = 0;
        Thread s;
-       MT_Id pid = MT_getpid();
 
-       s = GDK_find_thread(pid);
-       if (s == NULL) {
-               MT_lock_set(&GDKthreadLock);
-               for (s = GDKthreads; s < GDKthreads + THREADS; s++) {
-                       if (s->pid == 0) {
-                               break;
-                       }
-               }
-               if (s == GDKthreads + THREADS) {
-                       MT_lock_unset(&GDKthreadLock);
-                       IODEBUG fprintf(stderr, "#THRnew: too many threads\n");
-                       GDKerror("THRnew: too many threads\n");
-                       return NULL;
+       MT_lock_set(&GDKthreadLock);
+       for (s = GDKthreads; s < GDKthreads + THREADS; s++) {
+               if (s->pid == 0) {
+                       break;
                }
-               tid = s->tid;
-               *s = (ThreadRec) {
-                       .pid = pid,
-                       .tid = tid,
-                       .data[0] = THRdata[0],
-                       .data[1] = THRdata[1],
-                       .sp = THRsp(),
-                       .name = GDKstrdup(name),
-               };
+       }
+       if (s == GDKthreads + THREADS) {
+               MT_lock_unset(&GDKthreadLock);
+               IODEBUG fprintf(stderr, "#THRnew: too many threads\n");
+               GDKerror("THRnew: too many threads\n");
+               return NULL;
+       }
+       tid = s->tid;
+       *s = (ThreadRec) {
+               .pid = MT_getpid(),
+               .tid = tid,
+               .data[0] = THRdata[0],
+               .data[1] = THRdata[1],
+               .sp = THRsp(),
+               .name = GDKstrdup(name),
+       };
 
-               if (s->name == NULL) {
-                       s->pid = 0;
-                       MT_lock_unset(&GDKthreadLock);
-                       IODEBUG fprintf(stderr, "#THRnew: malloc failure\n");
-                       GDKerror("THRnew: malloc failure\n");
-                       return NULL;
-               }
-               MT_thread_setdata(s);
-               GDKnrofthreads++;
-               PARDEBUG fprintf(stderr, "#%x %zu sp = %zu\n", (unsigned) 
s->tid, (size_t) pid, (size_t) s->sp);
-               PARDEBUG fprintf(stderr, "#nrofthreads %d\n", GDKnrofthreads);
+       if (s->name == NULL) {
+               s->pid = 0; /* deallocate */
                MT_lock_unset(&GDKthreadLock);
+               IODEBUG fprintf(stderr, "#THRnew: malloc failure\n");
+               GDKerror("THRnew: malloc failure\n");
+               return NULL;
        }
+       MT_thread_setdata(s);
+       GDKnrofthreads++;
+       PARDEBUG fprintf(stderr, "#%x %zu sp = %zu\n", (unsigned) s->tid, 
(size_t) s->pid, (size_t) s->sp);
+       PARDEBUG fprintf(stderr, "#nrofthreads %d\n", GDKnrofthreads);
+       MT_lock_unset(&GDKthreadLock);
        return s;
 }
 
diff --git 
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out 
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
--- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
+++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
@@ -54,8 +54,8 @@ Ready.
 % .L1 # table_name
 % def # name
 % clob # type
-% 560 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();"
   ]
+% 580 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();"
       ]
 #explain copy into ttt from '/tmp/xyz';
 % .explain # table_name
 % mal # name
@@ -113,8 +113,8 @@ end user.s10_1;
 % .L1 # table_name
 % def # name
 % clob # type
-% 583 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.sql_append();optimizer.garbageCollector();"
    ]
+% 603 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.sql_append();optimizer.garbageCollector();"
        ]
 #explain copy into ttt from '/tmp/xyz';
 % .explain # table_name
 % mal # name
diff --git 
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
 
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
--- 
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
+++ 
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows
@@ -65,9 +65,9 @@ Ready.
 % .L1 # table_name
 % def # name
 % clob # type
-% 560 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();"
   ]
-#explain copy into ttt from 'a:\tmp/xyz';
+% 580 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();"
       ]
+#explain copy into ttt from E'a:\\tmp/xyz';
 % .explain # table_name
 % mal # name
 % clob # type
@@ -120,8 +120,8 @@ end user.s10_1;
 % .L1 # table_name
 % def # name
 % clob # type
-% 583 # length
-[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.sql_append();optimizer.garbageCollector();"
    ]
+% 603 # length
+[ 
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.sql_append();optimizer.garbageCollector();"
        ]
 #explain copy into ttt from 'Z:/tmp/xyz';
 % .explain # table_name
 % mal # name
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -289,12 +289,9 @@ int
 MCinitClientThread(Client c)
 {
        Thread t;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to