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