MonetDB: iso - Merged with Jul2021
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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, "