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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list