MonetDB: iso - Merged with Jul2021

2021-07-07 Thread Pedro Ferreira
Changeset: 6b48b7e30b70 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6b48b7e30b70
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 413 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1559,10 +1559,10 @@ gdk_export BBPrec *BBP[N_BBPINIT];
 #define BBPvalid(i)(BBP_logical(i) != NULL && *BBP_logical(i) != '.')
 
 /* macros that nicely check parameters */
-#define BBPstatus(i)   (BBPcheck((i),"BBPstatus")?BBP_status(i):0)
-#define BBPrefs(i) (BBPcheck((i),"BBPrefs")?BBP_refs(i):-1)
-#define BBPcache(i)(BBPcheck((i),"BBPcache")?BBP_cache(i):(BAT*) NULL)
-#define BBPname(i) (BBPcheck((i), "BBPname") ? BBP_logical(i) : "")
+#define BBPstatus(i)   (BBPcheck(i) ? BBP_status(i) : 0)
+#define BBPrefs(i) (BBPcheck(i) ? BBP_refs(i) : -1)
+#define BBPcache(i)(BBPcheck(i) ? BBP_cache(i) : (BAT*) NULL)
+#define BBPname(i) (BBPcheck(i) ? BBP_logical(i) : "")
 
 #define BBPRENAME_ALREADY  (-1)
 #define BBPRENAME_ILLEGAL  (-2)
@@ -1966,13 +1966,13 @@ gdk_export void *THRdata[THREADDATA];
 #define THRset_errbuf(t,b) (t->data[2] = b)
 
 static inline bat
