Changeset: 5a50ae340f07 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5a50ae340f07
Added Files:
sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.sql
sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.err
sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.out
sql/test/mergetables/Tests/mergedb.Bug-6820.reqtests
sql/test/mergetables/Tests/mergedb_drop.reqtests
sql/test/mergetables/Tests/qlsmith-exist-lateral.reqtests
sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.sql
sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.err
sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.out
sql/test/mergetables/Tests/sqlsmith-exist-lateral.reqtests
sql/test/mergetables/Tests/sqlsmith.Bug-6426.reqtests
sql/test/mergetables/Tests/sqlsmith.Bug-6451.reqtests
sql/test/mergetables/Tests/sqlsmith.Bug-6453.reqtests
sql/test/mergetables/Tests/sqlsmith.Bug-6455.reqtests
sql/test/mergetables/Tests/sqlsmith.Bug-6459.reqtests
sql/test/mergetables/Tests/sqlsmith.Bug-6459.stable.out.int128
Modified Files:
gdk/gdk_batop.c
gdk/gdk_heap.c
monetdb5/modules/atoms/mtime.c
sql/server/rel_optimizer.c
sql/test/BugTracker-2017/Tests/All
sql/test/mergetables/Tests/All
sql/test/mergetables/Tests/sqlsmith.Bug-6459.stable.out
Branch: default
Log Message:
Merge with Jul2017 branch.
diffs (truncated from 672 to 300 lines):
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -407,6 +407,113 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
return GDK_FAIL;
}
+static gdk_return
+append_varsized_bat(BAT *b, BAT *n, BAT *s)
+{
+ BATiter ni;
+ BUN start, end, cnt, r;
+ const oid *restrict cand = NULL, *candend = NULL;
+
+ /* only transient bats can use some other bat's vheap */
+ assert(b->batRole == TRANSIENT || b->tvheap->parentid == b->batCacheid);
+ /* make sure the bats use var_t */
+ assert(b->twidth == n->twidth);
+ assert(b->twidth == SIZEOF_VAR_T);
+ if (n->batCount == 0 || (s && s->batCount == 0))
+ return GDK_SUCCEED;
+ CANDINIT(n, s, start, end, cnt, cand, candend);
+ cnt = cand ? (BUN) (candend - cand) : end - start;
+ if (cnt == 0)
+ return GDK_SUCCEED;
+ if (BATcount(b) == 0 &&
+ b->batRole == TRANSIENT &&
+ n->batRestricted == BAT_READ &&
+ b->tvheap != n->tvheap) {
+ /* if b is still empty, in the transient farm, and n
+ * is read-only, we replace b's vheap with a reference
+ * to n's */
+ if (b->tvheap->parentid != b->batCacheid) {
+ BBPunshare(b->tvheap->parentid);
+ } else {
+ HEAPfree(b->tvheap, 1);
+ GDKfree(b->tvheap);
+ }
+ BBPshare(n->tvheap->parentid);
+ b->tvheap = n->tvheap;
+ }
+ if (b->tvheap == n->tvheap) {
+ /* if b and n use the same vheap, we only need to copy
+ * the offsets from n to b */
+ HASHdestroy(b); /* not maintaining, so destroy it */
+ if (cand == NULL) {
+ /* fast memcpy since we copy a consecutive
+ * chunk of memory */
+ memcpy(Tloc(b, BUNlast(b)),
+ Tloc(n, start),
+ cnt * b->twidth);
+ } else {
+ var_t *restrict dst = (var_t *) Tloc(b, BUNlast(b));
+ oid hseq = n->hseqbase;
+ const var_t *restrict src = (const var_t *) Tloc(n, 0);
+ while (cand < candend)
+ *dst++ = src[*cand++ - hseq];
+ }
+ BATsetcount(b, BATcount(b) + cnt);
+ return GDK_SUCCEED;
+ }
+ /* b and n do not share their vheap, so we need to copy data */
+ if (b->tvheap->parentid != b->batCacheid) {
+ /* if b shares its vheap with some other bat, unshare it */
+ Heap *h = GDKzalloc(sizeof(Heap));
+ if (h == NULL)
+ return GDK_FAIL;
+ h->parentid = b->batCacheid;
+ h->farmid = BBPselectfarm(b->batRole, b->ttype, varheap);
+ if (b->tvheap->filename) {
+ const char *nme = BBP_physical(b->batCacheid);
+ h->filename = GDKfilepath(NOFARM, NULL, nme, "theap");
+ if (h->filename == NULL) {
+ GDKfree(h);
+ return GDK_FAIL;
+ }
+ }
+ if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+ HEAPfree(h, 1);
+ GDKfree(h);
+ return GDK_FAIL;
+ }
+ BBPunshare(b->tvheap->parentid);
+ b->tvheap = h;
+ }
+ /* copy data from n to b */
+ ni = bat_iterator(n);
+ r = BUNlast(b);
+ if (cand) {
+ oid hseq = n->hseqbase;
+ while (cand < candend) {
+ const void *t = BUNtvar(ni, *cand - hseq);
+ bunfastapp_nocheck(b, r, t, Tsize(b));
+ HASHins(b, r, t);
+ r++;
+ cand++;
+ }
+ } else {
+ while (start < end) {
+ const void *t = BUNtvar(ni, start);
+ bunfastapp_nocheck(b, r, t, Tsize(b));
+ HASHins(b, r, t);
+ r++;
+ start++;
+ }
+ }
+ return GDK_SUCCEED;
+
+ bunins_failed:
+ if (b->tunique)
+ BBPunfix(s->batCacheid);
+ return GDK_FAIL;
+}
+
/* Append the contents of BAT n (subject to the optional candidate
* list s) to BAT b. If b is empty, b will get the seqbase of s if it
* was passed in, and else the seqbase of n. */
@@ -421,9 +528,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo
return GDK_SUCCEED;
}
assert(b->batCacheid > 0);
- /* almost: assert(!isVIEW(b)); */
- assert(b->theap.parentid == 0 &&
- (b->tvheap == NULL || b->tvheap->parentid == b->batCacheid ||
b->ttype == TYPE_str));
+ assert(b->theap.parentid == 0);
ALIGNapp(b, "BATappend", force, GDK_FAIL);
BATcompatible(b, n, GDK_FAIL, "BATappend");
@@ -605,9 +710,14 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo
BBPunfix(s->batCacheid);
return GDK_FAIL;
}
+ } else if (ATOMvarsized(b->ttype)) {
+ if (append_varsized_bat(b, n, s) != GDK_SUCCEED) {
+ if (b->tunique)
+ BBPunfix(s->batCacheid);
+ return GDK_FAIL;
+ }
} else {
- if (!ATOMvarsized(b->ttype) &&
- BATatoms[b->ttype].atomFix == NULL &&
+ if (BATatoms[b->ttype].atomFix == NULL &&
b->ttype != TYPE_void &&
n->ttype != TYPE_void &&
cand == NULL) {
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -1024,7 +1024,8 @@ HEAP_malloc(Heap *heap, size_t nbytes)
size_t newsize;
assert(heap->free + MAX(heap->free, nbytes) <= VAR_MAX);
- newsize = (size_t) roundup_8(heap->free + MAX(heap->free,
nbytes));
+ newsize = MIN(heap->free, (size_t) 1 << 20);
+ newsize = (size_t) roundup_8(heap->free + MAX(newsize, nbytes));
assert(heap->free <= VAR_MAX);
block = (size_t) heap->free; /* current end-of-heap */
@@ -1032,8 +1033,7 @@ HEAP_malloc(Heap *heap, size_t nbytes)
fprintf(stderr, "#No block found\n");
#endif
- /* Double the size of the heap.
- * TUNE: increase heap by different amount. */
+ /* Increase the size of the heap. */
HEAPDEBUG fprintf(stderr, "#HEAPextend in HEAP_malloc %s "
SZFMT " " SZFMT "\n", heap->filename, heap->size, newsize);
if (HEAPextend(heap, newsize, FALSE) != GDK_SUCCEED)
return 0;
diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -3623,6 +3623,7 @@ MTIMEdate_to_str(str *s, const date *d,
fromdate(*d, &t.tm_mday, &mon, &year);
t.tm_mon = mon - 1;
t.tm_year = year - 1900;
+ (void)mktime(&t); /* corrects the tm_wday etc */
if ((sz = strftime(buf, BUFSIZ, *format, &t)) == 0)
throw(MAL, "mtime.date_to_str", "failed to convert date to
string using format '%s'\n", *format);
*s = GDKmalloc(sz + 1);
@@ -3667,6 +3668,7 @@ MTIMEtime_to_str(str *s, const daytime *
memset(&t, 0, sizeof(struct tm));
fromtime(*d, &t.tm_hour, &t.tm_min, &t.tm_sec, &msec);
(void)msec;
+ (void)mktime(&t); /* corrects the tm_wday etc */
if ((sz = strftime(buf, BUFSIZ, *format, &t)) == 0)
throw(MAL, "mtime.time_to_str", "failed to convert time to
string using format '%s'\n", *format);
*s = GDKmalloc(sz + 1);
@@ -3714,6 +3716,7 @@ MTIMEtimestamp_to_str(str *s, const time
t.tm_mon = mon - 1;
t.tm_year = year - 1900;
fromtime(ts->msecs, &t.tm_hour, &t.tm_min, &t.tm_sec, &msec);
+ (void)mktime(&t); /* corrects the tm_wday etc */
(void)msec;
if ((sz = strftime(buf, BUFSIZ, *format, &t)) == 0)
throw(MAL, "mtime.timestamp_to_str", "failed to convert
timestampt to string using format '%s'\n", *format);
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
@@ -8684,9 +8684,12 @@ rel_apply_rewrite(int *changes, mvc *sql
p = rel_projections(sql, rel, NULL, 1, 1);
nl = rel_apply(sql, rel_dup(rel->l), rel_dup(r->l), rel->exps,
rel->flag);
nr = rel_apply(sql, rel_dup(rel->l), rel_dup(r->r), rel->exps,
rel->flag);
+ nl = rel_project(sql->sa, nl, rel_projections(sql, nl, NULL, 1,
1));
+ nr = rel_project(sql->sa, nr, rel_projections(sql, nr, NULL, 1,
1));
l = rel_setop(sql->sa, nl, nr, op_union);
l->flag = r->flag;
- l->exps = list_merge(p, r->exps, (fdup)NULL);
+ l->exps = p; //list_merge(p, r->exps, (fdup)NULL);
+ assert(list_length(nl->exps) == list_length(nr->exps) &&
list_length(nl->exps) == list_length(l->exps));
set_processed(l);
rel_destroy(rel);
(*changes)++;
@@ -8760,11 +8763,17 @@ rel_apply_rewrite(int *changes, mvc *sql
return l;
} else { /* both unused */
int flag = rel->flag;
- list *exps = r->exps;
-
- assert(is_join(r->op));
- r = rel_crossproduct(sql->sa, rel_dup(r->l),
rel_dup(r->r), flag == APPLY_LOJ?op_left:op_join);
- r->exps = exps_copy(sql->sa, exps);
+
+ assert(is_join(r->op) || is_semi(r->op));
+ if (is_join(r->op)) {
+ list *exps = r->exps;
+
+ r = rel_crossproduct(sql->sa, rel_dup(r->l),
rel_dup(r->r), flag == APPLY_LOJ?op_left:op_join);
+ r->exps = exps_copy(sql->sa, exps);
+ } else if (is_semi(r->op)) {
+ assert(flag != APPLY_LOJ);
+ r = rel_dup(r);
+ }
rel_destroy(rel);
(*changes)++;
return r;
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
@@ -107,3 +107,4 @@ insert_into_multiple_subqueries.Bug-6448
HAVE_SAMTOOLS?sqlsmith.Bug-6449
HAVE_LIBPY?python_loader_clobbers_default_with_null.Bug-6464
skip_problem_best_effort.Bug-6442
+date_to_str.Bug-6467
diff --git a/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.sql
b/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.sql
@@ -0,0 +1,1 @@
+SELECT date '2017-11-14', EXTRACT(year from date '2017-11-14'),
date_to_str(date '2017-11-14', '%Y %m %d -A:%A -G:%G V:%V w:%w W:%W');
diff --git a/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.err
b/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.err
@@ -0,0 +1,34 @@
+stderr of test 'date_to_str.Bug-6467` in directory 'sql/test/BugTracker-2017`
itself:
+
+
+# 14:32:50 >
+# 14:32:50 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=30624" "--set"
"mapi_usock=/var/tmp/mtest-29760/.s.monetdb.30624" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017"
+# 14:32:50 >
+
+# builtin opt gdk_dbpath =
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 30624
+# cmdline opt mapi_usock = /var/tmp/mtest-29760/.s.monetdb.30624
+# cmdline opt monet_prompt =
+# cmdline opt gdk_dbpath =
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017
+# cmdline opt gdk_debug = 536870922
+
+# 14:32:51 >
+# 14:32:51 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-29760" "--port=30624"
+# 14:32:51 >
+
+
+# 14:32:51 >
+# 14:32:51 > "Done."
+# 14:32:51 >
+
diff --git a/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.out
b/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2017/Tests/date_to_str.Bug-6467.stable.out
@@ -0,0 +1,37 @@
+stdout of test 'date_to_str.Bug-6467` in directory 'sql/test/BugTracker-2017`
itself:
+
+
+# 14:32:50 >
+# 14:32:50 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=30624" "--set"
"mapi_usock=/var/tmp/mtest-29760/.s.monetdb.30624" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017"
+# 14:32:50 >
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list