-BBPcheck(bat x, const char *y)
+BBPcheck(bat x)
 {
if (!is_bat_nil(x)) {
assert(x > 0);
 
if (x < 0 || x >= getBBPsize() || BBP_logical(x) == NULL) {
-   TRC_DEBUG(CHECK_, "%s: range error %d\n", y, (int) x);
+   TRC_DEBUG(CHECK_, "range error %d\n", (int) x);
} else {
return x;
}
@@ -1985,7 +1985,7 @@ BATdescriptor(bat i)
 {
BAT *b = NULL;
 
-   if (BBPcheck(i, "BATdescriptor")) {
+   if (BBPcheck(i)) {
if (BBPfix(i) <= 0)
return NULL;
b = BBP_cache(i);
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -595,7 +595,7 @@ batToStr(char **dst, size_t *len, const 
size_t i;
str s;
 
-   if (is_bat_nil(b) || (s = BBPname(b)) == NULL || *s == 0) {
+   if (is_bat_nil(b) || !BBPcheck(b) || (s = BBP_logical(b)) == NULL || *s 
== 0) {
atommem(4);
if (external) {
strcpy(*dst, "nil");
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1644,8 +1644,8 @@ BATappend_or_update(BAT *b, BAT *p, cons
}
bat_iterator_end(&ni);
TRC_DEBUG(ALGO,
- "BATreplace(" ALGOBATFMT "," ALGOBATFMT "," ALGOBATFMT ") " 
LLFMT " usec\n",
- ALGOBATPAR(b), ALGOBATPAR(p), ALGOBATPAR(n),
+ "BATreplace(" ALGOBATFMT "," ALGOOPTBATFMT "," ALGOBATFMT ") 
" LLFMT " usec\n",
+ ALGOBATPAR(b), ALGOOPTBATPAR(p), ALGOBATPAR(n),
  GDKusec() - t0);
return GDK_SUCCEED;
 }
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1570,12 +1570,11 @@ BBPdir_init(void)
 void
 BBPdump(void)
 {
-   bat i;
size_t mem = 0, vm = 0;
size_t cmem = 0, cvm = 0;
int n = 0, nc = 0;
 
-   for (i = 0; i < (bat) ATOMIC_GET(&BBPsize); i++) {
+   for (bat i = 0; i < (bat) ATOMIC_GET(&BBPsize); i++) {
if (BBP_refs(i) == 0 && BBP_lrefs(i) == 0)
continue;
BAT *b = BBP_desc(i);
@@ -1590,6 +1589,10 @@ BBPdump(void)
BBP_lrefs(i),
status,
BBP_cache(i) ? "" : " not cached");
+   if (b == NULL) {
+   fprintf(stderr, ", no descriptor\n");
+   continue;
+   }
if (b->batSharecnt > 0)
fprintf(stderr, " shares=%d", b->batSharecnt);
if (b->batDirtydesc)
@@ -1888,7 +1891,7 @@ BBPinsert(BAT *bn)
if (len == -1 || len >= FILENAME_MAX)
return 0;
 
-   TRC_DEBUG(BAT_, "%d = new %s(%s)\n", (int) i, BBPname(i), 
ATOMname(bn->ttype));
+   TRC_DEBUG(BAT_, "%d = new %s(%s)\n", (int) i, BBP_logical(i), 
ATOMname(bn->ttype));
}
 
return i;
@@ -1941,14 +1944,14 @@ BBPuncacheit(bat i, bool unloaddesc)
 {
if (i < 0)
i = -i;
-   if (BBPcheck(i, "BBPuncacheit")) {
+   if (BBPcheck(i)) {
BAT *b = BBP_desc(i);
 
assert(unloaddesc || BBP_refs(i) == 0);
 
if (b) {
if (BBP_cache(i)) {
-   TRC_DEBUG(BAT_, "uncache %d (%s)\n", (int) i, 
BBPname(i));
+   TRC_DEBUG(BAT_, "uncache %d (%s)\n", (int) i, 
BBP_logical(i));
 
BBP_cache(i) = NULL;
 
@@ -1970,7 +1973,7 @@ BBPuncacheit(bat i, bool unloaddesc)
 static inline void
 bbpclear(bat i, int idx, bool lock)
 {
-   TRC_DEBUG(BAT_, "clear %d (%s)\n", (int) i, BBPname(i));
+ 

MonetDB: iso - Merged with Jul2021

2021-07-06 Thread Pedro Ferreira
Changeset: fef916e3f289 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fef916e3f289
Modified Files:
monetdb5/modules/mal/remote.c
sql/backends/monet5/sql.c
sql/storage/bat/bat_storage.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 354 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1713,7 +1713,7 @@ Tputvalue(BAT *b, BUN p, const void *v, 
if (rc != GDK_SUCCEED)
return rc;
if (b->twidth < SIZEOF_VAR_T &&
-   (b->twidth <= 2 ? d - GDK_VAROFFSET : d) >= ((size_t) 1 << 
(8 * b->twidth))) {
+   (b->twidth <= 2 ? d - GDK_VAROFFSET : d) >= ((size_t) 1 << 
(8 << b->tshift))) {
/* doesn't fit in current heap, upgrade it */
rc = GDKupgradevarheap(b, d, 0, copyall);
if (rc != GDK_SUCCEED)
@@ -1735,9 +1735,9 @@ Tputvalue(BAT *b, BUN p, const void *v, 
break;
 #endif
}
-   } else if (b->ttype == TYPE_msk) {
-   mskSetVal(b, p, * (msk *) v);
} else {
+   /* msk is handled by tfastins_nocheck, our only caller */
+   assert(b->ttype != TYPE_msk);
return ATOMputFIX(b->ttype, Tloc(b, p), v);
}
return GDK_SUCCEED;
@@ -1752,8 +1752,10 @@ tfastins_nocheck(BAT *b, BUN p, const vo
((uint32_t *) b->theap->base)[b->theap->free / 4] = 0;
b->theap->free += 4;
}
-   } else
-   b->theap->free += s;
+   mskSetVal(b, p, * (msk *) v);
+   return GDK_SUCCEED;
+   }
+   b->theap->free += s;
return Tputvalue(b, p, v, false);
 }
 
@@ -1805,7 +1807,7 @@ tfastins_nocheckVAR(BAT *b, BUN p, const
if ((rc = ATOMputVAR(b, &d, v)) != GDK_SUCCEED)
return rc;
if (b->twidth < SIZEOF_VAR_T &&
-   (b->twidth <= 2 ? d - GDK_VAROFFSET : d) >= ((size_t) 1 << (8 * 
b->twidth))) {
+   (b->twidth <= 2 ? d - GDK_VAROFFSET : d) >= ((size_t) 1 << (8 << 
b->tshift))) {
/* doesn't fit in current heap, upgrade it */
rc = GDKupgradevarheap(b, d, 0, false);
if (rc != GDK_SUCCEED)
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -546,7 +546,7 @@ BATextend(BAT *b, BUN newcap)
newcap = (newcap + 31) & ~(BUN)31; /* round up to multiple of 
32 */
theap_size = (size_t) (newcap / 8); /* in bytes */
} else {
-   theap_size = (size_t) newcap * Tsize(b);
+   theap_size = (size_t) newcap << b->tshift;
}
b->batCapacity = newcap;
 
@@ -926,7 +926,7 @@ COLcopy(BAT *b, int tt, bool writable, r
memcpy(Tloc(bn, 0), bi.base, bn->theap->free);
} else {
/* case (4): optimized for simple array copy */
-   bn->theap->free = bunstocopy * Tsize(bn);
+   bn->theap->free = bunstocopy << bn->tshift;
bn->theap->dirty |= bunstocopy > 0;
memcpy(Tloc(bn, 0), bi.base, bn->theap->free);
}
@@ -1162,20 +1162,32 @@ BUNappendmulti(BAT *b, const void *value
b->tsorted = b->trevsorted = b->tkey = false;
}
MT_rwlock_wrlock(&b->thashlock);
-   for (BUN i = 0; i < count; i++) {
-   if (values) {
-   t = b->ttype && b->tvarsized ? ((void **) values)[i] :
-   (void *) ((char *) values + i * Tsize(b));
+   if (values && b->ttype) {
+   for (BUN i = 0; i < count; i++) {
+   t = b->tvarsized ? ((void **) values)[i] :
+   (void *) ((char *) values + (i << b->tshift));
+   gdk_return rc = bunfastapp_nocheck(b, p, t, Tsize(b));
+   if (rc != GDK_SUCCEED) {
+   MT_rwlock_wrunlock(&b->thashlock);
+   return rc;
+   }
+   if (b->thash) {
+   HASHappend_locked(b, p, t);
+   }
+   p++;
}
-   gdk_return rc = bunfastapp_nocheck(b, p, t, Tsize(b));
-   if (rc != GDK_SUCCEED) {
-   MT_rwlock_wrunlock(&b->thashlock);
-   return rc;
+   } else {
+   for (BUN i = 0; i < count; i++) {
+   gdk_return rc = bunfastapp_nocheck(b, p, t, Tsize(b));
+   if (rc != GDK_SUCCEED) {
+   MT_rwlock_wrunlock(&b->thashlock);
+   return rc;
+   }
+   if (b->thash) {
+   H

MonetDB: iso - Merged with Jul2021

2021-07-05 Thread Pedro Ferreira
Changeset: c9c9e6fd208e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c9c9e6fd208e
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 841 to 300 lines):

diff --git a/common/utils/mcrypt.c b/common/utils/mcrypt.c
--- a/common/utils/mcrypt.c
+++ b/common/utils/mcrypt.c
@@ -514,7 +514,6 @@ mcrypt_hashPassword(
return NULL;
}
 
-#if (defined(HAVE_OPENSSL) || defined(HAVE_COMMONCRYPTO))
snprintf(ret, sizeof(ret),
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
@@ -542,7 +541,6 @@ mcrypt_hashPassword(
ret[len] = '\0';
 
return strdup(ret);
-#endif
 }
 
 #ifndef HAVE_SHA512_UPDATE
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1002,148 +1002,6 @@ COLcopy(BAT *b, int tt, bool writable, r
return NULL;
 }
 
-static void
-setcolprops(BAT *b, const void *x)
-{
-   bool isnil = b->ttype != TYPE_void &&
-   ATOMnilptr(b->ttype) != NULL &&
-   ATOMcmp(b->ttype, x, ATOMnilptr(b->ttype)) == 0;
-   BATiter bi;
-   BUN pos;
-   const void *prv;
-   int cmp;
-
-   /* x may only be NULL if the column type is VOID */
-   assert(x != NULL || b->ttype == TYPE_void);
-   if (b->batCount == 0) {
-   /* first value */
-   b->tsorted = b->trevsorted = ATOMlinear(b->ttype);
-   b->tnosorted = b->tnorevsorted = 0;
-   b->tkey = true;
-   b->tnokey[0] = b->tnokey[1] = 0;
-   if (b->ttype == TYPE_void) {
-   if (x) {
-   b->tseqbase = * (const oid *) x;
-   }
-   b->tnil = is_oid_nil(b->tseqbase);
-   b->tnonil = !b->tnil;
-   } else {
-   b->tnil = isnil;
-   b->tnonil = !isnil;
-   if (b->ttype == TYPE_oid) {
-   b->tseqbase = * (const oid *) x;
-   }
-   if (!isnil && ATOMlinear(b->ttype)) {
-   BATsetprop(b, GDK_MAX_VALUE, b->ttype, x);
-   BATsetprop(b, GDK_MIN_VALUE, b->ttype, x);
-   BATsetprop(b, GDK_MAX_POS, TYPE_oid, &(oid){0});
-   BATsetprop(b, GDK_MIN_POS, TYPE_oid, &(oid){0});
-   }
-   }
-   return;
-   } else if (b->ttype == TYPE_void) {
-   /* not the first value in a VOID column: we keep the
-* seqbase, and x is not used, so only some properties
-* are affected */
-   if (!is_oid_nil(b->tseqbase)) {
-   if (b->trevsorted) {
-   b->tnorevsorted = BUNlast(b);
-   b->trevsorted = false;
-   }
-   b->tnil = false;
-   b->tnonil = true;
-   } else {
-   if (b->tkey) {
-   b->tnokey[0] = 0;
-   b->tnokey[1] = BUNlast(b);
-   b->tkey = false;
-   }
-   b->tnil = true;
-   b->tnonil = false;
-   }
-   return;
-   } else if (ATOMlinear(b->ttype)) {
-   const ValRecord *prop;
-
-   bi = bat_iterator_nolock(b);
-   pos = BUNlast(b);
-   prv = BUNtail(bi, pos - 1);
-   cmp = ATOMcmp(b->ttype, prv, x);
-
-   if (b->tkey &&
-   (cmp == 0 || /* definitely not KEY */
-(b->batCount > 1 && /* can't guarantee KEY if unordered */
- ((b->tsorted && cmp > 0) ||
-  (b->trevsorted && cmp < 0) ||
-  (!b->tsorted && !b->trevsorted) {
-   b->tkey = false;
-   if (cmp == 0) {
-   b->tnokey[0] = pos - 1;
-   b->tnokey[1] = pos;
-   }
-   }
-   if (b->tsorted) {
-   if (cmp > 0) {
-   /* out of order */
-   b->tsorted = false;
-   b->tnosorted = pos;
-   } else if (cmp < 0 && !isnil) {
-   /* new largest value */
-   BATsetprop(b, GDK_MAX_VALUE, b->ttype, x);
-   BATsetprop(b, GDK_MAX_POS, TYPE_oid, 
&(oid){BATcount(b)});
-   }
-   } else if (!isnil &&
-  (prop = BATgetprop(b, GDK_M

MonetDB: iso - Merged with Jul2021

2021-07-05 Thread Pedro Ferreira
Changeset: e6d2db7496cc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e6d2db7496cc
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/test/miscellaneous/Tests/All
Branch: iso
Log Message:

Merged with Jul2021


diffs (129 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1445,6 +1445,8 @@ bind_col_data(sql_trans *tr, sql_column 
/* abort */
if (update_conflict)
*update_conflict = true;
+   else
+   return timestamp_delta(tr, ATOMIC_PTR_GET(&c->data));
return NULL;
}
assert(!isTempTable(c->t));
@@ -1915,8 +1917,8 @@ bind_del_data(sql_trans *tr, sql_table *
 {
storage *obat = ATOMIC_PTR_GET(&t->data);
 
-   if (isTempTable(t))
-   obat = temp_tab_timestamp_storage(tr, t);
+   if (isTempTable(t) && !(obat = temp_tab_timestamp_storage(tr, t)))
+   return NULL;
 
if (obat->cs.ts == tr->tid)
return obat;
@@ -2913,8 +2915,10 @@ clear_table(sql_trans *tr, sql_table *t)
node *n = ol_first_node(t->columns);
sql_column *c = n->data;
BUN sz = count_col(tr, c, 0), clear_ok;
-
storage *d = tab_timestamp_storage(tr, t);
+
+   if (!d)
+   return BUN_NONE;
lock_table(tr->store, t->base.id);
sz -= count_deletes_in_range(d->segs->h, tr, 0, sz);
unlock_table(tr->store, t->base.id);
diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -36,23 +36,32 @@ full_column(sql_trans *tr, sql_column *c
BAT *b = store->storage_api.bind_col(tr, c, RDONLY);
BAT *ui = store->storage_api.bind_col(tr, c, RD_UPD_ID);
 
+   if (!b || !ui) {
+   bat_destroy(b);
+   bat_destroy(ui);
+   return NULL;
+   }
if (BATcount(ui)) {
-   BAT *uv = store->storage_api.bind_col(tr, c, RD_UPD_VAL);
-   if (ui && BATcount(ui)) {
-   BAT *r = COLcopy(b, b->ttype, true, TRANSIENT);
+   BAT *uv = store->storage_api.bind_col(tr, c, RD_UPD_VAL), *r;
 
+   if (!uv) {
bat_destroy(b);
-   b = r;
-   if (!b || !ui || !uv || BATreplace(b, ui, uv, true) != 
GDK_SUCCEED) {
-   if (b) BBPunfix(b->batCacheid);
-   if (ui) BBPunfix(ui->batCacheid);
-   if (uv) BBPunfix(uv->batCacheid);
-   return NULL;
-   }
+   bat_destroy(ui);
+   return NULL;
}
-   bat_destroy(ui);
+
+   r = COLcopy(b, b->ttype, true, TRANSIENT);
+   bat_destroy(b);
+   b = r;
+   if (!b || BATreplace(b, ui, uv, true) != GDK_SUCCEED) {
+   bat_destroy(b);
+   bat_destroy(ui);
+   bat_destroy(uv);
+   return NULL;
+   }
bat_destroy(uv);
}
+   bat_destroy(ui);
return b;
 }
 
diff --git a/sql/test/miscellaneous/Tests/All b/sql/test/miscellaneous/Tests/All
--- a/sql/test/miscellaneous/Tests/All
+++ b/sql/test/miscellaneous/Tests/All
@@ -24,3 +24,4 @@ transaction_isolation2
 transaction_isolation3
 transaction_isolation4
 mergetable-deps-crash
+view-deps
diff --git a/sql/test/miscellaneous/Tests/view-deps.test 
b/sql/test/miscellaneous/Tests/view-deps.test
new file mode 100644
--- /dev/null
+++ b/sql/test/miscellaneous/Tests/view-deps.test
@@ -0,0 +1,34 @@
+@connection(id=1, username=monetdb, password=monetdb)
+statement ok
+create table fine(y int, z int);
+
+@connection(id=1)
+statement ok
+start transaction;
+
+@connection(id=2, username=monetdb, password=monetdb)
+statement ok
+start transaction;
+
+@connection(id=1)
+statement ok
+alter table fine drop column y;
+
+@connection(id=2)
+statement ok
+create view myv7(a,b) as select y, z from sys.fine;
+
+@connection(id=1)
+statement ok
+commit;
+
+@connection(id=2)
+statement ok
+commit;
+
+@connection(id=2)
+query I,I roworder
+select * from myv7;
+
+
+statement error code 4 message "COMMIT: transaction is aborted because of 
concurrency conflicts, will ROLLBACK instead"
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: iso - Merged with Jul2021

2021-07-05 Thread Pedro Ferreira
Changeset: 6b8937a70447 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6b8937a70447
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/storage/store.c
sql/test/miscellaneous/Tests/All
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 911 to 300 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -526,7 +526,6 @@ gdk_return
 BATextend(BAT *b, BUN newcap)
 {
size_t theap_size;
-   gdk_return rc = GDK_SUCCEED;
 
assert(newcap <= BUN_MAX);
BATcheck(b, GDK_FAIL);
@@ -554,21 +553,9 @@ BATextend(BAT *b, BUN newcap)
if (b->theap->base) {
TRC_DEBUG(HEAP, "HEAPgrow in BATextend %s %zu %zu\n",
  b->theap->filename, b->theap->size, theap_size);
-   MT_lock_set(&b->theaplock);
-   if (ATOMIC_GET(&b->theap->refs) == 1) {
-   rc = HEAPextend(b->theap, theap_size, b->batRestricted 
== BAT_READ);
-   } else {
-   MT_lock_unset(&b->theaplock);
-   Heap *h = HEAPgrow(b->theap, theap_size);
-   if (h == NULL)
-   return GDK_FAIL;
-   MT_lock_set(&b->theaplock);
-   HEAPdecref(b->theap, false);
-   b->theap = h;
-   }
-   MT_lock_unset(&b->theaplock);
+   return HEAPgrow(&b->theaplock, &b->theap, theap_size, 
b->batRestricted == BAT_READ);
}
-   return rc;
+   return GDK_SUCCEED;
 }
 
 
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -147,25 +147,10 @@ insert_string_bat(BAT *b, BAT *n, struct
(var_t) 1 << 17;
MT_thread_setalgorithm("copy vheap, copy heap");
if (b->tvheap->size < ni.vh->free) {
-   MT_lock_set(&b->theaplock);
-   if (ATOMIC_GET(&b->tvheap->refs) == 1) {
-   if (HEAPextend(b->tvheap, ni.vh->free, 
force) != GDK_SUCCEED) {
-   MT_lock_unset(&b->theaplock);
-   bat_iterator_end(&ni);
-   return GDK_FAIL;
-   }
-   } else {
-   MT_lock_unset(&b->theaplock);
-   Heap *h = HEAPgrow(b->tvheap, 
ni.vh->free);
-   if (h == NULL) {
-   bat_iterator_end(&ni);
-   return GDK_FAIL;
-   }
-   MT_lock_set(&b->theaplock);
-   HEAPdecref(b->tvheap, false);
-   b->tvheap = h;
+   if (HEAPgrow(&b->theaplock, &b->tvheap, 
ni.vh->free, force) != GDK_SUCCEED) {
+   bat_iterator_end(&ni);
+   return GDK_FAIL;
}
-   MT_lock_unset(&b->theaplock);
}
memcpy(b->tvheap->base, ni.vh->base, ni.vh->free);
b->tvheap->free = ni.vh->free;
@@ -210,25 +195,10 @@ insert_string_bat(BAT *b, BAT *n, struct
toff = (toff + GDK_VARALIGN - 1) & 
~(GDK_VARALIGN - 1);
/* if in "force" mode, the heap may be
 * shared when memory mapped */
-   MT_lock_set(&b->theaplock);
-   if (ATOMIC_GET(&b->tvheap->refs) == 1) {
-   if (HEAPextend(b->tvheap, toff + 
ni.vh->size, force) != GDK_SUCCEED) {
-   MT_lock_unset(&b->theaplock);
-   bat_iterator_end(&ni);
-   return GDK_FAIL;
-   }
-   } else {
-   MT_lock_unset(&b->theaplock);
-   Heap *h = HEAPgrow(b->tvheap, toff + 
ni.vh->size);
-   if (h == NULL) {
-   bat_iterator_end(&ni);
-   return GDK_FAIL;
-   }
-   MT_lock_set(&b->theaplock);
-   HEAPdecref(b->tvheap, false);
-   b->tvheap

MonetDB: iso - Merged with Jul2021

2021-07-02 Thread Pedro Ferreira
Changeset: 35ae9857827b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/35ae9857827b
Branch: iso
Log Message:

Merged with Jul2021


diffs (261 lines):

diff --git a/clients/examples/C/bincopydata.c b/clients/examples/C/bincopydata.c
--- a/clients/examples/C/bincopydata.c
+++ b/clients/examples/C/bincopydata.c
@@ -183,7 +183,7 @@ gen_newline_strings(FILE *f, bool bytesw
 {
(void)byteswap;
for (long i = 0; i < nrecs; i++) {
-   fprintf(f, "rn\r\nr\r%ld", i);
+   fprintf(f, "RN\r\nR\r%ld", i);
fputc(0, f);
}
 }
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -129,24 +129,11 @@ static bool havehge = false;
 
 #define BBPnamecheck(s) (BBPtmpcheck(s) ? strtol((s) + 4, NULL, 8) : 0)
 
-#ifndef NDEBUG
-static inline bool
-islocked(MT_Lock *l)
-{
-   if (MT_lock_try(l)) {
-   MT_lock_unset(l);
-   return false;
-   }
-   return true;
-}
-#endif
-
 static void
 BBP_insert(bat i)
 {
bat idx = (bat) (strHash(BBP_logical(i)) & BBP_mask);
 
-   assert(islocked(&BBPnameLock));
BBP_next(i) = BBP_hash[idx];
BBP_hash[idx] = i;
 }
@@ -158,7 +145,6 @@ BBP_delete(bat i)
const char *s = BBP_logical(i);
bat idx = (bat) (strHash(s) & BBP_mask);
 
-   assert(islocked(&BBPnameLock));
for (h += idx; (i = *h) != 0; h = &BBP_next(i)) {
if (strcmp(BBP_logical(i), s) == 0) {
*h = BBP_next(i);
@@ -400,7 +386,6 @@ BBPextend(int idx, bool buildhash)
 static gdk_return
 recover_dir(int farmid, bool direxists)
 {
-   assert(islocked(&GDKtmLock));
if (direxists) {
/* just try; don't care about these non-vital files */
if (GDKunlink(farmid, BATDIR, "BBP", "bak") != GDK_SUCCEED)
@@ -1410,10 +1395,6 @@ BBPdir_first(bool subcommit, lng logno, 
int n = 0;
lng ologno, otransid;
 
-#ifndef NDEBUG
-   assert(islocked(&GDKtmLock));
-#endif
-
if (obbpfp)
*obbpfp = NULL;
*nbbpfp = NULL;
@@ -2874,7 +2855,6 @@ BBPprepare(bool subcommit)
str bakdirpath, subdirpath;
gdk_return ret = GDK_SUCCEED;
 
-   assert(islocked(&GDKtmLock));
if(!(bakdirpath = GDKfilepath(0, NULL, BAKDIR, NULL)))
return GDK_FAIL;
if(!(subdirpath = GDKfilepath(0, NULL, SUBDIR, NULL))) {
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -57,7 +57,6 @@ typedef str json;
if (*(J) != ' ' &&  
\
*(J) != '\n' && 
\
*(J) != '\t' && 
\
-   *(J) != '\f' && 
\
*(J) != '\r')   
\
break;  
\
} while (0)
@@ -871,6 +870,8 @@ JSONstringParser(const char *j, const ch
*next = j;
return MAL_SUCCEED;
default:
+   if ((unsigned char)*j < ' ')
+   throw(MAL, "json.parser", "illegal control 
char");
if (seensurrogate)
throw(MAL, "json.parser", "illegal escape 
char");
break;
@@ -911,6 +912,9 @@ JSONfractionParser(const char *j, const 
 
// skip the period character
j++;
+   // must be followed by more digits
+   if (!isdigit((unsigned char)*j))
+   return false;
for (; *j; j++)
if (!isdigit((unsigned char)*j))
break;
@@ -1022,11 +1026,16 @@ JSONtoken(JSON *jt, const char *j, const
skipblancs(j);
if (*j == '}')
break;
-   if (*j != '}' && *j != ',') {
+   if (*j != ',') {
jt->error = createException(MAL, "json.parser", 
"JSON syntax error: ',' or '}' expected at offset %td", j - string_start);
return idx;
}
j++;
+   skipblancs(j);
+   if (*j == '}') {
+   jt->error = createException(MAL, "json.parser", 
"JSON syntax error: '}' not expected at offset %td", j - string_start);
+   return idx;
+   }
}
if (*j != '}') {
jt->error = createException(MAL, "json.parser", "JSON 
syntax error: '}' expected at offset %td", j - string_start);
@@ -1083,12 +1092,16 @@ JSONtoken(JSON *

MonetDB: iso - Merged with Jul2021

2021-07-01 Thread Pedro Ferreira
Changeset: cda454f52d8f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cda454f52d8f
Modified Files:
monetdb5/modules/mal/remote.c
sql/server/sql_partition.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 545 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -560,7 +560,8 @@ typedef struct {
bool hashash:1, /* the string heap contains hash values */
cleanhash:1,/* string heaps must clean hash */
dirty:1,/* specific heap dirty marker */
-   remove:1;   /* remove storage file when freeing */
+   remove:1,   /* remove storage file when freeing */
+   wasempty:1; /* heap was empty when last saved/created */
storage_t storage;  /* storage mode (mmap/malloc). */
storage_t newstorage;   /* new desired storage mode at re-allocation. */
bat parentid;   /* cache id of VIEW parent bat */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -760,45 +760,47 @@ BBPcheckbats(unsigned bbpversion)
/* no files needed */
continue;
}
-   path = GDKfilepath(0, BATDIR, b->theap->filename, NULL);
-   if (path == NULL)
-   return GDK_FAIL;
+   if (b->theap->free > 0) {
+   path = GDKfilepath(0, BATDIR, b->theap->filename, NULL);
+   if (path == NULL)
+   return GDK_FAIL;
 #ifdef GDKLIBRARY_TAILN
-   /* if bbpversion > GDKLIBRARY_TAILN, the offset heap can
-* exist with either name .tail1 (etc) or .tail, if <=
-* GDKLIBRARY_TAILN, only with .tail */
-   char tailsave = 0;
-   size_t taillen = 0;
-   if (b->ttype == TYPE_str &&
-   b->twidth < SIZEOF_VAR_T) {
-   /* old version: .tail, not .tail1, .tail2, .tail4 */
-   taillen = strlen(path) - 1;
-   tailsave = path[taillen];
-   path[taillen] = 0;
-   }
+   /* if bbpversion > GDKLIBRARY_TAILN, the offset heap can
+* exist with either name .tail1 (etc) or .tail, if <=
+* GDKLIBRARY_TAILN, only with .tail */
+   char tailsave = 0;
+   size_t taillen = 0;
+   if (b->ttype == TYPE_str &&
+   b->twidth < SIZEOF_VAR_T) {
+   /* old version: .tail, not .tail1, .tail2, 
.tail4 */
+   taillen = strlen(path) - 1;
+   tailsave = path[taillen];
+   path[taillen] = 0;
+   }
 #endif
-   if (MT_stat(path, &statb) < 0
+   if (MT_stat(path, &statb) < 0
 #ifdef GDKLIBRARY_TAILN
-   && bbpversion > GDKLIBRARY_TAILN
-   && b->ttype == TYPE_str
-   && b->twidth < SIZEOF_VAR_T
-   && (path[taillen] = tailsave) != 0
-   && MT_stat(path, &statb) < 0
+   && bbpversion > GDKLIBRARY_TAILN
+   && b->ttype == TYPE_str
+   && b->twidth < SIZEOF_VAR_T
+   && (path[taillen] = tailsave) != 0
+   && MT_stat(path, &statb) < 0
 #endif
-   ) {
-
-   GDKsyserror("cannot stat file %s (expected size %zu)\n",
-   path, b->theap->free);
+   ) {
+
+   GDKsyserror("cannot stat file %s (expected size 
%zu)\n",
+   path, b->theap->free);
+   GDKfree(path);
+   return GDK_FAIL;
+   }
+   if ((size_t) statb.st_size < b->theap->free) {
+   GDKerror("file %s too small (expected %zu, 
actual %zu)\n", path, b->theap->free, (size_t) statb.st_size);
+   GDKfree(path);
+   return GDK_FAIL;
+   }
GDKfree(path);
-   return GDK_FAIL;
}
-   if ((size_t) statb.st_size < b->theap->free) {
-   GDKerror("file %s too small (expected %zu, actual 
%zu)\n", path, b->theap->free, (size_t) statb.st_size);
-   GDKfree(path);
-   return GDK_FAIL;
-   }
-   GDKfree(path);
-   if (b->tvheap != NULL) {
+   if (b->tvheap != NULL && b->tvheap->free > 0) {
path = GD

MonetDB: iso - Merged with Jul2021

2021-07-01 Thread Pedro Ferreira
Changeset: e67ce51fe0de for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e67ce51fe0de
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/objectset.c
sql/storage/store.c
sql/test/miscellaneous/Tests/All
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 507 to 300 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3637,7 +3637,7 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
if (BATcheckorderidx(b) ||
(/* DISABLES CODE */ (0) &&
 VIEWtparent(b) &&
-(pb = BBPdescriptor(VIEWtparent(b))) != NULL &&
+(pb = BBP_cache(VIEWtparent(b))) != NULL &&
 pb->tbaseoff == b->tbaseoff &&
 BATcount(pb) == BATcount(b) &&
 pb->hseqbase == b->hseqbase &&
@@ -3668,9 +3668,9 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
}
} else if ((VIEWtparent(b) == 0 ||
(/* DISABLES CODE */ (0) &&
-BATcount(b) == 
BATcount(BBPdescriptor(VIEWtparent(b) &&
+BATcount(b) == 
BATcount(BBP_cache(VIEWtparent(b) &&
   BATcheckimprints(b)) {
-   Imprints *imprints = VIEWtparent(b) ? 
BBPdescriptor(VIEWtparent(b))->timprints : b->timprints;
+   Imprints *imprints = VIEWtparent(b) ? 
BBP_cache(VIEWtparent(b))->timprints : b->timprints;
int i;
 
MT_thread_setalgorithm(VIEWtparent(b) ? "using parent 
imprints" : "using imprints");
@@ -3751,7 +3751,7 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
if (BATcheckorderidx(b) ||
(/* DISABLES CODE */ (0) &&
 VIEWtparent(b) &&
-(pb = BBPdescriptor(VIEWtparent(b))) != NULL &&
+(pb = BBP_cache(VIEWtparent(b))) != NULL &&
 pb->tbaseoff == b->tbaseoff &&
 BATcount(pb) == BATcount(b) &&
 pb->hseqbase == b->hseqbase &&
@@ -3773,9 +3773,9 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
}
} else if ((VIEWtparent(b) == 0 ||
(/* DISABLES CODE */ (0) &&
-BATcount(b) == 
BATcount(BBPdescriptor(VIEWtparent(b) &&
+BATcount(b) == 
BATcount(BBP_cache(VIEWtparent(b) &&
   BATcheckimprints(b)) {
-   Imprints *imprints = VIEWtparent(b) ? 
BBPdescriptor(VIEWtparent(b))->timprints : b->timprints;
+   Imprints *imprints = VIEWtparent(b) ? 
BBP_cache(VIEWtparent(b))->timprints : b->timprints;
int i;
 
MT_thread_setalgorithm(VIEWtparent(b) ? "using parent 
imprints" : "using imprints");
@@ -4059,7 +4059,7 @@ doBATgroupquantile(BAT *b, BAT *g, BAT *
if (BATcheckorderidx(b) ||
(/* DISABLES CODE */ (0) &&
 VIEWtparent(b) &&
-(pb = BBPdescriptor(VIEWtparent(b))) != NULL &&
+(pb = BBP_cache(VIEWtparent(b))) != NULL &&
 pb->tbaseoff == b->tbaseoff &&
 BATcount(pb) == BATcount(b) &&
 pb->hseqbase == b->hseqbase &&
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1929,7 +1929,7 @@ BATkeyed(BAT *b)
BAThash(b) == GDK_SUCCEED) ||
   (/* DISABLES CODE */ (0) &&
VIEWtparent(b) != 0 &&
-   BATcheckhash(BBPdescriptor(VIEWtparent(b) {
+   BATcheckhash(BBP_cache(VIEWtparent(b) {
/* we already have a hash table on b, or b is
 * persistent and we could create a hash
 * table, or b is a view on a bat that already
@@ -1939,7 +1939,7 @@ BATkeyed(BAT *b)
MT_rwlock_rdlock(&b->thashlock);
hs = b->thash;
if (hs == NULL && VIEWtparent(b) != 0) {
-   BAT *b2 = BBPdescriptor(VIEWtparent(b));
+   BAT *b2 = BBP_cache(VIEWtparent(b));
lo = b->tbaseoff - b2->tbaseoff;
hs = b2->thash;
}
@@ -2445,7 +2445,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
return GDK_SUCCEED;
}
if (VIEWtparent(b)) {
-   pb = BBPdescriptor(VIEWtparent(b));
+   pb = BBP_cache(VIEWtparent(b));
if (/* DISABLES CODE */ (1) ||
b->tbaseoff != pb->tbaseoff ||
BATcount(b) != BATcount(pb) ||
diff -

MonetDB: iso - Merged with Jul2021

2021-06-30 Thread Pedro Ferreira
Changeset: 3d793237dbd3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3d793237dbd3
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/exports.stable.out
sql/backends/monet5/sql.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 1806 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9209,7 +9209,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""  ]
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ","sql_analyze;", ""  ]
 [ "sql",   "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",  
"SQLany_cmp;",  ""  ]
-[ "sql",   "append",   "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:bat[:oid], X_5:any):int ",  "mvc_append_wrap;", ""  ]
+[ "sql",   "append",   "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:oid, X_5:bat[:oid], X_6:any):int ", "mvc_append_wrap;", "" 
 ]
 [ "sql",   "argRecord","pattern sql.argRecord():str ", 
"SQLargRecord;",""  ]
 [ "sql",   "argRecord","pattern sql.argRecord(X_0:any...):str ",   
"SQLargRecord;",""  ]
 [ "sql",   "assert",   "pattern sql.assert(X_0:bit, X_1:str):void ",   
"SQLassert;",   ""  ]
@@ -9233,7 +9233,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",   "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int):bat[:any_1] ","mvc_bind_idxbat_wrap;","" 
 ]
 [ "sql",   "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) 
", "mvc_bind_idxbat_wrap;",""  ]
 [ "sql",   "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",  
"mvc_bind_idxbat_wrap;",""  ]
-[ "sql",   "claim","unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):bat[:oid] ",  "mvc_claim_wrap;",  ""  ]
+[ "sql",   "claim","unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng) (X_4:oid, X_5:bat[:oid]) ",   "mvc_claim_wrap;",  ""  
]
 [ "sql",   "clear_table",  "unsafe pattern sql.clear_table(X_0:str, 
X_1:str):lng ","mvc_clear_table_wrap;",""  ]
 [ "sql",   "commit",   "unsafe pattern sql.commit():void ",
"SQLcommit;",   ""  ]
 [ "sql",   "copy_from","unsafe pattern sql.copy_from(X_0:ptr, X_1:str, 
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, 
X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;",   ""  
]
@@ -9687,7 +9687,7 @@ stdout of test 'MAL-signatures` in direc
 [ "wlr",   "alter_set_table",  "pattern wlr.alter_set_table(X_0:str, 
X_1:str, X_2:int):void ", "WLRgeneric;",  ""  ]
 [ "wlr",   "alter_table",  "pattern wlr.alter_table(X_0:str, X_1:str, 
X_2:int):void ", "WLRgeneric;",  ""  ]
 [ "wlr",   "alter_user",   "pattern wlr.alter_user(X_0:str, X_1:str, 
X_2:int, X_3:str, X_4:str):void ","WLRgeneric;",  ""  ]
-[ "wlr",   "append",   "pattern wlr.append(X_0:str, X_1:str, X_2:str, 
X_3:any...):int ",   "WLRappend;",   ""  ]
+[ "wlr",   "append",   "pattern wlr.append(X_0:str, X_1:str, X_2:str, 
X_3:oid, X_4:bat[:oid], X_5:any...):int ",   "WLRappend;",   ""  ]
 [ "wlr",   "catalog",  "pattern wlr.catalog(X_0:str):void ",   
"WLRcatalog;",  ""  ]
 [ "wlr",   "clear_table",  "pattern wlr.clear_table(X_0:str, X_1:str):int 
",   "WLRclear_table;",  ""  ]
 [ "wlr",   "comment_on",   "pattern wlr.comment_on(X_0:int, X_1:str):void 
",   "WLRgeneric;",  ""  ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12510,7 +12510,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""  ]
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ","sql_analyze;", ""  ]
 [ "sql",   "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",  
"SQLany_cmp;",  ""  ]
-[ "sql",   "append",   "pattern sql.append(X_0:int, X_1:st

MonetDB: iso - Merged with Jul2021

2021-06-29 Thread Pedro Ferreira
Changeset: 34a47d169724 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/34a47d169724
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 607 to 300 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -613,14 +613,18 @@ BATclear(BAT *b, bool force)
if (b->tvheap && b->tvheap->free > 0) {
Heap *th = GDKmalloc(sizeof(Heap));
 
-   if (th == NULL)
+   if (th == NULL) {
+   MT_lock_unset(&b->theaplock);
return GDK_FAIL;
+   }
*th = (Heap) {
.farmid = b->tvheap->farmid,
};
strcpy_len(th->filename, b->tvheap->filename, 
sizeof(th->filename));
-   if (ATOMheap(b->ttype, th, 0) != GDK_SUCCEED)
+   if (ATOMheap(b->ttype, th, 0) != GDK_SUCCEED) {
+   MT_lock_unset(&b->theaplock);
return GDK_FAIL;
+   }
ATOMIC_INIT(&th->refs, 1);
th->parentid = b->tvheap->parentid;
th->dirty = true;
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -3044,7 +3044,7 @@ BATcount_no_nil(BAT *b, BAT *s)
break;
case TYPE_str:
base = bi.vh->base;
-   switch (b->twidth) {
+   switch (bi.width) {
case 1:
for (i = 0; i < n; i++)
cnt += base[(var_t) ((const unsigned char *) 
p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200';
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3240,13 +3240,11 @@ BBPsync(int cnt, bat *restrict subcommit
 
if (d)
MT_lock_set(&d->theaplock);
-// else
-// MT_lock_set(&GDKswapLock(i));
if (BBP_status(i) & BBPPERSISTENT) {
BAT *b = dirty_bat(&i, subcommit != NULL);
if (i <= 0) {
-// MT_lock_unset(&GDKswapLock(subcommit ? 
subcommit[idx] : idx));
-   MT_lock_unset(&BBP_desc(i)->theaplock);
+   if (d)
+   MT_lock_unset(&d->theaplock);
break;
}
if (b)
@@ -3257,8 +3255,6 @@ BBPsync(int cnt, bat *restrict subcommit
}
if (d)
MT_lock_unset(&d->theaplock);
-// else
-// MT_lock_unset(&GDKswapLock(i));
if (n == -2)
break;
/* we once again have a saved heap */
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -770,14 +770,17 @@ BATgroup_internal(BAT **groups, BAT **ex
if (gn == NULL)
goto error;
ngrps = (oid *) Tloc(gn, 0);
+   maxgrps = BUN_NONE;
MT_rwlock_rdlock(&b->thashlock);
if (b->thash && b->thash != (Hash *) 1)
maxgrps = b->thash->nunique;
-   else if ((prop = BATgetprop_nolock(b, GDK_NUNIQUE)) != NULL)
-   maxgrps = prop->val.oval;
-   else
-   maxgrps = cnt / 10;
MT_rwlock_rdunlock(&b->thashlock);
+   if (maxgrps == BUN_NONE) {
+   if ((prop = BATgetprop(b, GDK_NUNIQUE)) != NULL)
+   maxgrps = prop->val.oval;
+   else
+   maxgrps = cnt / 10;
+   }
if (!is_oid_nil(maxgrp) && maxgrps < maxgrp)
maxgrps += maxgrp;
if (e && maxgrps < BATcount(e))
@@ -786,18 +789,20 @@ BATgroup_internal(BAT **groups, BAT **ex
maxgrps += BATcount(h);
if (maxgrps < GROUPBATINCR)
maxgrps = GROUPBATINCR;
-   if (b->twidth <= 2)
-   maxgrps = (BUN) 1 << (8 * b->twidth);
+   bi = bat_iterator(b);
+
+   if (bi.width <= 2)
+   maxgrps = (BUN) 1 << (8 * bi.width);
if (extents) {
en = COLnew(0, TYPE_oid, maxgrps, TRANSIENT);
if (en == NULL)
-   goto error;
+   goto error1;
exts = (oid *) Tloc(en, 0);
}
if (histo) {
hn = COLnew(0, TYPE_lng, maxgrps, TRANSIENT);
if (hn == NULL)
-   goto error;
+   goto error1;
cnts = (lng *) Tloc(hn, 0);
}

MonetDB: iso - Merged with Jul2021

2021-06-29 Thread Pedro Ferreira
Changeset: 7d334306309a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7d334306309a
Branch: iso
Log Message:

Merged with Jul2021


diffs (128 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -871,7 +871,40 @@ gdk_export size_t HEAPmemsize(Heap *h);
 gdk_export void HEAPdecref(Heap *h, bool remove);
 gdk_export void HEAPincref(Heap *h);
 
-/* BAT iterator, also protects use of BAT heaps with reference counts */
+/* BAT iterator, also protects use of BAT heaps with reference counts.
+ *
+ * A BAT iterator has to be used with caution, but it does have to be
+ * used in many place.
+ *
+ * An iterator is initialized by assigning it the result of a call to
+ * either bat_iterator or bat_iterator_nolock.  The former must be
+ * accompanied by a call to bat_iterator_end to release resources.
+ *
+ * bat_iterator should be used for BATs that could possibly be modified
+ * in another thread while we're reading the contents of the BAT.
+ * Alternatively, but only for very quick access, the theaplock can be
+ * taken, the data read, and the lock released.  For longer duration
+ * accesses, it is better to use the iterator, even without the BUNt*
+ * macros, since the theaplock is only held very briefly.
+ *
+ * If BATs are to be modified, higher level code must assure that no
+ * other thread is going to modify the same BAT at the same time.  A
+ * to-be-modified BAT should not use bat_iterator.  It can use
+ * bat_iterator_nolock, but be aware that this creates a copy of the
+ * heap pointer(s) (i.e. theap and tvheap) and if the heaps get
+ * extended, the pointers in the BAT structure may be modified, but that
+ * does not modify the pointers in the iterator.  This means that after
+ * operations that may grow a heap, the iterator should be
+ * reinitialized.
+ *
+ * The BAT iterator provides a number of fields that can (and often
+ * should) be used to access information about the BAT.  For string
+ * BATs, if a parallel threads adds values, the offset heap (theap) may
+ * get replaced by a one that is wider.  This involves changing the
+ * twidth and tshift values in the BAT structure.  These changed values
+ * should not be used to access the data in the iterator.  Instead, use
+ * the width and shift values in the iterator itself.
+ */
 typedef struct BATiter {
BAT *b;
Heap *h;
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1448,9 +1448,9 @@ BUNinplacemulti(BAT *b, const oid *posit
MT_rwlock_wrunlock(&b->thashlock);
return GDK_FAIL;
}
-   /* reinitialize iterator after heap upgrade */
-   bi = bat_iterator_nolock(b);
}
+   /* reinitialize iterator after possible heap upgrade */
+   bi = bat_iterator_nolock(b);
_ptr = BUNtloc(bi, p);
switch (b->twidth) {
default:/* only three or four cases possible */
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -331,11 +331,13 @@ log_read_id(logger *lg, log_id *id)
 static log_return
 string_reader(logger *lg, BAT *b, lng nr)
 {
-   int sz = 0;
+   size_t sz = 0;
+   lng SZ = 0;
log_return res = LOG_OK;
 
-   if (mnstr_readInt(lg->input_log, &sz) != 1)
+   if (mnstr_readLng(lg->input_log, &SZ) != 1)
return LOG_EOF;
+   sz = (size_t)SZ;
char *buf = GDKmalloc(sz);
 
if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1) {
@@ -2347,12 +2349,13 @@ string_writer(logger *lg, BAT *b, lng of
if (buf) {
for(BUN p = (BUN)offset; p < end; p++) {
char *s = BUNtail(bi, p);
-   strcpy(dst, s);
-   dst += strlen(s)+1;
+   size_t len = strlen(s)+1;
+   memcpy(dst, s, len);
+   dst += len;
}
}
gdk_return res = GDK_FAIL;
-   if (buf && mnstr_writeInt(lg->output_log, (int) sz) && 
mnstr_write(lg->output_log, buf, sz, 1) == 1)
+   if (buf && mnstr_writeLng(lg->output_log, (lng) sz) && 
mnstr_write(lg->output_log, buf, sz, 1) == 1)
res = GDK_SUCCEED;
GDKfree(buf);
bat_iterator_end(&bi);
diff --git a/monetdb5/modules/mal/manifold.c b/monetdb5/modules/mal/manifold.c
--- a/monetdb5/modules/mal/manifold.c
+++ b/monetdb5/modules/mal/manifold.c
@@ -135,7 +135,7 @@ typedef struct{
break;  
\
}   
\

MonetDB: iso - Merged with Jul2021

2021-06-29 Thread Pedro Ferreira
Changeset: d86c6eb6afee for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d86c6eb6afee
Modified Files:
sql/backends/monet5/sql.c
sql/server/sql_partition.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 6325 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1079,7 +1079,6 @@ gdk_export BUN BUNfnd(BAT *b, const void
 (BUN) (*(const oid*)(v) - (b)->tseqbase))
 
 #define BATttype(b)(BATtdense(b) ? TYPE_oid : (b)->ttype)
-#define Tbase(b)   ((b)->tvheap->base)
 
 #define Tsize(b)   ((b)->twidth)
 
@@ -1410,8 +1409,8 @@ BATsettrivprop(BAT *b)
int c;
if (b->tvarsized)
c = ATOMcmp(b->ttype,
-   Tbase(b) + VarHeapVal(Tloc(b, 0), 0, 
b->twidth),
-   Tbase(b) + VarHeapVal(Tloc(b, 0), 1, 
b->twidth));
+   b->tvheap->base + VarHeapVal(Tloc(b, 0), 0, 
b->twidth),
+   b->tvheap->base + VarHeapVal(Tloc(b, 0), 1, 
b->twidth));
else
c = ATOMcmp(b->ttype, Tloc(b, 0), Tloc(b, 1));
b->tsorted = c <= 0;
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -910,7 +910,7 @@ BATgroupsum(BAT *b, BAT *g, BAT *e, BAT 
}
 
if ((e == NULL ||
-(BATcount(e) == BATcount(b) && e->hseqbase == b->hseqbase)) &&
+(BATcount(e) == ncand && e->hseqbase == ci.hseq)) &&
(BATtdense(g) || (g->tkey && g->tnonil))) {
/* trivial: singleton groups, so all results are equal
 * to the inputs (but possibly a different type) */
@@ -1586,7 +1586,7 @@ BATgroupprod(BAT *b, BAT *g, BAT *e, BAT
}
 
if ((e == NULL ||
-(BATcount(e) == BATcount(b) && e->hseqbase == b->hseqbase)) &&
+(BATcount(e) == ncand && e->hseqbase == ci.hseq)) &&
(BATtdense(g) || (g->tkey && g->tnonil))) {
/* trivial: singleton groups, so all results are equal
 * to the inputs (but possibly a different type) */
@@ -2901,7 +2901,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
} else {\
sum = -sum; \
a = - (TYPE) (sum / n); /* this fits */ \
-   r = (lng) (sum % n);\
+   r = (lng) (sum % n);\
if (r) {\
a--;\
r = n - r;  \
@@ -3008,7 +3008,7 @@ BATcalcavg(BAT *b, BAT *s, dbl *avg, BUN
 
 #define AGGR_COUNT(TYPE)   \
do {\
-   const TYPE *restrict vals = (const TYPE *) bi.base; \
+   const TYPE *restrict vals = (const TYPE *) bi.base; \
while (ncand > 0) { \
ncand--;\
i = canditer_next(&ci) - b->hseqbase;   \
@@ -3244,7 +3244,7 @@ BATgroupsize(BAT *b, BAT *g, BAT *e, BAT
 
 #define AGGR_CMP(TYPE, OP) \
do {\
-   const TYPE *restrict vals = (const TYPE *) bi.base; \
+   const TYPE *restrict vals = (const TYPE *) bi.base; \
if (ngrp == ncand) {\
/* single element groups */ \
while (ncand > 0) { \
@@ -4337,8 +4337,8 @@ BATcalcvariance_sample(dbl *avgp, BAT *b
delta2 = (dbl) y - mean2;   \
mean2 += delta2 / n;\
m2 += delta1 * ((dbl) y - mean2);   \
-   if (isinf(m2))  \
-   goto overflow;  \
+   if (isinf(m2))  \
+   goto overflow;  \
}   \
} while (0)
 
@@ -4431,8 +4431,8 @@ BATcalccovariance_sample(BAT *b1, BAT *b
up += delta1 * aux; \
down1 += delta1 * ((dbl) x - mean1);\
down2 += delta2 * aux;  \
-   if (isinf(up) || isinf(down1) || isinf(do

MonetDB: iso - Merged with Jul2021

2021-06-28 Thread Pedro Ferreira
Changeset: 1190c4ecad0e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1190c4ecad0e
Modified Files:
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (21 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2076,15 +2076,15 @@ store_exit(sqlstore *store)
if (c->cleanup && !c->cleanup(store, c, 
oldest)) {
/* try again with newer oldest, should 
cleanup any pending issues */
if (!c->cleanup(store, c, oldest+1))
-   printf("not deleted\n");
+   TRC_DEBUG(SQL_STORE, "not 
deleted\n");
else
_DELETE(c);
} else
_DELETE(c);
}
}
+   MT_lock_unset(&store->commit);
list_destroy(store->changes);
-   MT_lock_unset(&store->commit);
os_destroy(store->cat->objects, store);
os_destroy(store->cat->schemas, store);
_DELETE(store->cat);
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: iso - Merged with Jul2021

2021-06-28 Thread Pedro Ferreira
Changeset: 40a042bd8329 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/40a042bd8329
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_user.c
sql/storage/bat/bat_storage.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 2485 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -5753,6 +5753,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:str], 
X_1:bat[:oid]):bat[:uuid] ",   "UUIDstr2uuid_bulk;",   ""  ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:uuid], 
X_1:bat[:oid]):bat[:uuid] ",  "UUIDuuid2uuid_bulk;",  ""  ]
 [ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",   "geom_2_geom_bat;", ""  ]
+[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:str], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",   "wkbFromText_bat_cand;",""  ]
 [ "batcalc",   "xml",  "command batcalc.xml(X_0:bat[:str]):bat[:xml] ",
"BATXMLstr2xml;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], 
X_1:bat[:bit]):bat[:bit] ", "CMDbatXOR;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], X_1:bat[:bit], 
X_2:bat[:oid], X_3:bat[:oid]):bat[:bit] ",   "CMDbatXOR;",   ""  ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -8277,6 +8277,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:str], 
X_1:bat[:oid]):bat[:uuid] ",   "UUIDstr2uuid_bulk;",   ""  ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:uuid], 
X_1:bat[:oid]):bat[:uuid] ",  "UUIDuuid2uuid_bulk;",  ""  ]
 [ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",   "geom_2_geom_bat;", ""  ]
+[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:str], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",   "wkbFromText_bat_cand;",""  ]
 [ "batcalc",   "xml",  "command batcalc.xml(X_0:bat[:str]):bat[:xml] ",
"BATXMLstr2xml;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], 
X_1:bat[:bit]):bat[:bit] ", "CMDbatXOR;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], X_1:bat[:bit], 
X_2:bat[:oid], X_3:bat[:oid]):bat[:bit] ",   "CMDbatXOR;",   ""  ]
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -331,6 +331,8 @@
 #include /* for *_MIN and *_MAX */
 #include  /* for FLT_MAX and DBL_MAX */
 
+typedef enum { GDK_FAIL, GDK_SUCCEED } gdk_return;
+
 #include "gdk_system.h"
 #include "gdk_posix.h"
 #include "stream.h"
@@ -524,8 +526,6 @@ typedef size_t BUN;
 /*
  * @- Checking and Error definitions:
  */
-typedef enum { GDK_FAIL, GDK_SUCCEED } gdk_return;
-
 #define ATOMextern(t)  (ATOMstorage(t) >= TYPE_str)
 
 typedef enum {
@@ -1592,6 +1592,8 @@ gdk_export BAT *BBPquickdesc(bat b, bool
 
 #include "gdk_tracer.h"
 
+gdk_export gdk_return GDKtracer_fill_comp_info(BAT *id, BAT *component, BAT 
*log_level);
+
 #define GDKerror(format, ...)  \
GDKtracer_log(__FILE__, __func__, __LINE__, M_ERROR,\
  GDK, NULL, format, ##__VA_ARGS__)
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2335,7 +2335,7 @@ log_constant(logger *lg, int type, ptr v
 static gdk_return
 string_writer(logger *lg, BAT *b, lng offset, lng nr)
 {
-   int sz = 0;
+   size_t sz = 0;
BUN end = (BUN)(offset + nr);
 
BATiter bi = bat_iterator(b);
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -179,6 +179,7 @@ gdk_export int MT_join_thread(MT_Id t);
 #define USE_NATIVE_LOCKS 1
 
 #ifdef LOCK_STATS
+#include "gdk_tracer.h"
 
 #define _DBG_LOCK_COUNT_0(l)   \
do {\
diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h
--- a/gdk/gdk_tracer.h
+++ b/gdk/gdk_tracer.h
@@ -259,6 +259,4 @@ gdk_export void GDKtracer_log(const char
 
 gdk_export gdk_return GDKtracer_flush_buffer(void);
 
-gdk_export gdk_return GDKtracer_fill_comp_info(BAT *id, BAT *component, BAT 
*log_level);
-
 #endif /* _GDK_TRACER_H_ */
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -6575,6 +6575,7 @@ static mel_func geom_init_funcs[] = {
  command(

MonetDB: iso - Merged with Jul2021

2021-06-26 Thread Pedro Ferreira
Changeset: 0d3d886c54c3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0d3d886c54c3
Modified Files:
sql/server/rel_rel.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 4215 to 300 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -329,6 +329,36 @@ log_read_id(logger *lg, log_id *id)
 #endif
 
 static log_return
+string_reader(logger *lg, BAT *b, lng nr)
+{
+   int sz = 0;
+   log_return res = LOG_OK;
+
+   if (mnstr_readInt(lg->input_log, &sz) != 1)
+   return LOG_EOF;
+   char *buf = GDKmalloc(sz);
+
+   if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1) {
+   GDKfree(buf);
+   return LOG_EOF;
+   }
+   /* handle strings */
+   if (b) {
+   char *t = buf;
+   for(int i=0; i 0; nr--) {
size_t tlen = lg->bufsize;
@@ -487,6 +520,9 @@ log_read_updates(logger *lg, trans *tr, 
break;
}
}
+   } else if (tpe == TYPE_str) {
+   /* efficient string */
+   res = string_reader(lg, r, nr);
} else {
for (; res == LOG_OK && nr > 0; nr--) {
size_t tlen = lg->bufsize;
@@ -2297,6 +2333,33 @@ log_constant(logger *lg, int type, ptr v
 }
 
 static gdk_return
+string_writer(logger *lg, BAT *b, lng offset, lng nr)
+{
+   int sz = 0;
+   BUN end = (BUN)(offset + nr);
+
+   BATiter bi = bat_iterator(b);
+   for(BUN p = (BUN)offset; p < end; p++) {
+   char *s = BUNtail(bi, p);
+   sz += strlen(s)+1; /* we need a seperator */
+   }
+   char *buf = GDKmalloc(sz), *dst = buf;
+   if (buf) {
+   for(BUN p = (BUN)offset; p < end; p++) {
+   char *s = BUNtail(bi, p);
+   strcpy(dst, s);
+   dst += strlen(s)+1;
+   }
+   }
+   gdk_return res = GDK_FAIL;
+   if (buf && mnstr_writeInt(lg->output_log, (int) sz) && 
mnstr_write(lg->output_log, buf, sz, 1) == 1)
+   res = GDK_SUCCEED;
+   GDKfree(buf);
+   bat_iterator_end(&bi);
+   return res;
+}
+
+static gdk_return
 internal_log_bat(logger *lg, BAT *b, log_id id, lng offset, lng cnt, int 
sliced)
 {
bte tpe = find_type(lg, b->ttype);
@@ -2323,7 +2386,6 @@ internal_log_bat(logger *lg, BAT *b, log
return GDK_SUCCEED;
}
 
-   BATiter bi = bat_iterator(b);
gdk_return (*wt) (const void *, stream *, size_t) = 
BATatoms[b->ttype].atomWrite;
 
if (is_row)
@@ -2340,6 +2402,7 @@ internal_log_bat(logger *lg, BAT *b, log
if (sliced)
offset = 0;
if (b->ttype == TYPE_msk) {
+   BATiter bi = bat_iterator(b);
if (offset % 32 == 0) {
if (!mnstr_writeIntArray(lg->output_log, (int *) ((char 
*) bi.base + offset / 32), (size_t) ((nr + 31) / 32)))
ok = GDK_FAIL;
@@ -2354,24 +2417,31 @@ internal_log_bat(logger *lg, BAT *b, log
}
}
}
+   bat_iterator_end(&bi);
} else if (b->ttype < TYPE_str && !isVIEW(b)) {
+   BATiter bi = bat_iterator(b);
const void *t = BUNtail(bi, (BUN)offset);
 
ok = wt(t, lg->output_log, (size_t)nr);
+   bat_iterator_end(&bi);
+   } else if (b->ttype == TYPE_str) {
+   /* efficient string writes */
+   ok = string_writer(lg, b, offset, nr);
} else {
+   BATiter bi = bat_iterator(b);
BUN end = (BUN)(offset+nr);
for (p = (BUN)offset; p < end && ok == GDK_SUCCEED; p++) {
const void *t = BUNtail(bi, p);
 
ok = wt(t, lg->output_log, 1);
}
+   bat_iterator_end(&bi);
}
 
if (lg->debug & 1)
fprintf(stderr, "#Logged %d " LLFMT " inserts\n", id, nr);
 
   bailout:
-   bat_iterator_end(&bi);
if (ok != GDK_SUCCEED) {
const char *err = mnstr_peek_error(lg->output_log);
TRC_CRITICAL(GDK, "write failed%s%s\n", err ? ": " : "", err ? 
err : "");
@@ -2498,6 +2568,9 @@ log_delta(logger *lg, BAT *uid, BAT *uva
if (uval->ttype == TYPE_msk) {
if (!mnstr_writeIntArray(lg->output_log, vi.base, 
(BUNlast(uval) + 31) / 32))
ok = GDK_FAIL;
+   } else if (uval->ttype == TYPE_str) {
+   /* efficient string writes */
+   ok = string_writer(lg, uval, 0, nr);
} else {
for (p = 0; p < BUNlast

MonetDB: iso - Merged with Jul2021

2021-06-25 Thread Pedro Ferreira
Changeset: c3bbcb6bc624 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c3bbcb6bc624
Modified Files:
sql/backends/monet5/sql.c
sql/backends/monet5/sql_user.c
sql/server/sql_parser.y
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 16516 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
@@ -187,7 +187,7 @@ BAT *BATsample_with_seed(BAT *b, BUN n, 
 gdk_return BATsave(BAT *b) __attribute__((__warn_unused_result__));
 BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool li, bool 
hi, bool anti);
 gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
bool nil_matches, bool max_one, BUN estimate) 
__attribute__((__warn_unused_result__));
-gdk_return BATsetaccess(BAT *b, restrict_t mode);
+BAT *BATsetaccess(BAT *b, restrict_t mode) 
__attribute__((__warn_unused_result__));
 void BATsetcapacity(BAT *b, BUN cnt);
 void BATsetcount(BAT *b, BUN cnt);
 BAT *BATslice(BAT *b, BUN low, BUN high);
diff --git a/common/utils/mcrypt.c b/common/utils/mcrypt.c
--- a/common/utils/mcrypt.c
+++ b/common/utils/mcrypt.c
@@ -505,6 +505,8 @@ mcrypt_hashPassword(
} else
 #endif
{
+   (void) len;
+   (void) ret;
(void) algo;
(void) password;
(void) challenge;
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -776,14 +776,6 @@ typedef struct BAT {
MT_Lock batIdxLock; /* lock to manipulate other indexes/properties 
*/
 } BAT;
 
-typedef struct BATiter {
-   BAT *b;
-   union {
-   oid tvid;
-   bool tmsk;
-   };
-} BATiter;
-
 /* macros to hide complexity of the BAT structure */
 #define ttype  T.type
 #define tkey   T.key
@@ -879,6 +871,98 @@ gdk_export size_t HEAPmemsize(Heap *h);
 gdk_export void HEAPdecref(Heap *h, bool remove);
 gdk_export void HEAPincref(Heap *h);
 
+/* BAT iterator, also protects use of BAT heaps with reference counts */
+typedef struct BATiter {
+   BAT *b;
+   Heap *h;
+   void *base;
+   Heap *vh;
+   BUN count;
+   uint16_t width;
+   uint8_t shift;
+   int8_t type;
+   oid tseq;
+   union {
+   oid tvid;
+   bool tmsk;
+   };
+#ifndef NDEBUG
+   bool locked;
+#endif
+} BATiter;
+
+static inline BATiter
+bat_iterator(BAT *b)
+{
+   /* needs matching bat_iterator_end */
+   BATiter bi;
+   if (b) {
+   MT_lock_set(&b->theaplock);
+   bi = (BATiter) {
+   .b = b,
+   .h = b->theap,
+   .base = b->theap->base ? b->theap->base + (b->tbaseoff 
<< b->tshift) : NULL,
+   .vh = b->tvheap,
+   .count = b->batCount,
+   .width = b->twidth,
+   .shift = b->tshift,
+   .type = b->ttype,
+   .tseq = b->tseqbase,
+#ifndef NDEBUG
+   .locked = true,
+#endif
+   };
+   HEAPincref(bi.h);
+   if (bi.vh)
+   HEAPincref(bi.vh);
+   MT_lock_unset(&b->theaplock);
+   } else {
+   bi = (BATiter) {
+   .b = NULL,
+#ifndef NDEBUG
+   .locked = true,
+#endif
+   };
+   }
+   return bi;
+}
+
+static inline void
+bat_iterator_end(BATiter *bip)
+{
+   /* matches bat_iterator */
+   assert(bip);
+   assert(bip->locked);
+   if (bip->h)
+   HEAPdecref(bip->h, false);
+   if (bip->vh)
+   HEAPdecref(bip->vh, false);
+   *bip = (BATiter) {0};
+}
+
+static inline BATiter
+bat_iterator_nolock(BAT *b)
+{
+   /* does not get matched by bat_iterator_end */
+   if (b) {
+   return (BATiter) {
+   .b = b,
+   .h = b->theap,
+   .base = b->theap->base ? b->theap->base + (b->tbaseoff 
<< b->tshift) : NULL,
+   .vh = b->tvheap,
+   .count = b->batCount,
+   .width = b->twidth,
+   .shift = b->tshift,
+   .type = b->ttype,
+   .tseq = b->tseqbase,
+#ifndef NDEBUG
+   .locked = false,
+#endif
+   };
+   }
+   return (BATiter) {0};
+}
+
 /*
  * @- Internal HEAP Chunk Management
  * Heaps are used in BATs to store data for variable-size atoms.  The
@@ -1011,12 +1095,12 @@ typedef var_t stridx_t;
 #define SIZEOF_STRIDX_T SIZEOF_VAR_T
 #define GDK_VARALIGN SIZEOF_STRIDX_T
 
-#define BUNtvaroff(bi,p) VarHeapVal(Tloc((bi).b, 0), (p), (bi).b->twidth)
+

MonetDB: iso - merged with jul2021

2021-06-23 Thread Niels Nes
Changeset: 411c2c2b849a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/411c2c2b849a
Modified Files:
sql/include/sql_catalog.h
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:

merged with jul2021


diffs (truncated from 719 to 300 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2358,7 +2358,7 @@ decref(bat i, bool logical, bool release
}
}
}
-   if (b && b->batCount > b->batInserted) {
+   if (b && b->batCount > b->batInserted && !isVIEW(b)) {
/* if batCount is larger than batInserted and the dirty
 * bits are off, it may be that a (sub)commit happened
 * in parallel to an update; we must undo the turning
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -1069,7 +1069,7 @@ HASHprobe(const Hash *h, const void *v)
}
 }
 
-inline void
+void
 HASHappend_locked(BAT *b, BUN i, const void *v)
 {
Hash *h = b->thash;
@@ -1140,7 +1140,7 @@ HASHappend(BAT *b, BUN i, const void *v)
 }
 
 /* insert value v at position p into the hash table of b */
-inline void
+void
 HASHinsert_locked(BAT *b, BUN p, const void *v)
 {
Hash *h = b->thash;
@@ -1223,7 +1223,7 @@ HASHinsert(BAT *b, BUN p, const void *v)
 }
 
 /* delete value v at position p from the hash table of b */
-inline void
+void
 HASHdelete_locked(BAT *b, BUN p, const void *v)
 {
Hash *h = b->thash;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -168,9 +168,6 @@ gdk_return GDKunlink(int farmid, const c
__attribute__((__visibility__("hidden")));
 void HASHappend(BAT *b, BUN i, const void *v)
__attribute__((__visibility__("hidden")));
-#ifdef _MSC_VER
-inline
-#endif
 void HASHappend_locked(BAT *b, BUN i, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHfree(BAT *b)
@@ -179,16 +176,10 @@ bool HASHgonebad(BAT *b, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHdelete(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
-#ifdef _MSC_VER
-inline
-#endif
 void HASHdelete_locked(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHinsert(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
-#ifdef _MSC_VER
-inline
-#endif
 void HASHinsert_locked(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
 BUN HASHmask(BUN cnt)
diff --git a/sql/common/sql_changeset.c b/sql/common/sql_changeset.c
--- a/sql/common/sql_changeset.c
+++ b/sql/common/sql_changeset.c
@@ -32,21 +32,21 @@ cs_destroy(changeset * cs, void *data)
 }
 
 void
-cs_add(changeset * cs, void *elm, int flags)
+cs_add(changeset * cs, void *elm, bool isnew)
 {
if (!cs->set)
cs->set = list_new(cs->sa, cs->destroy);
list_append(cs->set, elm);
-   if (newFlagSet(flags) && !cs->nelm)
+   if (isnew && !cs->nelm)
cs->nelm = cs->set->t;
 }
 
 void
-cs_del(changeset * cs, void *gdata, node *elm, int flags)
+cs_del(changeset * cs, void *gdata, node *elm, bool isnew)
 {
if (cs->nelm == elm)
cs->nelm = elm->next;
-   if (newFlagSet(flags)) {/* remove just added */
+   if (isnew) {/* remove just added */
list_remove_node(cs->set, gdata, elm);
} else {
if (!cs->dset)
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -156,11 +156,11 @@ bool is_commutative(const char *fnm)
 }
 
 void
-base_init(sql_allocator *sa, sql_base * b, sqlid id, int flags, const char 
*name)
+base_init(sql_allocator *sa, sql_base * b, sqlid id, bool isnew, const char 
*name)
 {
*b = (sql_base) {
.id = id,
-   .flags = flags,
+   .new = isnew,
.refcnt = 1,
.name = (name) ? SA_STRDUP(sa, name) : NULL,
};
@@ -603,7 +603,7 @@ sql_create_type(sql_allocator *sa, const
 {
sql_type *t = SA_ZNEW(sa, sql_type);
 
-   base_init(sa, &t->base, local_id++, 0, sqlname);
+   base_init(sa, &t->base, local_id++, false, sqlname);
t->impl = sa_strdup(sa, impl);
t->digits = digits;
t->scale = scale;
@@ -653,7 +653,7 @@ sql_create_func_(sql_allocator *sa, cons
}
if (res)
fres = create_arg(sa, NULL, sql_create_subtype(sa, res, 0, 0), 
ARG_OUT);
-   base_init(sa, &t->base, local_id++, 0, name);
+   base_init(sa, &t->base, local_id++, false, name);
 
t->imp = sa_strdup(sa, imp);
t->mod = sa_strdup(sa, mod);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -87,9 +87,6 @@ typedef enum sql_dep

MonetDB: iso - Merged with Jul2021

2021-06-22 Thread Pedro Ferreira
Changeset: 5ff93408e804 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5ff93408e804
Modified Files:
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (146 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2358,7 +2358,7 @@ decref(bat i, bool logical, bool release
}
}
}
-   if (b && b->batCount > b->batInserted) {
+   if (b && b->batCount > b->batInserted && !isVIEW(b)) {
/* if batCount is larger than batInserted and the dirty
 * bits are off, it may be that a (sub)commit happened
 * in parallel to an update; we must undo the turning
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -1069,7 +1069,7 @@ HASHprobe(const Hash *h, const void *v)
}
 }
 
-inline void
+void
 HASHappend_locked(BAT *b, BUN i, const void *v)
 {
Hash *h = b->thash;
@@ -1140,7 +1140,7 @@ HASHappend(BAT *b, BUN i, const void *v)
 }
 
 /* insert value v at position p into the hash table of b */
-inline void
+void
 HASHinsert_locked(BAT *b, BUN p, const void *v)
 {
Hash *h = b->thash;
@@ -1223,7 +1223,7 @@ HASHinsert(BAT *b, BUN p, const void *v)
 }
 
 /* delete value v at position p from the hash table of b */
-inline void
+void
 HASHdelete_locked(BAT *b, BUN p, const void *v)
 {
Hash *h = b->thash;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -168,9 +168,6 @@ gdk_return GDKunlink(int farmid, const c
__attribute__((__visibility__("hidden")));
 void HASHappend(BAT *b, BUN i, const void *v)
__attribute__((__visibility__("hidden")));
-#ifdef _MSC_VER
-inline
-#endif
 void HASHappend_locked(BAT *b, BUN i, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHfree(BAT *b)
@@ -179,16 +176,10 @@ bool HASHgonebad(BAT *b, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHdelete(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
-#ifdef _MSC_VER
-inline
-#endif
 void HASHdelete_locked(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHinsert(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
-#ifdef _MSC_VER
-inline
-#endif
 void HASHinsert_locked(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
 BUN HASHmask(BUN cnt)
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2113,7 +2113,7 @@ store_exit(sqlstore *store)
MT_lock_set(&store->flush);
}
MT_lock_set(&store->commit);
-   if (store->changes) {
+   if (!list_empty(store->changes)) {
ulng oldest = store_timestamp(store)+1;
for(node *n=store->changes->h; n; n = n->next) {
sql_change *c = n->data;
@@ -2182,7 +2182,7 @@ store_resume_log(sqlstore *store)
 static void
 store_pending_changes(sqlstore *store, ulng oldest)
 {
-   ulng oldest_changes = TRANSACTION_ID_BASE;
+   ulng oldest_changes = store_get_timestamp(store);
if (!list_empty(store->changes)) { /* lets first cleanup old stuff */
for(node *n=store->changes->h; n; ) {
node *next = n->next;
@@ -2198,11 +2198,8 @@ store_pending_changes(sqlstore *store, u
}
n = next;
}
-   if (oldest_changes < TRANSACTION_ID_BASE)
-   store->oldest_pending = oldest_changes;
-   } else {
-   store->oldest_pending = store_get_timestamp(store);
-   }
+   }
+   store->oldest_pending = oldest_changes;
 }
 
 void
@@ -3391,7 +3388,7 @@ sql_trans_rollback(sql_trans *tr, int lo
n = next;
}
}
-   if (tr->changes) {
+   if (!list_empty(tr->changes)) {
/* revert the change list */
list *nl = SA_LIST(tr->sa, (fdestroy) NULL);
for(node *n=tr->changes->h; n; n = n->next)
@@ -3634,7 +3631,7 @@ sql_trans_commit(sql_trans *tr)
/* log changes should only be done if there is something to log 
*/
if (!tr->parent && tr->logchanges > 0) {
int min_changes = GDKdebug & FORCEMITOMASK ? 5 : 10;
-   flush = (tr->logchanges > min_changes && 
!store->changes);
+   flush = (tr->logchanges > min_changes && 
list_empty(store->changes));
if (flush)
MT_lock_set(&store->flush);
ok = store->logger_api.log_tstart(store, flush);
@@ -6522,17 +6519,15 @@ sql_trans_end(sql_session *s, int ok)
store_lock(store);
   

MonetDB: iso - Merged with Jul2021

2021-06-22 Thread Pedro Ferreira
Changeset: 96b6121d3782 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/96b6121d3782
Branch: iso
Log Message:

Merged with Jul2021


diffs (30 lines):

diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -168,6 +168,9 @@ gdk_return GDKunlink(int farmid, const c
__attribute__((__visibility__("hidden")));
 void HASHappend(BAT *b, BUN i, const void *v)
__attribute__((__visibility__("hidden")));
+#ifdef _MSC_VER
+inline
+#endif
 void HASHappend_locked(BAT *b, BUN i, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHfree(BAT *b)
@@ -176,10 +179,16 @@ bool HASHgonebad(BAT *b, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHdelete(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
+#ifdef _MSC_VER
+inline
+#endif
 void HASHdelete_locked(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
 void HASHinsert(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
+#ifdef _MSC_VER
+inline
+#endif
 void HASHinsert_locked(BAT *b, BUN p, const void *v)
__attribute__((__visibility__("hidden")));
 BUN HASHmask(BUN cnt)
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: iso - Merged with Jul2021

2021-06-21 Thread Pedro Ferreira
Changeset: 159862acbca7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/159862acbca7
Modified Files:
sql/storage/bat/bat_storage.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 321 to 300 lines):

diff --git a/common/stream/stdio_stream.c b/common/stream/stdio_stream.c
--- a/common/stream/stdio_stream.c
+++ b/common/stream/stdio_stream.c
@@ -31,9 +31,8 @@ file_read(stream *restrict s, void *rest
return -1;
}
 
-   if (elmsize && cnt && !feof(fp)) {
-   if (ferror(fp) ||
-   ((rc = fread(buf, elmsize, cnt, fp)) == 0 && ferror(fp))) {
+   if (elmsize && cnt) {
+   if ((rc = fread(buf, elmsize, cnt, fp)) == 0 && ferror(fp)) {
mnstr_set_error_errno(s, MNSTR_READ_ERROR, "read 
error");
return -1;
}
@@ -55,7 +54,7 @@ file_write(stream *restrict s, const voi
if (elmsize && cnt) {
size_t rc = fwrite(buf, elmsize, cnt, fp);
 
-   if (ferror(fp)) {
+   if (!rc && ferror(fp)) {
mnstr_set_error_errno(s, MNSTR_WRITE_ERROR, "write 
error");
return -1;
}
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2295,6 +2295,8 @@ BATmode(BAT *b, bool transient)
/* can only make a bat PERSISTENT if its role is already
 * PERSISTENT */
assert(transient || b->batRole == PERSISTENT);
+   /* cannot make a view PERSISTENT */
+   assert(transient || !isVIEW(b));
 
if (b->batRole == TRANSIENT && !transient) {
GDKerror("cannot change mode of BAT in TRANSIENT farm.\n");
@@ -2308,11 +2310,6 @@ BATmode(BAT *b, bool transient)
check_type(b->ttype);
}
 
-   if (!transient && isVIEW(b)) {
-   if (VIEWreset(b) != GDK_SUCCEED) {
-   return GDK_FAIL;
-   }
-   }
/* persistent BATs get a logical reference */
if (!transient) {
BBPretain(bid);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1800,6 +1800,7 @@ maybeextend(int idx)
BBP_free(m) = BBP_next(i);
BBP_next(i) = 0;
BBP_free(idx) = i;
+   GDKclrerr();
} else {
/* nothing available */
return GDK_FAIL;
@@ -1885,8 +1886,10 @@ BBPinsert(BAT *bn)
 
if (*BBP_bak(i) == 0)
len = snprintf(BBP_bak(i), sizeof(BBP_bak(i)), "tmp_%o", 
(unsigned) i);
-   if (len == -1 || len >= FILENAME_MAX)
+   if (len == -1 || len >= FILENAME_MAX) {
+   GDKerror("impossible error\n");
return 0;
+   }
BBP_logical(i) = BBP_bak(i);
 
/* Keep the physical location around forever */
@@ -2355,6 +2358,17 @@ decref(bat i, bool logical, bool release
}
}
}
+   if (b && b->batCount > b->batInserted) {
+   /* if batCount is larger than batInserted and the dirty
+* bits are off, it may be that a (sub)commit happened
+* in parallel to an update; we must undo the turning
+* off of the dirty bits */
+   b->batDirtydesc = true;
+   if (b->theap)
+   b->theap->dirty = true;
+   if (b->tvheap)
+   b->tvheap->dirty = true;
+   }
 
/* we destroy transients asap and unload persistent bats only
 * if they have been made cold or are not dirty */
@@ -2497,13 +2511,14 @@ getBBPdescriptor(bat i, bool lock)
 
assert(i > 0);
if (!BBPcheck(i, "BBPdescriptor")) {
+   GDKerror("BBPcheck failed for bat id %d\n", i);
return NULL;
}
assert(BBP_refs(i));
-   if ((b = BBP_cache(i)) == NULL) {
-
-   if (lock)
-   MT_lock_set(&GDKswapLock(i));
+   if (lock)
+   MT_lock_set(&GDKswapLock(i));
+   if ((b = BBP_cache(i)) == NULL || BBP_status(i) & BBPWAITING) {
+
while (BBP_status(i) & BBPWAITING) {/* wait for bat to be 
loaded by other thread */
if (lock)
MT_lock_unset(&GDKswapLock(i));
@@ -2519,9 +2534,9 @@ getBBPdescriptor(bat i, bool lock)
BBP_status_on(i, BBPLOADING);
}
}
-   if (lock)
-   MT_lock_unset(&GDKswapLock(i));
}
+   if (lock)
+   MT_lock_unset(&GDKswapLock(i));
if (load) {
 

MonetDB: iso - Merged with Jul2021

2021-06-18 Thread Pedro Ferreira
Changeset: 58f0bc5ca6e3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/58f0bc5ca6e3
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 2202 to 300 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1253,18 +1253,22 @@ BUNappendmulti(BAT *b, const void *value
 
BATrmprop(b, GDK_UNIQUE_ESTIMATE);
b->theap->dirty |= count > 0;
+   MT_rwlock_wrlock(&b->thashlock);
for (BUN i = 0; i < count; i++) {
void *t = b->ttype && b->tvarsized ? ((void **) values)[i] :
(void *) ((char *) values + i * Tsize(b));
setcolprops(b, t);
gdk_return rc = bunfastapp_nocheck(b, p, t, Tsize(b));
-   if (rc != GDK_SUCCEED)
+   if (rc != GDK_SUCCEED) {
+   MT_rwlock_wrunlock(&b->thashlock);
return rc;
+   }
if (b->thash) {
-   HASHappend(b, p, t);
+   HASHappend_locked(b, p, t);
}
p++;
}
+   MT_rwlock_wrunlock(&b->thashlock);
 
IMPSdestroy(b); /* no support for inserts in imprints yet */
OIDXdestroy(b);
@@ -1405,7 +1409,6 @@ BUNinplacemulti(BAT *b, const oid *posit
 * clear it */
b->tnil = false;
}
-   HASHdelete(b, p, val);  /* first delete old value from hash */
if (b->ttype != TYPE_void && ATOMlinear(b->ttype)) {
const ValRecord *prop;
 
@@ -1449,6 +1452,9 @@ BUNinplacemulti(BAT *b, const oid *posit
}
OIDXdestroy(b);
IMPSdestroy(b);
+
+   MT_rwlock_wrlock(&b->thashlock);
+   HASHdelete_locked(b, p, val);   /* first delete old value from 
hash */
if (b->tvarsized && b->ttype) {
var_t _d;
ptr _ptr;
@@ -1469,13 +1475,17 @@ BUNinplacemulti(BAT *b, const oid *posit
break;
 #endif
}
-   if (ATOMreplaceVAR(b, &_d, t) != GDK_SUCCEED)
+   if (ATOMreplaceVAR(b, &_d, t) != GDK_SUCCEED) {
+   MT_rwlock_wrunlock(&b->thashlock);
return GDK_FAIL;
+   }
if (b->twidth < SIZEOF_VAR_T &&
(b->twidth <= 2 ? _d - GDK_VAROFFSET : _d) >= 
((size_t) 1 << (8 * b->twidth))) {
/* doesn't fit in current heap, upgrade it */
-   if (GDKupgradevarheap(b, _d, 0, false) != 
GDK_SUCCEED)
+   if (GDKupgradevarheap(b, _d, 0, false) != 
GDK_SUCCEED) {
+   MT_rwlock_wrunlock(&b->thashlock);
return GDK_FAIL;
+   }
}
_ptr = BUNtloc(bi, p);
switch (b->twidth) {
@@ -1498,10 +1508,11 @@ BUNinplacemulti(BAT *b, const oid *posit
mskSetVal(b, p, * (msk *) t);
} else {
assert(BATatoms[b->ttype].atomPut == NULL);
-   if (ATOMfix(b->ttype, t) != GDK_SUCCEED)
+   if (ATOMfix(b->ttype, t) != GDK_SUCCEED ||
+   ATOMunfix(b->ttype, BUNtloc(bi, p)) != GDK_SUCCEED) 
{
+   MT_rwlock_wrunlock(&b->thashlock);
return GDK_FAIL;
-   if (ATOMunfix(b->ttype, BUNtloc(bi, p)) != GDK_SUCCEED)
-   return GDK_FAIL;
+   }
switch (ATOMsize(b->ttype)) {
case 0:  /* void */
break;
@@ -1530,7 +1541,8 @@ BUNinplacemulti(BAT *b, const oid *posit
}
}
 
-   HASHinsert(b, p, t);/* insert new value into hash */
+   HASHinsert_locked(b, p, t); /* insert new value into hash */
+   MT_rwlock_wrunlock(&b->thashlock);
 
tt = b->ttype;
prv = p > 0 ? p - 1 : BUN_NONE;
@@ -1704,40 +1716,63 @@ BUNfnd(BAT *b, const void *v)
if (BATordered(b) || BATordered_rev(b))
return SORTfnd(b, v);
}
-   bi = bat_iterator(b);
-   switch (ATOMbasetype(b->ttype)) {
-   case TYPE_bte:
-   HASHfnd_bte(r, bi, v);
-   break;
-   case TYPE_sht:
-   HASHfnd_sht(r, bi, v);
-   break;
-   case TYPE_int:
-   HASHfnd_int(r, bi, v);
-   break;
-   case TYPE_flt:
-   HASHfnd_f

MonetDB: iso - Merged with Jul2021

2021-06-17 Thread Pedro Ferreira
Changeset: 0c5128a20442 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0c5128a20442
Modified Files:
sql/server/sql_parser.y
sql/storage/bat/bat_storage.c
sql/storage/objectset.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 1508 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -5752,7 +5752,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "timestamp","pattern batcalc.timestamp(X_0:bat[:timestamp], 
X_1:bat[:oid], X_2:int):bat[:timestamp] ",  "timestamp_2time_timestamp;",   
""  ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:str], 
X_1:bat[:oid]):bat[:uuid] ",   "UUIDstr2uuid_bulk;",   ""  ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:uuid], 
X_1:bat[:oid]):bat[:uuid] ",  "UUIDuuid2uuid_bulk;",  ""  ]
-[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:int, 
X_2:int):bat[:wkb] ",  "geom_2_geom_bat;", ""  ]
+[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",   "geom_2_geom_bat;", ""  ]
 [ "batcalc",   "xml",  "command batcalc.xml(X_0:bat[:str]):bat[:xml] ",
"BATXMLstr2xml;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], 
X_1:bat[:bit]):bat[:bit] ", "CMDbatXOR;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], X_1:bat[:bit], 
X_2:bat[:oid], X_3:bat[:oid]):bat[:bit] ",   "CMDbatXOR;",   ""  ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -8276,7 +8276,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "timestamp","pattern batcalc.timestamp(X_0:bat[:timestamp], 
X_1:bat[:oid], X_2:int):bat[:timestamp] ",  "timestamp_2time_timestamp;",   
""  ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:str], 
X_1:bat[:oid]):bat[:uuid] ",   "UUIDstr2uuid_bulk;",   ""  ]
 [ "batcalc",   "uuid", "command batcalc.uuid(X_0:bat[:uuid], 
X_1:bat[:oid]):bat[:uuid] ",  "UUIDuuid2uuid_bulk;",  ""  ]
-[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:int, 
X_2:int):bat[:wkb] ",  "geom_2_geom_bat;", ""  ]
+[ "batcalc",   "wkb",  "command batcalc.wkb(X_0:bat[:wkb], X_1:bat[:oid], 
X_2:int, X_3:int):bat[:wkb] ",   "geom_2_geom_bat;", ""  ]
 [ "batcalc",   "xml",  "command batcalc.xml(X_0:bat[:str]):bat[:xml] ",
"BATXMLstr2xml;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], 
X_1:bat[:bit]):bat[:bit] ", "CMDbatXOR;",   ""  ]
 [ "batcalc",   "xor",  "pattern batcalc.xor(X_0:bat[:bit], X_1:bat[:bit], 
X_2:bat[:oid], X_3:bat[:oid]):bat[:bit] ",   "CMDbatXOR;",   ""  ]
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -328,7 +328,6 @@ VIEWreset(BAT *b)
.parentid = b->batCacheid,
.farmid = BBPselectfarm(b->batRole, b->ttype, offheap),
};
-   ATOMIC_INIT(&tail->refs, 1);
settailname(tail, nme, b->ttype, b->twidth);
if (b->ttype && HEAPalloc(tail, cnt, Tsize(b), Tsize(b)) != 
GDK_SUCCEED) {
GDKfree(tail);
@@ -348,7 +347,6 @@ VIEWreset(BAT *b)
.farmid = BBPselectfarm(b->batRole, b->ttype, varheap),
.parentid = b->batCacheid,
};
-   ATOMIC_INIT(&th->refs, 1);
strconcat_len(th->filename, sizeof(th->filename),
  nme, ".theap", NULL);
if (ATOMheap(b->ttype, th, cnt) != GDK_SUCCEED) {
@@ -358,7 +356,9 @@ VIEWreset(BAT *b)
BBPunfix(v->batCacheid);
return GDK_FAIL;
}
+   ATOMIC_INIT(&th->refs, 1);
}
+   ATOMIC_INIT(&tail->refs, 1);
 
BAT bak = *b;   /* backup copy */
 
@@ -382,11 +382,9 @@ VIEWreset(BAT *b)
if (BATappend2(b, v, NULL, false, false) != GDK_SUCCEED) {
/* clean up the mess */
if (th) {
-   HEAPfree(th, true);
-   GDKfree(th);
+   HEAPdecref(th, true);
}
-   HEAPfree(tail, true);
-   GDKfree(tail);
+   HEAPdecref(tail, true);
*b = bak;
BBPunfix(v->batCacheid);
return GDK_FAIL;
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -72,11 +72,13 @@ GDKrebuild_segment_tree(oid ncount, oid 
do {\
TPE 

MonetDB: iso - Merged with Jul2021

2021-06-15 Thread Pedro Ferreira
Changeset: 29bba680f7a3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/29bba680f7a3
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (246 lines):

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
@@ -6119,12 +6119,10 @@ rel_groupby_distinct(visitor *v, sql_rel
list_append(exps, darg);
darg = exp_ref(v->sql, darg);
arg->h->data = darg;
-   if (!exp_match_list(ngbe, gbe)) { /* if the grouping columns 
match don't create an extra grouping */
-   l = rel->l = rel_groupby(v->sql, rel->l, gbe);
-   l->exps = exps;
-   set_processed(l);
-   rel->r = ngbe;
-   }
+   l = rel->l = rel_groupby(v->sql, rel->l, gbe);
+   l->exps = exps;
+   set_processed(l);
+   rel->r = ngbe;
rel->exps = nexps;
set_nodistinct(distinct);
append(nexps, distinct);
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -818,11 +818,15 @@ rel_create_func(sql_query *query, dlist 
int instantiate = (sql->emode == m_instantiate);
int deps = (sql->emode == m_deps);
int create = (!instantiate && !deps);
-   bit vararg = FALSE;
+   bit vararg = FALSE, union_err = 0;
char *F = NULL, *fn = NULL, is_func;
 
-   if (res && res->token == SQL_TABLE)
-   type = F_UNION;
+   if (res && res->token == SQL_TABLE) {
+   if (type == F_FUNC)
+   type = F_UNION;
+   else
+   union_err = 1;
+   }
 
FUNC_TYPE_STR(type, F, fn)
 
@@ -832,7 +836,9 @@ rel_create_func(sql_query *query, dlist 
if (create && store_readonly(sql->session->tr->store))
return sql_error(sql, 06, SQLSTATE(42000) "Schema statements 
cannot be executed on a readonly database.");
 
-   if (res && type == F_PROC)
+   if (union_err)
+   return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %ss 
cannot return tables", F, fn);
+   else if (res && type == F_PROC)
return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: 
procedures cannot have return parameters", F);
else if (res && (type == F_FILT || type == F_LOADER))
return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %s 
functions don't have to specify a return type", F, fn);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -595,7 +595,9 @@ count_col(sql_trans *tr, sql_column *c, 
return d->segs->t?d->segs->t->end:0;
if (access == 10) {
size_t cnt = segs_end(d->segs, tr, c->t);
+   lock_table(tr->store, c->t->base.id);
cnt -= count_deletes_in_range(d->segs->h, tr, 0, cnt);
+   unlock_table(tr->store, c->t->base.id);
return cnt;
}
return segs_end(d->segs, tr, c->t);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3458,22 +3458,31 @@ sql_trans_commit(sql_trans *tr)
 {
int ok = LOG_OK;
sqlstore *store = tr->store;
-
-   MT_lock_set(&store->commit);
-   store_lock(store);
-   ulng oldest = store_oldest(store);
-
-   if (tr->predicates && (ok = sql_trans_valid(tr)) != LOG_OK) {
-   sql_trans_rollback(tr, 1);
+   bool locked = false;
+
+   if (!list_empty(tr->predicates)) {
+   MT_lock_set(&store->commit);
+   store_lock(store);
+   locked = true;
+
+   if ((ok = sql_trans_valid(tr)) != LOG_OK) {
+   sql_trans_rollback(tr, 1);
+   store_unlock(store);
+   MT_lock_unset(&store->commit);
+   return ok;
+   }
+   }
+
+   if (!list_empty(tr->changes)) {
+   if (!locked) {
+   MT_lock_set(&store->commit);
+   store_lock(store);
+   locked = true;
+   }
+   ulng oldest = store_oldest(store);
+   store_pending_changes(store, oldest);
+   oldest = store_oldest_pending(store);
store_unlock(store);
-   MT_lock_unset(&store->commit);
-   return ok;
-   }
-
-   store_pending_changes(store, oldest);
-   oldest = store_oldest_pending(store);
-   store_unlock(store);
-   if (tr->changes) {
ulng commit_ts = 0;
int min_changes = GDKdebug & FORCEMITOMASK ? 5 : 10;
int flush = (

MonetDB: iso - Merged with Jul2021

2021-06-14 Thread Pedro Ferreira
Changeset: 464415388beb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/464415388beb
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 3782 to 300 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -394,15 +394,15 @@ dump_foreign_keys(Mapi mid, const char *
goto bailout;
}
snprintf(query, maxquerylen,
-"SELECT ps.name, " /* 0 */
+"SELECT ps.name, " /* 0 */
"pkt.name, "/* 1 */
-   "pkkc.name, "   /* 2 */
-   "fkkc.name, "   /* 3 */
-   "fkkc.nr, " /* 4 */
-   "fkk.name, "/* 5 */
-   "fkk.\"action\", "  /* 6 */
-   "fs.name, " /* 7 */
-   "fkt.name " /* 8 */
+   "pkkc.name, "   /* 2 */
+   "fkkc.name, "   /* 3 */
+   "fkkc.nr, " /* 4 */
+   "fkk.name, "/* 5 */
+   "fkk.\"action\", "  /* 6 */
+   "fs.name, " /* 7 */
+   "fkt.name " /* 8 */
 "FROM sys._tables fkt, "
  "sys.objects fkkc, "
  "sys.keys fkk, "
@@ -430,15 +430,15 @@ dump_foreign_keys(Mapi mid, const char *
if (query == NULL)
goto bailout;
snprintf(query, maxquerylen,
-"SELECT ps.name, " /* 0 */
+"SELECT ps.name, " /* 0 */
"pkt.name, "/* 1 */
-   "pkkc.name, "   /* 2 */
-   "fkkc.name, "   /* 3 */
-   "fkkc.nr, " /* 4 */
-   "fkk.name, "/* 5 */
-   "fkk.\"action\", "  /* 6 */
-   "0, "   /* 7 */
-   "fkt.name " /* 8 */
+   "pkkc.name, "   /* 2 */
+   "fkkc.name, "   /* 3 */
+   "fkkc.nr, " /* 4 */
+   "fkk.name, "/* 5 */
+   "fkk.\"action\", "  /* 6 */
+   "0, "   /* 7 */
+   "fkt.name " /* 8 */
 "FROM sys._tables fkt, "
  "sys.objects fkkc, "
  "sys.keys fkk, "
@@ -457,14 +457,14 @@ dump_foreign_keys(Mapi mid, const char *
 "ORDER BY fkk.name, fkkc.nr", tid);
} else {
query = "SELECT ps.name, "  /* 0 */
-  "pkt.name, " /* 1 */
+  "pkt.name, " /* 1 */
   "pkkc.name, "/* 2 */
   "fkkc.name, "/* 3 */
-  "fkkc.nr, "  /* 4 */
-  "fkk.name, " /* 5 */
+  "fkkc.nr, "  /* 4 */
+  "fkk.name, " /* 5 */
   "fkk.\"action\", "   /* 6 */
-  "fs.name, "  /* 7 */
-  "fkt.name "  /* 8 */
+  "fs.name, "  /* 7 */
+  "fkt.name "  /* 8 */
"FROM sys._tables fkt, "
 "sys.objects fkkc, "
 "sys.keys fkk, "
@@ -494,40 +494,56 @@ dump_foreign_keys(Mapi mid, const char *
 
cnt = mapi_fetch_row(hdl);
while (cnt != 0) {
-   char *nc_psname = mapi_fetch_field(hdl, 0), *c_psname = 
nc_psname ? strdup(nc_psname) : NULL;
-   char *nc_ptname = mapi_fetch_field(hdl, 1), *c_ptname = 
nc_ptname ? strdup(nc_ptname) : NULL;
-   char *nc_pcolumn = map

MonetDB: iso - Merged with Jul2021

2021-06-11 Thread Pedro Ferreira
Changeset: 849eaf61ce90 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/849eaf61ce90
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 2965 to 300 lines):

diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -89,14 +89,14 @@ ntile##IMP##TPE: \
 #define ANALYTICAL_NTILE_SINGLE_IMP(TPE, LNG_HGE, UPCAST) \
do {\
TPE ntl = *(TPE*) ntile; \
-   if (!is_##TPE##_nil(ntl) && ntl < 0) goto invalidntile; \
+   if (!is_##TPE##_nil(ntl) && ntl <= 0) goto invalidntile; \
ANALYTICAL_NTILE(SINGLE, TPE, ntl, LNG_HGE, UPCAST, ;); \
} while (0)
 
 #define ANALYTICAL_NTILE_MULTI_IMP(TPE, LNG_HGE, UPCAST) \
do {\
TPE *restrict nn = (TPE*)Tloc(n, 0);\
-   ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val < 
0) goto invalidntile;); \
+   ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val <= 
0) goto invalidntile;); \
} while (0)
 
 gdk_return
@@ -1838,7 +1838,7 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o,
 bailout:
GDKerror("42000!error while calculating floating-point sum\n");
res = GDK_FAIL;
-   goto cleanup; 
+   goto cleanup;
 calc_overflow:
GDKerror("22003!overflow in calculation.\n");
res = GDK_FAIL;
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -914,9 +914,10 @@ mskWrite(const msk *a, stream *s, size_t
 }
 
 static void *
-mskRead(msk *a, size_t *dstlen, stream *s, size_t cnt)
+mskRead(msk *A, size_t *dstlen, stream *s, size_t cnt)
 {
int8_t v;
+   msk *a = A;
if (cnt != 1)
return NULL;
if (a == NULL || *dstlen == 0) {
@@ -924,8 +925,11 @@ mskRead(msk *a, size_t *dstlen, stream *
return NULL;
*dstlen = 1;
}
-   if (mnstr_readBte(s, &v) != 1)
+   if (mnstr_readBte(s, &v) != 1) {
+   if (a != A)
+   GDKfree(a);
return NULL;
+   }
*a = v != 0;
return a;
 }
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -999,7 +999,9 @@ movestrbats(void)
continue;
char *oldpath = GDKfilepath(0, BATDIR, 
BBP_physical(b->batCacheid), "tail");
char *newpath = GDKfilepath(0, BATDIR, b->theap->filename, 
NULL);
-   int ret = MT_rename(oldpath, newpath);
+   int ret = -1;
+   if (oldpath != NULL && newpath != NULL)
+   ret = MT_rename(oldpath, newpath);
GDKfree(oldpath);
GDKfree(newpath);
if (ret < 0)
@@ -3134,8 +3136,11 @@ BBPsync(int cnt, bat *restrict subcommit
MT_lock_set(&GDKswapLock(i));
}
BAT *b = dirty_bat(&i, subcommit != NULL);
-   if (i <= 0)
+   if (i <= 0) {
+   if (lock)
+   MT_lock_unset(&GDKswapLock(subcommit ? 
subcommit[idx] : idx));
break;
+   }
if (BBP_status(i) & BBPEXISTING) {
if (b != NULL && BBPbackup(b, subcommit != 
NULL) != GDK_SUCCEED) {
BBP_status_off(i, BBPSYNCING);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -922,7 +922,12 @@ logger_create_types_file(logger *lg, con
 #elif defined(HAVE_FSYNC)
 && fsync(fileno(fp)) < 0
 #endif
-   ) || fclose(fp) < 0) {
+   )) {
+   MT_remove(filename);
+   GDKerror("flushing log file %s failed", filename);
+   return GDK_FAIL;
+   }
+   if (fclose(fp) < 0) {
MT_remove(filename);
GDKerror("closing log file %s failed", filename);
return GDK_FAIL;
@@ -1242,6 +1247,7 @@ check_version(logger *lg, FILE *fp, cons
assert(!lg->inmemory);
if (fscanf(fp, "%6d", &version) != 1) {
GDKerror("Could not read the version number from the file 
'%s/log'.\n", lg->dir);
+   fclose(fp);
return GDK_FAIL;
}
if (version < 52300) {  /* first CATALOG_VERSION for "new" log format */
@@ -1250,8 +1256,10 @@ check_version(logger *lg, FILE *fp, cons
lg->dcatalog = logbat_new(TYPE_oid, BATSIZE, PERSISTENT);
if (lg->catalog_bid == NULL || lg->catalog_id == NULL || 
lg->dcatalog == NULL) {
GDKerror("cannot create catalog bats");
+   fclose(fp);
return GDK_FAIL;
}
+   /* old_logger_load always closes fp 

MonetDB: iso - Merged with Jul2021

2021-06-10 Thread Pedro Ferreira
Changeset: 0e2a071d00b5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0e2a071d00b5
Branch: iso
Log Message:

Merged with Jul2021


diffs (12 lines):

diff --git a/monetdb5/mal/mal_runtime.c b/monetdb5/mal/mal_runtime.c
--- a/monetdb5/mal/mal_runtime.c
+++ b/monetdb5/mal/mal_runtime.c
@@ -243,7 +243,7 @@ runtimeProfileInit(Client cntxt, MalBlkP
if (++i >= qsize)
i = 0;
}
-   assert(0);
+// assert(0);
}
i=qtail;
while (i != qhead){
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: iso - Merged with Jul2021

2021-06-10 Thread Pedro Ferreira
Changeset: d33e5da4f07c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d33e5da4f07c
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 473 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
@@ -331,6 +331,7 @@ gdk_return GDKtracer_set_adapter(const c
 gdk_return GDKtracer_set_component_level(const char *comp, const char *lvl);
 gdk_return GDKtracer_set_flush_level(const char *lvl);
 gdk_return GDKtracer_set_layer_level(const char *layer, const char *lvl);
+gdk_return GDKtracer_set_tracefile(const char *tracefile);
 gdk_return GDKtracer_stop(void);
 size_t GDKuniqueid(size_t offset);
 gdk_return GDKupgradevarheap(BAT *b, var_t v, BUN cap, bool copyall) 
__attribute__((__warn_unused_result__));
diff --git a/ctest/monetdb5/mal/test_malEmbeddedBoot.c 
b/ctest/monetdb5/mal/test_malEmbeddedBoot.c
--- a/ctest/monetdb5/mal/test_malEmbeddedBoot.c
+++ b/ctest/monetdb5/mal/test_malEmbeddedBoot.c
@@ -17,8 +17,8 @@ main(void)
 gdk_return gdk_res;
 
 gdk_res = GDKinit(NULL, 0, true);
-if (gdk_res == GDK_FAIL) {
-   msg = createException(MAL, "embedded.monetdb_startup", "GDKinit() 
failed");
+if (gdk_res != GDK_SUCCEED) {
+   msg = createException(MAL, "embedded.monetdb_startup", 
"GDKinit() failed");
 return 1;
 }
 if ((msg = malEmbeddedBoot(0, 0, 0, 0, 0)) != MAL_SUCCEED)
diff --git a/ctest/monetdb5/mal/test_malInclude.c 
b/ctest/monetdb5/mal/test_malInclude.c
--- a/ctest/monetdb5/mal/test_malInclude.c
+++ b/ctest/monetdb5/mal/test_malInclude.c
@@ -18,8 +18,8 @@ main(void)
 gdk_return gdk_res;
 
 gdk_res = GDKinit(NULL, 0, true);
-if (gdk_res == GDK_FAIL) {
-   createException(MAL, "embedded.monetdb_startup", "GDKinit() failed");
+if (gdk_res != GDK_SUCCEED) {
+   createException(MAL, "embedded.monetdb_startup", "GDKinit() 
failed");
return 1;
 }
 char *modules[2];
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -908,7 +908,7 @@ logger_create_types_file(logger *lg, con
return GDK_FAIL;
}
 
-   if (logger_write_new_types(lg, fp) == GDK_FAIL) {
+   if (logger_write_new_types(lg, fp) != GDK_SUCCEED) {
fclose(fp);
MT_remove(filename);
GDKerror("writing log file %s failed", filename);
@@ -1866,7 +1866,7 @@ logger_load(int debug, const char *fn, c
if (BBPrename(lg->catalog_lid->batCacheid, bak) < 0) {
goto error;
}
-   if (bm_get_counts(lg) == GDK_FAIL)
+   if (bm_get_counts(lg) != GDK_SUCCEED)
goto error;
 
strconcat_len(bak, sizeof(bak), fn, "_seqs_id", NULL);
@@ -2158,7 +2158,7 @@ logger_flush(logger *lg, ulng ts)
}
 
bool filemissing = false;
-   if (logger_open_input(lg, filename, &filemissing) == 
GDK_FAIL) {
+   if (logger_open_input(lg, filename, &filemissing) != 
GDK_SUCCEED) {
GDKfree(filename);
return GDK_FAIL;
}
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -162,7 +162,7 @@ gdk_return GDKssort_rev(void *restrict h
 gdk_return GDKssort(void *restrict h, void *restrict t, const void *restrict 
base, size_t n, int hs, int ts, int tpe)
__attribute__((__warn_unused_result__))
__attribute__((__visibility__("hidden")));
-void GDKtracer_init(const char *dbname, const char *dbtrace)
+gdk_return GDKtracer_init(const char *dbname, const char *dbtrace)
__attribute__((__visibility__("hidden")));
 gdk_return GDKunlink(int farmid, const char *dir, const char *nme, const char 
*extension)
__attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -428,15 +428,24 @@ GDKtracer_reset_adapter(void)
 
 static bool add_ts;/* add timestamp to error message to stderr */
 
-void
+gdk_return
 GDKtracer_init(const char *dbpath, const char *dbtrace)
 {
+   MT_lock_set(&GDKtracer_lock);
 #ifdef _MSC_VER
add_ts = GetFileType(GetStdHandle(STD_ERROR_HANDLE)) != FILE_TYPE_PIPE;
 #else
add_ts = isatty(2) || lseek(2, 0, SEEK_CUR) != (off_t) -1 || errno != 
ESPIPE;
 #endif
-   (void) GDKtracer_init_trace_file(dbpath, dbtrace);
+   gdk_return rc = GDKtracer_init_trace_file(dbpath, dbtrace);
+   MT_lock_unset(&GDKtracer_lock);
+   return rc;
+}
+
+gdk_return
+GDKtracer_set_tracefile(const char *tracefile)
+{
+   return GDKtracer_init(NULL, tracefile);
 }
 
 void
diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h
--- a/gdk/gdk_tracer.h
+++ b/gdk/gdk

MonetDB: iso - Merged with Jul2021

2021-06-09 Thread Pedro Ferreira
Changeset: 805afe049210 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/805afe049210
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 499 to 300 lines):

diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -1267,6 +1267,7 @@ HASHdelete_locked(BAT *b, BUN p, const v
seen = atomcmp(v, BUNtail(bi, hb)) == 0;
BUN hb2 = HASHgetlink(h, hb);
assert(hb2 != h->nil);
+   assert(hb2 < hb);
if (hb2 == p) {
for (hb2 = HASHgetlink(h, hb2);
 !seen && hb2 != h->nil;
diff --git a/gdk/gdk_hash.h b/gdk/gdk_hash.h
--- a/gdk/gdk_hash.h
+++ b/gdk/gdk_hash.h
@@ -86,14 +86,17 @@ HASHputlink(Hash *h, BUN i, BUN v)
switch (h->width) {
 #ifdef BUN2
case BUN2:
+   assert(v == BUN_NONE || v == BUN2_NONE || v < i);
((BUN2type *) h->Link)[i] = (BUN2type) v;
break;
 #endif
default:/* BUN4 */
+   assert(v == BUN_NONE || v == BUN4_NONE || v < i);
((BUN4type *) h->Link)[i] = (BUN4type) v;
break;
 #ifdef BUN8
case BUN8:
+   assert(v == BUN_NONE || v == BUN8_NONE || v < i);
((BUN8type *) h->Link)[i] = (BUN8type) v;
break;
 #endif
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -566,7 +566,7 @@ BAT *
 BATproject2(BAT *restrict l, BAT *restrict r1, BAT *restrict r2)
 {
BAT *bn = NULL;
-   BAT *or1 = r1, *or2 = r2;
+   BAT *or1 = r1, *or2 = r2, *ol = l;
oid lo, hi;
gdk_return res;
int tpe = ATOMtype(r1->ttype);
@@ -602,11 +602,15 @@ BATproject2(BAT *restrict l, BAT *restri
goto doreturn;
}
}
-   if (complex_cand(l) || l->ttype == TYPE_msk) {
+   if (complex_cand(l)) {
/* l is candidate list with exceptions or is a bitmask */
assert(l->ttype == TYPE_msk || !is_oid_nil(l->tseqbase));
lcount = canditer_init(&ci, NULL, l);
lci = &ci;
+   } else if (l->ttype == TYPE_msk) {
+   l = BATunmask(l);
+   if (l == NULL)
+   goto doreturn;
}
if (lcount == 0 ||
(l->ttype == TYPE_void && is_oid_nil(l->tseqbase)) ||
@@ -766,6 +770,8 @@ BATproject2(BAT *restrict l, BAT *restri
  ALGOOPTBATPAR(bn),
  bn && bn->ttype == TYPE_str && bn->tvheap == r1->tvheap ? " 
sharing string heap" : "",
  msg, GDKusec() - t0);
+   if (l != ol)
+   BBPreclaim(l);
if (r1 != or1)
BBPreclaim(r1);
if (r2 != or2)
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1128,9 +1128,7 @@ rel_select_push_exp_down(mvc *sql, sql_r
return rel;
 }
 
-/* ls is the left expression of the select, rs is a simple atom, e is the
-   select expression.
- */
+/* ls is the left expression of the select, e is the select expression.  */
 sql_rel *
 rel_push_select(mvc *sql, sql_rel *rel, sql_exp *ls, sql_exp *e, int f)
 {
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1461,7 +1461,7 @@ rel_convert_types(mvc *sql, sql_rel *ll,
 }
 
 static sql_rel *
-push_select_exp(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, sql_exp *L, 
int f) /* 'e' is an expression where the right is a constant(s)! */
+push_select_exp(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, int f)
 {
if (is_outerjoin(rel->op)) {
if ((is_left(rel->op) || is_full(rel->op)) && 
rel_find_exp(rel->l, ls)) {
@@ -1472,15 +1472,15 @@ push_select_exp(mvc *sql, sql_rel *rel, 
return rel;
}
if (is_left(rel->op) && rel_find_exp(rel->r, ls)) {
-   rel->r = rel_push_select(sql, rel->r, L, e, f);
+   rel->r = rel_push_select(sql, rel->r, ls, e, f);
return rel;
} else if (is_right(rel->op) && rel_find_exp(rel->l, ls)) {
-   rel->l = rel_push_select(sql, rel->l, L, e, f);
+   rel->l = rel_push_select(sql, rel->l, ls, e, f);
return rel;
}
}
/* push select into the given relation */
-   return rel_push_select(sql, rel, L, e, f);
+   return rel_push_select(sql, rel, ls, e, f);
 }
 
 static sql_rel *
@@ -1502,7 +1502,7 @@ static sql_rel *
 rel_filter(mvc *sql, sql_rel *rel, list *l, list *r, char *sname, char 
*filter_op, int anti, int ff)
 {
node *n;
-   sql_exp *L = l->h->data, *R = r->h->data, *e = NULL;

MonetDB: iso - merged with jul2021

2021-06-09 Thread Niels Nes
Changeset: b622ab7302b9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b622ab7302b9
Modified Files:
sql/storage/bat/bat_storage.c
Branch: iso
Log Message:

merged with jul2021


diffs (82 lines):

diff --git a/monetdb5/modules/mal/mkey.c b/monetdb5/modules/mal/mkey.c
--- a/monetdb5/modules/mal/mkey.c
+++ b/monetdb5/modules/mal/mkey.c
@@ -324,7 +324,7 @@ MKEYrotate_xor_hash(Client cntxt, MalBlk
 static str
 MKEYbulk_rotate_xor_hash(bat *res, const bat *hid, const int *nbits, const bat 
*bid)
 {
-   BAT *hb, *b, *bn;
+   BAT *hb, *b, *ob = NULL, *bn;
int lbit = *nbits;
int rbit = (int) sizeof(lng) * 8 - lbit;
ulng *restrict r;
@@ -345,12 +345,23 @@ MKEYbulk_rotate_xor_hash(bat *res, const
throw(MAL, "mkey.rotate_xor_hash",
  OPERATION_FAILED ": input bats are not aligned");
}
+   ob = b;
+   if (b && (b->ttype == TYPE_msk || mask_cand(b))) {
+   b = BATunmask(b);
+   if (!b) {
+   BBPunfix(hb->batCacheid);
+   BBPunfix(ob->batCacheid);
+   throw(MAL, "mkey.rotate_xor_hash", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+   }
+   }
 
n = BATcount(b);
 
bn = COLnew(b->hseqbase, TYPE_lng, n, TRANSIENT);
if (bn == NULL) {
BBPunfix(hb->batCacheid);
+   if (b != ob)
+   BBPunfix(ob->batCacheid);
BBPunfix(b->batCacheid);
throw(MAL, "mkey.rotate_xor_hash", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
}
@@ -429,6 +440,8 @@ MKEYbulk_rotate_xor_hash(bat *res, const
bn->tnil = false;
 
BBPkeepref(*res = bn->batCacheid);
+   if (b != ob)
+   BBPunfix(ob->batCacheid);
BBPunfix(b->batCacheid);
BBPunfix(hb->batCacheid);
return MAL_SUCCEED;
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -926,21 +926,21 @@ cs_update_bat( sql_trans *tr, column_sto
}
/* When we go to smaller grained update structures we should check for 
concurrent updates on this column ! */
/* currently only one update delta is possible */
-   if (!otids->tsorted || complex_cand(otids) /* make sure we have simple 
dense or oids */) {
-   BAT *sorted, *order;
-   if (BATsort(&sorted, &order, NULL, otids, NULL, NULL, false, 
false, false) != GDK_SUCCEED) {
+   if (!is_new && !cs->cleared) {
+   if (!otids->tsorted || complex_cand(otids) /* make sure we have 
simple dense or oids */) {
+   BAT *sorted, *order;
+   if (BATsort(&sorted, &order, NULL, otids, NULL, NULL, 
false, false, false) != GDK_SUCCEED) {
+   if (otids != tids)
+   bat_destroy(otids);
+   return LOG_ERR;
+   }
if (otids != tids)
bat_destroy(otids);
-   return LOG_ERR;
+   otids = sorted;
+   oupdates = BATproject(order, oupdates);
+   bat_destroy(order);
}
-   if (otids != tids)
-   bat_destroy(otids);
-   otids = sorted;
-   oupdates = BATproject(order, oupdates);
-   bat_destroy(order);
-   }
-   assert(otids->tsorted);
-   if (!is_new && !cs->cleared) {
+   assert(otids->tsorted);
BAT *ui = NULL, *uv = NULL;
 
/* handle updates on just inserted bits */
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: iso - merged with jul2021

2021-06-08 Thread Niels Nes
Changeset: 236582aa85c3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/236582aa85c3
Modified Files:
sql/storage/bat/bat_storage.c
Branch: iso
Log Message:

merged with jul2021


diffs (94 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2445,10 +2445,11 @@ BATassertProps(BAT *b)
/* candidate list with exceptions */
assert(b->batRole == TRANSIENT);
assert(b->tvheap->free <= b->tvheap->size);
+   assert(b->tvheap->free >= sizeof(ccand_t));
assert((negoid_cand(b) && ccand_free(b) % 
SIZEOF_OID == 0) || mask_cand(b));
if (negoid_cand(b) && ccand_free(b) > 0) {
-   const oid *oids = (const oid *) 
b->tvheap->base;
-   q = b->tvheap->free / SIZEOF_OID;
+   const oid *oids = (const oid *) 
ccand_first(b);
+   q = ccand_free(b) / SIZEOF_OID;
assert(oids != NULL);
assert(b->tseqbase + BATcount(b) + q <= 
GDK_oid_max);
/* exceptions within range */
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -926,7 +926,7 @@ cs_update_bat( sql_trans *tr, column_sto
}
/* When we go to smaller grained update structures we should check for 
concurrent updates on this column ! */
/* currently only one update delta is possible */
-   if (!otids->tsorted) {
+   if (!otids->tsorted || complex_cand(otids) /* make sure we have simple 
dense or oids */) {
BAT *sorted, *order;
if (BATsort(&sorted, &order, NULL, otids, NULL, NULL, false, 
false, false) != GDK_SUCCEED) {
if (otids != tids)
diff --git a/sql/test/SQLancer/Tests/sqlancer15.test 
b/sql/test/SQLancer/Tests/sqlancer15.test
--- a/sql/test/SQLancer/Tests/sqlancer15.test
+++ b/sql/test/SQLancer/Tests/sqlancer15.test
@@ -802,9 +802,60 @@ INSERT INTO t1(c0, c1) VALUES(-1, INTERV
 statement ok rowcount 3
 INSERT INTO t1(c4, c1, c0) VALUES(0.34700167, INTERVAL '5' MONTH, 0), (9, 
INTERVAL '-4' MONTH, NULL), (-2, INTERVAL '-2' MONTH, NULL)
 
-statement ok rowcount 16
+statement ok rowcount 17
 UPDATE t1 SET c0 = 0, c1 = INTERVAL '-8' MONTH, c4 = least(t1.c4, 0)
 
 statement ok
 DROP TABLE t1
 
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE t1(c0 tinyint, c1 BLOB)
+
+statement ok
+CREATE TABLE t2(c0 tinyint, c1 BLOB, c3 DOUBLE)
+
+statement ok rowcount 1
+INSERT INTO t2(c1, c3, c0) VALUES(BLOB 'bC4AF0', 0.7, 4)
+
+statement ok rowcount 1
+DELETE FROM t2 WHERE TRUE
+
+statement ok rowcount 2
+INSERT INTO t2(c0, c1, c3) VALUES(-0.2, BLOB '', 0.5), (3, BLOB '', 0.7)
+
+statement ok rowcount 6
+INSERT INTO t2(c0) VALUES(0), (6), (7), (6), (2), (5)
+
+statement ok rowcount 1
+INSERT INTO t2(c3) VALUES(0.3)
+
+statement ok rowcount 2
+INSERT INTO t2(c1, c3) VALUES(BLOB 'c51b70', 1), (BLOB 'a7BE7D64', 0.6)
+
+statement ok rowcount 1
+INSERT INTO t2(c1, c0) VALUES(BLOB '20', 5)
+
+statement ok rowcount 1
+INSERT INTO t2(c3, c0, c1) VALUES(-6.1, 9, BLOB 'A4')
+
+statement ok rowcount 2
+INSERT INTO t2(c3) VALUES(0.3), (0.7)
+
+statement ok rowcount 1
+INSERT INTO t2(c0, c3, c1) VALUES(0, 0.4, BLOB '')
+
+statement ok rowcount 1
+INSERT INTO t1(c0) VALUES(2)
+
+statement ok rowcount 1
+INSERT INTO t2(c1, c0) VALUES(BLOB 'FCb405', NULL)
+
+statement ok rowcount 17
+UPDATE t2 SET c1 = BLOB 'AA' FROM t1 WHERE 0.11 NOT BETWEEN t1.c0 AND 0.47
+
+statement ok
+ROLLBACK
+
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: iso - merged with Jul2021

2021-06-08 Thread Niels Nes
Changeset: 1845207c2511 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1845207c2511
Modified Files:
sql/storage/store.c
Branch: iso
Log Message:

merged with Jul2021


diffs (truncated from 892 to 300 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -71,8 +71,18 @@ unlock_table(sqlstore *store, sqlid id)
MT_lock_unset(&store->table_locks[id&(NR_TABLE_LOCKS-1)]);
 }
 
-#define lock_column(store, id) lock_table(store, id)
-#define unlock_column(store, id) unlock_table(store, id)
+static void
+lock_column(sqlstore *store, sqlid id)
+{
+   MT_lock_set(&store->column_locks[id&(NR_TABLE_LOCKS-1)]);
+}
+
+static void
+unlock_column(sqlstore *store, sqlid id)
+{
+   MT_lock_unset(&store->column_locks[id&(NR_TABLE_LOCKS-1)]);
+}
+
 
 static int
 tc_gc_seg( sql_store Store, sql_change *change, ulng oldest)
@@ -218,7 +228,7 @@ rollback_segments(segments *segs, sql_tr
seg->next = cur->next;
if (cur == segs->t)
segs->t = seg;
-   mark4destroy(cur, change, oldest/* TODO somehow 
get current timestamp*/);
+   mark4destroy(cur, change, 
store_get_timestamp(tr->store));
cur = seg;
} else {
seg = cur; /* begin of new merge */
@@ -618,6 +628,7 @@ cs_bind_ubat( column_storage *cs, int ac
BAT *b;
 
assert(access == RD_UPD_ID || access == RD_UPD_VAL);
+   /* returns the updates for cs */
if (cs->uibid && cs->uvbid) {
if (access == RD_UPD_ID)
b = temp_descriptor(cs->uibid);
@@ -630,20 +641,145 @@ cs_bind_ubat( column_storage *cs, int ac
 }
 
 static BAT *
-bind_ucol(sql_trans *tr, sql_column *c, int access)
+merge_updates( BAT *ui, BAT **UV, BAT *oi, BAT *ov)
+{
+   int err = 0;
+   BAT *uv = *UV;
+   BUN cnt = BATcount(ui)+BATcount(oi);
+   BAT *ni = bat_new(TYPE_oid, cnt, PERSISTENT);
+   BAT *nv = uv?bat_new(uv->ttype, cnt, PERSISTENT):NULL;
+
+   if (!ni || (uv && !nv)) {
+   bat_destroy(ni);
+   bat_destroy(nv);
+   bat_destroy(ui);
+   bat_destroy(uv);
+   bat_destroy(oi);
+   bat_destroy(ov);
+   return NULL;
+   }
+   BATiter uvi;
+   BATiter ovi;
+
+   if (uv) {
+   uvi = bat_iterator(uv);
+   ovi = bat_iterator(ov);
+   }
+
+   /* handle dense (void) cases together as we need too merge updates 
(which is slower anyway) */
+   BUN uip = 0, uie = BATcount(ui);
+   BUN oip = 0, oie = BATcount(oi);
+
+   oid uiseqb = ui->tseqbase;
+   oid oiseqb = oi->tseqbase;
+   oid *uipt = NULL, *oipt = NULL;
+   if (!BATtdense(ui))
+   uipt = Tloc(ui, 0);
+   if (!BATtdense(oi))
+   oipt = Tloc(oi, 0);
+   while (uip < uie && oip < oie && !err) {
+   oid uiid = (uipt)?uipt[uip]: uiseqb+uip;
+   oid oiid = (oipt)?oipt[oip]: oiseqb+oip;
+
+   if (uiid <= oiid) {
+   if (BUNappend(ni, (ptr) &uiid, true) != GDK_SUCCEED ||
+   (ov && BUNappend(nv, (ptr) BUNtail(uvi, uip), true) 
!= GDK_SUCCEED))
+   err = 1;
+   uip++;
+   if (uiid == oiid)
+   oip++;
+   } else { /* uiid > oiid */
+   if (BUNappend(ni, (ptr) &oiid, true) != GDK_SUCCEED ||
+   (ov && BUNappend(nv, (ptr) BUNtail(ovi, oip), true) 
!= GDK_SUCCEED) )
+   err = 1;
+   oip++;
+   }
+   }
+   while (uip < uie && !err) {
+   oid uiid = (uipt)?uipt[uip]: uiseqb+uip;
+   if (BUNappend(ni, (ptr) &uiid, true) != GDK_SUCCEED ||
+   (ov && BUNappend(nv, (ptr) BUNtail(uvi, uip), true) != 
GDK_SUCCEED))
+   err = 1;
+   uip++;
+   }
+   while (oip < oie && !err) {
+   oid oiid = (oipt)?oipt[oip]: oiseqb+oip;
+   if (BUNappend(ni, (ptr) &oiid, true) != GDK_SUCCEED ||
+   (ov && BUNappend(nv, (ptr) BUNtail(ovi, oip), true) != 
GDK_SUCCEED) )
+   err = 1;
+   oip++;
+   }
+   bat_destroy(ui);
+   bat_destroy(uv);
+   bat_destroy(oi);
+   bat_destroy(ov);
+   if (!err) {
+   if (nv)
+   *UV = nv;
+   return ni;
+   }
+   *UV = NULL;
+   bat_destroy(ni);
+   bat_destroy(nv);
+   return NULL;
+}
+
+static sql_delta *
+older_delta( sql_delta *d, sql_trans *tr)
+{
+   sql_delta *o = d->next;
+
+   whi

MonetDB: iso - Merged with Jul2021

2021-06-07 Thread Pedro Ferreira
Changeset: c2efea211233 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c2efea211233
Modified Files:
sql/backends/monet5/rel_bin.c
sql/include/sql_catalog.h
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 112227 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9207,7 +9207,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""  ]
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ","sql_analyze;", ""  ]
 [ "sql",   "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",  
"SQLany_cmp;",  ""  ]
-[ "sql",   "append",   "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:lng, X_5:any):int ","mvc_append_wrap;", ""  ]
+[ "sql",   "append",   "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:bat[:oid], X_5:any):int ",  "mvc_append_wrap;", ""  ]
 [ "sql",   "argRecord","pattern sql.argRecord():str ", 
"SQLargRecord;",""  ]
 [ "sql",   "argRecord","pattern sql.argRecord(X_0:any...):str ",   
"SQLargRecord;",""  ]
 [ "sql",   "assert",   "pattern sql.assert(X_0:bit, X_1:str):void ",   
"SQLassert;",   ""  ]
@@ -9231,7 +9231,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",   "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int):bat[:any_1] ","mvc_bind_idxbat_wrap;","" 
 ]
 [ "sql",   "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) 
", "mvc_bind_idxbat_wrap;",""  ]
 [ "sql",   "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",  
"mvc_bind_idxbat_wrap;",""  ]
-[ "sql",   "claim","unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):lng ","mvc_claim_wrap;",  ""  ]
+[ "sql",   "claim","unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):bat[:oid] ",  "mvc_claim_wrap;",  ""  ]
 [ "sql",   "clear_table",  "unsafe pattern sql.clear_table(X_0:str, 
X_1:str):lng ","mvc_clear_table_wrap;",""  ]
 [ "sql",   "commit",   "unsafe pattern sql.commit():void ",
"SQLcommit;",   ""  ]
 [ "sql",   "copy_from","unsafe pattern sql.copy_from(X_0:ptr, X_1:str, 
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, 
X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;",   ""  
]
@@ -9243,6 +9243,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",   "corr", "pattern sql.corr(X_0:int, X_1:int, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", ""  ]
 [ "sql",   "corr", "pattern sql.corr(X_0:lng, X_1:lng, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", ""  ]
 [ "sql",   "corr", "pattern sql.corr(X_0:sht, X_1:sht, X_2:bit, X_3:bit, 
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", ""  ]
+[ "sql",   "count","pattern sql.count(X_0:str, X_1:str):lng ", 
"SQLbasecount;",""  ]
 [ "sql",   "count","pattern sql.count(X_0:any_1, X_1:bit, X_2:bit, 
X_3:bit, X_4:int, X_5:oid, X_6:oid):lng ",  "SQLcount;",""  ]
 [ "sql",   "covariance",   "pattern sql.covariance(X_0:bte, X_1:bte, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",   "SQLcovar_samp;",   
""  ]
 [ "sql",   "covariance",   "pattern sql.covariance(X_0:dbl, X_1:dbl, 
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ",   "SQLcovar_samp;",   
""  ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12508,7 +12508,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""  ]
 [ "sql",   "analyze",  "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ","sql_analyze;", ""  ]
 [ "sql",   "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",  
"SQLany_cmp;",  ""  ]
-[ "sql",   "append",   "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:lng, X_5:any):int ","mvc_append_wrap;", ""  ]
+[ "sql",   "append",   "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:bat[:oid], X_5:any):int ",  "mvc_append_wrap;", ""  ]
 [ "

MonetDB: iso - merged with jul2021

2021-06-04 Thread Niels Nes
Changeset: afe5ce9a92eb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/afe5ce9a92eb
Modified Files:
sql/storage/store.c
Branch: iso
Log Message:

merged with jul2021


diffs (71 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1248,7 +1248,6 @@ append_col(sql_trans *tr, sql_column *c,
sql_delta *delta, *odelta = ATOMIC_PTR_GET(&c->data);
int in_transaction = segments_in_transaction(tr, c->t);
 
-   assert((BUN)offset < (BUN_NONE-10));
if ((delta = bind_col_data(tr, c, NULL)) == NULL)
return LOG_ERR;
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3390,18 +3390,18 @@ sql_trans_commit(sql_trans *tr)
 {
int ok = LOG_OK;
sqlstore *store = tr->store;
+
store_lock(store);
-   ulng commit_ts = tr->parent ? tr->parent->tid : store_timestamp(store);
ulng oldest = store_oldest(store);
 
if (tr->predicates && !sql_trans_valid(tr))
return LOG_ERR;
 
-   /* write phase */
-   TRC_DEBUG(SQL_STORE, "Forwarding changes (" ULLFMT ", " ULLFMT ") -> " 
ULLFMT "\n", tr->tid, tr->ts, commit_ts);
store_pending_changes(store, oldest);
oldest = store_oldest_pending(store);
+   store_unlock(store);
if (tr->changes) {
+   ulng commit_ts = 0;
int min_changes = GDKdebug & FORCEMITOMASK ? 5 : 10;
int flush = (tr->logchanges > min_changes && !store->changes);
/* log changes should only be done if there is something to log 
*/
@@ -3417,10 +3417,16 @@ sql_trans_commit(sql_trans *tr)
if (ok == LOG_OK && store->prev_oid != store->obj_id)
ok = store->logger_api.log_sequence(store, 
OBJ_SID, store->obj_id);
store->prev_oid = store->obj_id;
+   store_lock(store);
+   commit_ts = tr->parent ? tr->parent->tid : 
store_timestamp(store);
if (ok == LOG_OK && !flush)
ok = store->logger_api.log_tend(store, 
commit_ts);
+   } else {
+   store_lock(store);
+   commit_ts = tr->parent ? tr->parent->tid : 
store_timestamp(store);
}
tr->logchanges = 0;
+   TRC_DEBUG(SQL_STORE, "Forwarding changes (" ULLFMT ", " ULLFMT 
") -> " ULLFMT "\n", tr->tid, tr->ts, commit_ts);
/* apply committed changes */
if (ATOMIC_GET(&store->nr_active) == 1) {
oldest = commit_ts;
@@ -3454,6 +3460,8 @@ sql_trans_commit(sql_trans *tr)
}
list_destroy(tr->changes);
tr->changes = NULL;
+   tr->ts = commit_ts;
+   store_unlock(store);
}
/* drop local temp tables with commit action CA_DROP, after cleanup */
if (cs_size(&tr->localtmps)) {
@@ -3471,8 +3479,6 @@ sql_trans_commit(sql_trans *tr)
tr->localtmps.dset = NULL;
}
tr->localtmps.nelm = NULL;
-   tr->ts = commit_ts;
-   store_unlock(store);
return (ok==LOG_OK)?SQL_OK:SQL_ERR;
 }
 
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: iso - merged with jul2021

2021-06-04 Thread Niels Nes
Changeset: aadda6695eaf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/aadda6695eaf
Modified Files:
sql/storage/store.c
Branch: iso
Log Message:

merged with jul2021


diffs (224 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -393,10 +393,10 @@ recover_dir(int farmid, bool direxists)
/* just try; don't care about these non-vital files */
if (GDKunlink(farmid, BATDIR, "BBP", "bak") != GDK_SUCCEED)
TRC_WARNING(GDK, "unlink of BBP.bak failed\n");
-   if (GDKmove(farmid, BATDIR, "BBP", "dir", BATDIR, "BBP", "bak") 
!= GDK_SUCCEED)
+   if (GDKmove(farmid, BATDIR, "BBP", "dir", BATDIR, "BBP", "bak", 
false) != GDK_SUCCEED)
TRC_WARNING(GDK, "rename of BBP.dir to BBP.bak 
failed\n");
}
-   return GDKmove(farmid, BAKDIR, "BBP", "dir", BATDIR, "BBP", "dir");
+   return GDKmove(farmid, BAKDIR, "BBP", "dir", BATDIR, "BBP", "dir", 
true);
 }
 
 static gdk_return BBPrecover(int farmid);
@@ -1088,7 +1088,7 @@ BBPinit(void)
GDKfree(backupbbpdirstr);
goto bailout;
}
-   } else if (GDKmove(0, BATDIR, "BBP", "bak", BATDIR, 
"BBP", "dir") == GDK_SUCCEED)
+   } else if (GDKmove(0, BATDIR, "BBP", "bak", BATDIR, 
"BBP", "dir", true) == GDK_SUCCEED)
TRC_DEBUG(IO_, "reverting to dir saved in 
BBP.bak.\n");
 
if ((fp = GDKfilelocate(0, "BBP", "r", "dir")) == NULL) 
{
@@ -2718,7 +2718,7 @@ dirty_bat(bat *i, bool subcommit)
 static gdk_return
 file_move(int farmid, const char *srcdir, const char *dstdir, const char 
*name, const char *ext)
 {
-   if (GDKmove(farmid, srcdir, name, ext, dstdir, name, ext) == 
GDK_SUCCEED) {
+   if (GDKmove(farmid, srcdir, name, ext, dstdir, name, ext, true) == 
GDK_SUCCEED) {
return GDK_SUCCEED;
} else {
char *path;
@@ -2864,7 +2864,7 @@ BBPprepare(bool subcommit)
}
if (ret == GDK_SUCCEED && backup_dir != set) {
/* a valid backup dir *must* at least contain BBP.dir */
-   if ((ret = GDKmove(0, backup_dir ? BAKDIR : BATDIR, "BBP", 
"dir", subcommit ? SUBDIR : BAKDIR, "BBP", "dir")) == GDK_SUCCEED) {
+   if ((ret = GDKmove(0, backup_dir ? BAKDIR : BATDIR, "BBP", 
"dir", subcommit ? SUBDIR : BAKDIR, "BBP", "dir", true)) == GDK_SUCCEED) {
backup_dir = set;
}
}
@@ -3294,7 +3294,7 @@ force_move(int farmid, const char *srcdi
return ret;
}
/* try to rename it */
-   ret = GDKmove(farmid, srcdir, name, NULL, dstdir, name, NULL);
+   ret = GDKmove(farmid, srcdir, name, NULL, dstdir, name, NULL, false);
 
if (ret != GDK_SUCCEED) {
char *srcpath;
@@ -3312,7 +3312,7 @@ force_move(int farmid, const char *srcdi
TRC_DEBUG(IO_, "remove %s = %d\n", dstpath, (int) ret);
 
(void) GDKcreatedir(dstdir); /* if fails, move will fail */
-   ret = GDKmove(farmid, srcdir, name, NULL, dstdir, name, NULL);
+   ret = GDKmove(farmid, srcdir, name, NULL, dstdir, name, NULL, 
true);
TRC_DEBUG(IO_, "link %s %s = %d\n", srcpath, dstpath, (int) 
ret);
GDKfree(dstpath);
GDKfree(srcpath);
@@ -3467,7 +3467,7 @@ BBPrecover_subdir(void)
while ((dent = readdir(dirp)) != NULL) {
if (dent->d_name[0] == '.')
continue;
-   ret = GDKmove(0, SUBDIR, dent->d_name, NULL, BAKDIR, 
dent->d_name, NULL);
+   ret = GDKmove(0, SUBDIR, dent->d_name, NULL, BAKDIR, 
dent->d_name, NULL, true);
if (ret == GDK_SUCCEED && strcmp(dent->d_name, "BBP.dir") == 0)
backup_dir = 1;
if (ret != GDK_SUCCEED)
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -496,7 +496,7 @@ GDKupgradevarheap(BAT *b, var_t v, BUN c
if (exists == 0 &&
(old->storage != STORE_MEM ||
 GDKmove(old->farmid, BATDIR, old->filename, NULL,
-BAKDIR, filename, NULL) != GDK_SUCCEED)) {
+BAKDIR, filename, NULL, false) != GDK_SUCCEED)) {
int fd;
ssize_t ret = 0;
size_t size = n << b->tshift;
@@ -531,7 +531,7 @@ GDKupgradevarheap(BAT *b, var_t v, BUN c
}
/* move tmp file to backup directory (without .tmp
 * extension) */
-   if (GDKmove(old->farmid, BATDIR, old->filename, "tmp", 
BAKDIR, filename, NULL) != GDK_SUCCEED) {
+   if (GDKmove(old->farmid, BAT

MonetDB: iso - merged with jul2021

2021-06-04 Thread Niels Nes
Changeset: 8fa6ad5bbe62 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8fa6ad5bbe62
Modified Files:
sql/storage/store.c
Branch: iso
Log Message:

merged with jul2021


diffs (237 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2017,7 +2017,9 @@ logger_destroy(logger *lg)
if (LOG_DISABLED(lg)) {
lg->saved_id = lg->id;
lg->saved_tid = lg->tid;
+   logger_lock(lg);
logger_commit(lg);
+   logger_unlock(lg);
}
if (lg->catalog_bid) {
logger_lock(lg);
@@ -2120,9 +2122,10 @@ logger_flush(logger *lg, ulng ts)
lg->saved_tid = lg->tid;
if (lid)
logger_cleanup_range(lg);
-   if (logger_commit(lg) != GDK_SUCCEED) {
+   logger_lock(lg);
+   if (logger_commit(lg) != GDK_SUCCEED)
TRC_ERROR(GDK, "failed to commit");
-   }
+   logger_unlock(lg);
return GDK_SUCCEED;
}
if (lg->saved_id >= lid)
@@ -2547,7 +2550,10 @@ log_tend(logger *lg, ulng commit_ts)
l.id = lg->tid;
if (lg->flushnow) {
lg->flushnow = 0;
-   return logger_commit(lg);
+   logger_lock(lg);
+   gdk_return res = logger_commit(lg);
+   logger_unlock(lg);
+   return res;
}
 
if (lg->current) {
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -1277,7 +1277,7 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
sql_table *t = mvc_bind_table(m, s, tname);
sql_column *c = mvc_bind_column(m, t, cname);
b = mvc_bind(m, sname, tname, cname, access);
-   if (b && b->ttype != coltype) {
+   if (b && b->ttype && b->ttype != coltype) {
BBPunfix(b->batCacheid);
throw(SQL,"sql.bind",SQLSTATE(42000) "Column type mismatch");
}
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -446,6 +446,7 @@ typedef struct sqlstore {
 ATOMIC_TYPE timestamp; /* timestamp counter */
 ATOMIC_TYPE transaction;/* transaction id counter */
ulng oldest;
+   ulng oldest_pending;
int readonly;   /* store is readonly */
int singleuser; /* store is for a single user only (==1 
enable, ==2 single user session running) */
int first;  /* just created the db */
@@ -465,6 +466,7 @@ typedef struct sqlstore {
 
 typedef struct sql_change {
sql_base *obj;
+   ulng ts;/* commit/rollback timestamp */
void *data; /* data changes */
bool committed; /* commit or rollback */
bool handled;   /* handled in commit */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -58,6 +58,13 @@ store_oldest(sqlstore *store)
return store_oldest_given_max(store, TRANSACTION_ID_BASE);
 }
 
+static ulng
+store_oldest_pending(sqlstore *store)
+{
+   assert(store->oldest_pending != TRANSACTION_ID_BASE);
+   return store->oldest_pending;
+}
+
 static inline bool
 instore(sqlid id)
 {
@@ -1979,7 +1986,7 @@ store_apply_deltas(sqlstore *store)
flusher.working = true;
 
store_lock(store);
-   ulng oldest = store_oldest(store);
+   ulng oldest = store_oldest_pending(store);
store_unlock(store);
if (oldest)
res = store->logger_api.flush(store, oldest-1);
@@ -1988,23 +1995,11 @@ store_apply_deltas(sqlstore *store)
 }
 
 
-/* Call while holding store->flush */
-static void
-wait_until_flusher_idle(sqlstore *store)
-{
-   while (flusher.working) {
-   const int sleeptime = 100;
-   MT_lock_unset(&store->lock);
-   MT_sleep_ms(sleeptime);
-   MT_lock_set(&store->lock);
-   }
-}
 void
 store_suspend_log(sqlstore *store)
 {
MT_lock_set(&store->lock);
flusher.enabled = false;
-   wait_until_flusher_idle(store);
MT_lock_unset(&store->lock);
 }
 
@@ -2019,6 +2014,7 @@ store_resume_log(sqlstore *store)
 static void
 store_pending_changes(sqlstore *store, ulng oldest)
 {
+   ulng oldest_changes = TRANSACTION_ID_BASE;
if (!list_empty(store->changes)) { /* lets first cleanup old stuff */
for(node *n=store->changes->h; n; ) {
node *next = n->next;
@@ -2029,9 +2025,13 @@ store_pending_changes(sqlstore *store, u
} else if (c->cleanup && c->cleanup(store, c, oldest)) {
list_remove_node(store->changes, store, n);
_DELETE(c);
+   } else if (c->ts < oldest_chang

MonetDB: iso - merged with jul2021

2021-06-04 Thread Niels Nes
Changeset: ed13daf4af23 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ed13daf4af23
Modified Files:
sql/backends/monet5/rel_bin.c
sql/include/sql_catalog.h
sql/storage/store.c
Branch: iso
Log Message:

merged with jul2021


diffs (truncated from 3335 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
@@ -539,8 +539,8 @@ gdk_return log_bat_transient(logger *lg,
 gdk_return log_constant(logger *lg, int type, ptr val, log_id id, lng offset, 
lng cnt);
 gdk_return log_delta(logger *lg, BAT *uid, BAT *uval, log_id id);
 gdk_return log_sequence(logger *lg, int seq, lng id);
-gdk_return log_tend(logger *lg);
-gdk_return log_tstart(logger *lg, ulng commit_ts, bool flush);
+gdk_return log_tend(logger *lg, ulng commit_ts);
+gdk_return log_tstart(logger *lg, bool flush);
 gdk_return logger_activate(logger *lg);
 lng logger_changes(logger *lg);
 logger *logger_create(int debug, const char *fn, const char *logdir, int 
version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, void 
*funcdata);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -809,12 +809,12 @@ COLcopy(BAT *b, int tt, bool writable, r
 
/* first try case (1); create a view, possibly with different
 * atom-types */
-   if (role == b->batRole &&
+   if (!writable &&
+   role == b->batRole &&
b->batRestricted == BAT_READ &&
ATOMstorage(b->ttype) != TYPE_msk && /* no view on TYPE_msk */
(!VIEWtparent(b) ||
-BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ) &&
-   !writable) {
+BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ)) {
bn = VIEWcreate(b->hseqbase, b);
if (bn == NULL)
return NULL;
@@ -875,8 +875,8 @@ COLcopy(BAT *b, int tt, bool writable, r
strconcat_len(thp.filename, sizeof(thp.filename),
  BBP_physical(bn->batCacheid),
  ".theap", NULL);
-   if ((b->ttype && HEAPcopy(&bthp, b->theap) != 
GDK_SUCCEED) ||
-   (bn->tvheap && HEAPcopy(&thp, b->tvheap) != 
GDK_SUCCEED)) {
+   if ((b->ttype && HEAPcopy(&bthp, b->theap, b->tbaseoff 
<< b->tshift) != GDK_SUCCEED) ||
+   (bn->tvheap && HEAPcopy(&thp, b->tvheap, 0) != 
GDK_SUCCEED)) {
HEAPfree(&thp, true);
HEAPfree(&bthp, true);
BBPreclaim(bn);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -32,7 +32,7 @@ unshare_varsized_heap(BAT *b)
h->farmid = BBPselectfarm(b->batRole, TYPE_str, varheap);
strconcat_len(h->filename, sizeof(h->filename),
  BBP_physical(b->batCacheid), ".theap", NULL);
-   if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+   if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
@@ -496,7 +496,7 @@ append_varsized_bat(BAT *b, BAT *n, stru
h->farmid = BBPselectfarm(b->batRole, b->ttype, varheap);
strconcat_len(h->filename, sizeof(h->filename),
  BBP_physical(b->batCacheid), ".theap", NULL);
-   if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+   if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -437,41 +437,43 @@ rev(oid x)
return x;
 }
 
-/* population count: count number of 1 bits in a value */
-static inline int
-pop(oid x)
+/* count trailing zeros, also see candmask_lobit in gdk_cand.h */
+static inline int __attribute__((__const__))
+ctz(oid x)
 {
-#ifdef __GNUC__
+#if defined(__GNUC__)
 #if SIZEOF_OID == SIZEOF_INT
-   return __builtin_popcount(x);
+   return __builtin_ctz(x);
 #else
-   return __builtin_popcountl(x);
+   return __builtin_ctzl(x);
 #endif
-#else
-#ifdef _MSC_VER
+#elif defined(_MSC_VER)
 #if SIZEOF_OID == SIZEOF_INT
-   return (int) __popcnt((unsigned int) (x));
-#else
-   return (int) __popcnt64((unsigned __int64) (x));
-#endif
+   unsigned long idx;
+   if (_BitScanForward(&idx, (unsigned long) x))
+   return (int) idx;
 #else
-   /* divide and conquer implementation */
-#if SIZEOF_OID == 8
-   x = (x & 0x) + ((x >>  1) & 0x);
-   x = (x & 0x) + ((x >>  2) & 0x);
-   x = (x & 0

MonetDB: iso - Merged with Jul2021

2021-06-02 Thread Pedro Ferreira
Changeset: b49728c3b1f1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b49728c3b1f1
Modified Files:
sql/include/sql_catalog.h
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 1627 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
@@ -539,8 +539,8 @@ gdk_return log_bat_transient(logger *lg,
 gdk_return log_constant(logger *lg, int type, ptr val, log_id id, lng offset, 
lng cnt);
 gdk_return log_delta(logger *lg, BAT *uid, BAT *uval, log_id id);
 gdk_return log_sequence(logger *lg, int seq, lng id);
-gdk_return log_tend(logger *lg);
-gdk_return log_tstart(logger *lg, ulng commit_ts, bool flush);
+gdk_return log_tend(logger *lg, ulng commit_ts);
+gdk_return log_tstart(logger *lg, bool flush);
 gdk_return logger_activate(logger *lg);
 lng logger_changes(logger *lg);
 logger *logger_create(int debug, const char *fn, const char *logdir, int 
version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, void 
*funcdata);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -809,12 +809,12 @@ COLcopy(BAT *b, int tt, bool writable, r
 
/* first try case (1); create a view, possibly with different
 * atom-types */
-   if (role == b->batRole &&
+   if (!writable &&
+   role == b->batRole &&
b->batRestricted == BAT_READ &&
ATOMstorage(b->ttype) != TYPE_msk && /* no view on TYPE_msk */
(!VIEWtparent(b) ||
-BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ) &&
-   !writable) {
+BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ)) {
bn = VIEWcreate(b->hseqbase, b);
if (bn == NULL)
return NULL;
@@ -875,8 +875,8 @@ COLcopy(BAT *b, int tt, bool writable, r
strconcat_len(thp.filename, sizeof(thp.filename),
  BBP_physical(bn->batCacheid),
  ".theap", NULL);
-   if ((b->ttype && HEAPcopy(&bthp, b->theap) != 
GDK_SUCCEED) ||
-   (bn->tvheap && HEAPcopy(&thp, b->tvheap) != 
GDK_SUCCEED)) {
+   if ((b->ttype && HEAPcopy(&bthp, b->theap, b->tbaseoff 
<< b->tshift) != GDK_SUCCEED) ||
+   (bn->tvheap && HEAPcopy(&thp, b->tvheap, 0) != 
GDK_SUCCEED)) {
HEAPfree(&thp, true);
HEAPfree(&bthp, true);
BBPreclaim(bn);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -32,7 +32,7 @@ unshare_varsized_heap(BAT *b)
h->farmid = BBPselectfarm(b->batRole, TYPE_str, varheap);
strconcat_len(h->filename, sizeof(h->filename),
  BBP_physical(b->batCacheid), ".theap", NULL);
-   if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+   if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
@@ -496,7 +496,7 @@ append_varsized_bat(BAT *b, BAT *n, stru
h->farmid = BBPselectfarm(b->batRole, b->ttype, varheap);
strconcat_len(h->filename, sizeof(h->filename),
  BBP_physical(b->batCacheid), ".theap", NULL);
-   if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+   if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -437,41 +437,43 @@ rev(oid x)
return x;
 }
 
-/* population count: count number of 1 bits in a value */
-static inline int
-pop(oid x)
+/* count trailing zeros, also see candmask_lobit in gdk_cand.h */
+static inline int __attribute__((__const__))
+ctz(oid x)
 {
-#ifdef __GNUC__
+#if defined(__GNUC__)
 #if SIZEOF_OID == SIZEOF_INT
-   return __builtin_popcount(x);
+   return __builtin_ctz(x);
 #else
-   return __builtin_popcountl(x);
+   return __builtin_ctzl(x);
 #endif
-#else
-#ifdef _MSC_VER
+#elif defined(_MSC_VER)
 #if SIZEOF_OID == SIZEOF_INT
-   return (int) __popcnt((unsigned int) (x));
-#else
-   return (int) __popcnt64((unsigned __int64) (x));
-#endif
+   unsigned long idx;
+   if (_BitScanForward(&idx, (unsigned long) x))
+   return (int) idx;
 #else
-   /* divide and conquer implementation */
-#if SIZEOF_OID == 8
-   x = (x & 0x) + ((x >>  1) & 0x);
-   x = (x & 0x) + ((x >>  2) & 0x);
-   x = (x & 0x0F0F0F0F0F0F0F0F) + ((x >>  4) & 0x0F

MonetDB: iso - Merged with Jul2021

2021-06-01 Thread Pedro Ferreira
Changeset: 20e8e80f5f8d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/20e8e80f5f8d
Branch: iso
Log Message:

Merged with Jul2021


diffs (177 lines):

diff --git a/sql/test/miscellaneous/Tests/mserver5-in-memory.SQL.py 
b/sql/test/miscellaneous/Tests/mserver5-in-memory.SQL.py
--- a/sql/test/miscellaneous/Tests/mserver5-in-memory.SQL.py
+++ b/sql/test/miscellaneous/Tests/mserver5-in-memory.SQL.py
@@ -8,11 +8,10 @@ def freeport():
 sock.close()
 return port
 
-def wait_server_to_start(port):
+def wait_server_to_start(port, mserver_process):
 started = False
 mserver_process.poll()
 if mserver_process.returncode is not None:
-mserver_process.wait()
 raise Exception("The server terminated early")
 retry = 0
 while retry < 3:
@@ -28,26 +27,33 @@ def wait_server_to_start(port):
 if not started:
 raise Exception("The server did not start?")
 
-prt = freeport()
-cmd = ['mserver5', '--in-memory', '--set', 'mapi_port=%d' % (prt,)]
-mserver_process = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
-wait_server_to_start(prt)
-with SQLTestCase() as mdb:
-mdb.connect(database=None, port=prt, username="monetdb", 
password="monetdb")
-mdb.execute("""
-start transaction;
-create table iwontpersist (mycol int);
-insert into iwontpersist values (1);
-commit;
-""").assertSucceeded()
-mdb.execute('SELECT mycol FROM 
iwontpersist;').assertDataResultMatch([(1,)])
-mserver_process.terminate()
+mserver_process1 = None
+mserver_process2 = None
 
-prt = freeport()
-cmd = ['mserver5', '--in-memory', '--set', 'mapi_port=%d' % (prt,)]
-mserver_process = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
-wait_server_to_start(prt)
-with SQLTestCase() as mdb:
-mdb.connect(database=None, port=prt, username="monetdb", 
password="monetdb")
-mdb.execute('SELECT mycol FROM 
iwontpersist;').assertFailed(err_code="42S02", err_message="SELECT: no such 
table 'iwontpersist'")
-mserver_process.terminate()
+try:
+prt1 = freeport()
+cmd = ['mserver5', '--in-memory', '--set', 'mapi_port=%d' % (prt1,)]
+mserver_process1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
+wait_server_to_start(prt1, mserver_process1)
+with SQLTestCase() as mdb:
+mdb.connect(database=None, port=prt1, username="monetdb", 
password="monetdb")
+mdb.execute("""
+start transaction;
+create table iwontpersist (mycol int);
+insert into iwontpersist values (1);
+commit;
+""").assertSucceeded()
+mdb.execute('SELECT mycol FROM 
iwontpersist;').assertDataResultMatch([(1,)])
+
+prt2 = freeport()
+cmd = ['mserver5', '--in-memory', '--set', 'mapi_port=%d' % (prt2,)]
+mserver_process2 = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
+wait_server_to_start(prt2, mserver_process2)
+with SQLTestCase() as mdb:
+mdb.connect(database=None, port=prt2, username="monetdb", 
password="monetdb")
+mdb.execute('SELECT mycol FROM 
iwontpersist;').assertFailed(err_code="42S02", err_message="SELECT: no such 
table 'iwontpersist'")
+finally:
+if mserver_process1 is not None:
+mserver_process1.terminate()
+if mserver_process2 is not None:
+mserver_process2.terminate()
diff --git a/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py 
b/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py
--- a/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py
+++ b/sql/test/miscellaneous/Tests/transaction_isolation2.SQL.py
@@ -11,7 +11,7 @@ with SQLTestCase() as mdb1:
 mdb1.execute("CREATE TABLE doubles (d double 
precision);").assertSucceeded()
 mdb1.execute("insert into longs values (1),(2),(3);").assertSucceeded()
 mdb1.execute("insert into integers values 
(1),(2),(3);").assertSucceeded()
-mdb1.execute("alter table longs add primary key (i)").assertSucceeded()
+mdb1.execute("alter table longs add primary key 
(i);").assertSucceeded()
 mdb1.execute('commit;').assertSucceeded()
 
 mdb1.execute('start transaction;').assertSucceeded()
@@ -65,6 +65,92 @@ with SQLTestCase() as mdb1:
 mdb1.execute('commit;').assertSucceeded()
 mdb2.execute('rollback;').assertSucceeded()
 
+mdb1.execute('create merge table parent(a int);').assertSucceeded()
+mdb1.execute('create table child1(c int);').assertSucceeded()
+mdb1.execute('create table child2(c int);').assertSucceeded()
+mdb1.execute('start transaction;').assertSucceeded()
+mdb2.execute('start transaction;').assertSucceeded()
+mdb1.execute("ALTER TABLE parent ADD TABLE child1;").assertSucceeded()
+mdb2.execute("ALTER TABLE parent ADD TABLE 
child2;").assertFailed(err_code="42000", err_message="ALTER TABLE: transaction 
conflict detected")
+mdb1.execute('commit;')

MonetDB: iso - Merged with Jul2021

2021-05-31 Thread Pedro Ferreira
Changeset: 33b67ef60fd8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/33b67ef60fd8
Modified Files:
sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 2607 to 300 lines):

diff --git a/common/utils/matomic.h b/common/utils/matomic.h
--- a/common/utils/matomic.h
+++ b/common/utils/matomic.h
@@ -261,8 +261,8 @@ typedef volatile int ATOMIC_TYPE;
 #define ATOMIC_XCG(var, val)   __atomic_exchange_n(var, (ATOMIC_BASE_TYPE) 
(val), __ATOMIC_SEQ_CST)
 #define ATOMIC_CAS(var, exp, des)  __atomic_compare_exchange_n(var, exp, 
(ATOMIC_BASE_TYPE) (des), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
 #define ATOMIC_ADD(var, val)   __atomic_fetch_add(var, (ATOMIC_BASE_TYPE) 
(val), __ATOMIC_SEQ_CST)
-#define ATOMIC_SUB(var, val)   __atomic_fetch_sub(var, (ATOMIC_BASE_TYPE) 
(val), __ATOMIC_SEQ_CST)#
-define ATOMIC_INC(var) __atomic_add_fetch(var, 1, 
__ATOMIC_SEQ_CST)
+#define ATOMIC_SUB(var, val)   __atomic_fetch_sub(var, (ATOMIC_BASE_TYPE) 
(val), __ATOMIC_SEQ_CST)
+#define ATOMIC_INC(var)__atomic_add_fetch(var, 1, 
__ATOMIC_SEQ_CST)
 #define ATOMIC_DEC(var)__atomic_sub_fetch(var, 1, 
__ATOMIC_SEQ_CST)
 #define ATOMIC_OR(var, val)__atomic_fetch_or(var, 
(ATOMIC_BASE_TYPE) (val), __ATOMIC_SEQ_CST)
 #define ATOMIC_AND(var, val)   __atomic_fetch_and(var, (ATOMIC_BASE_TYPE) 
(val), __ATOMIC_SEQ_CST)
diff --git a/common/utils/mstring.h b/common/utils/mstring.h
--- a/common/utils/mstring.h
+++ b/common/utils/mstring.h
@@ -29,7 +29,10 @@ strcpy_len(char *restrict dst, const cha
if ((dst[i] = src[i]) == 0)
return i;
}
-   dst[n - 1] = 0;
+   /* for correctness, the decrement isn't needed (just assigning 0
+* to dst[n-1] would be sufficient), but to work around a too
+* strict GNU C compiler, we do need it */
+   dst[--n] = 0;
 /* in some versions of GCC (at least gcc (Ubuntu 7.5.0-3ubuntu1~18.04)
  * 7.5.0), the error just can't be turned off when using
  * --enable-strict, so we just use the (more) expensive way of getting the
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2183,7 +2183,6 @@ logger_flush(logger *lg, ulng ts)
}
logger_unlock(lg);
}
-   assert(res==LOG_OK);
if (lid && res == LOG_OK)
logger_cleanup_range(lg);
return res == LOG_ERR ? GDK_FAIL : GDK_SUCCEED;
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -383,6 +383,8 @@ join_threads(void)
bool waited;
 
struct winthread *self = TlsGetValue(threadslot);
+   if (!self)
+   return;
EnterCriticalSection(&winthread_cs);
do {
waited = false;
diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -280,7 +280,14 @@ gdk_return
 GDKtracer_stop(void)
 {
set_level_for_layer(MDB_ALL, DEFAULT_LOG_LEVEL);
-   return GDKtracer_flush_buffer();
+   if (active_tracer) {
+   if (active_tracer != stderr)
+   fclose(active_tracer);
+   else
+   fflush(active_tracer);
+   active_tracer = NULL;
+   }
+   return GDK_SUCCEED;
 }
 
 gdk_return
diff --git a/monetdb5/modules/atoms/batxml.c b/monetdb5/modules/atoms/batxml.c
--- a/monetdb5/modules/atoms/batxml.c
+++ b/monetdb5/modules/atoms/batxml.c
@@ -1250,7 +1250,7 @@ BATxmlaggr(BAT **bnp, BAT *b, BAT *g, BA
if (BATsort(&t1, &t2, NULL, g, NULL, NULL, false, false, true) 
!= GDK_SUCCEED) {
BBPreclaim(bn);
bn = NULL;
-   err = "internal sort failed";
+   err = GDK_EXCEPTION;
goto out;
}
if (freeg)
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -2431,7 +2431,7 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, 
if (g) {
/* stable sort g */
if (BATsort(&t1, &t2, NULL, g, NULL, NULL, false, false, true) 
!= GDK_SUCCEED) {
-   err = "internal sort failed";
+   err = GDK_EXCEPTION;
goto out;
}
if (freeg)
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -786,29 +786,19 @@ ALGcrossproduct(bat *l, bat *r, const ba
BAT *sl = NULL, *sr = NULL;
gdk_return ret;
 
-   if ((L = BATdescriptor(*left)) == NULL) {
+   if ((L = BBPquickdesc(*left, false)) == NULL)
throw(MAL, "