Changeset: 425259247453 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/425259247453 Modified Files: .bumpversion.cfg MonetDB.spec clients/mapilib/mapi.rc clients/odbc/driver/driver.rc clients/odbc/winsetup/setup.rc cmake/monetdb-versions.cmake gdk/gdk_batop.c gdk/gdk_logger.c gdk/gdk_project.c gdk/libbat.rc monetdb5/modules/mal/mkey.c monetdb5/tools/libmonetdb5.rc sql/server/rel_exp.c sql/storage/bat/bat_storage.c sql/test/BugTracker-2022/Tests/All Branch: default Log Message:
Merge with Jan2022 branch. diffs (truncated from 523 to 300 lines): diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -756,3 +756,4 @@ f458e1c71c73d6bd9636369c1406eadb74f016bf 00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_15 00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_SP3_release db3cec8ea853884e857fcfb413428116cb95e786 Jul2021_17 +8c015afafb5903ea59b0e2cffac1138a0d82e007 Jul2021_19 diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -1391,14 +1391,23 @@ BATappend_or_update(BAT *b, BAT *p, cons else if (pos <= bi.minpos && bi.minpos < pos + ni.count) bi.minpos = BUN_NONE; } + if (complex_cand(n)) { + for (BUN i = 0, j = ni.count; i < j; i++) + o[i] = *(oid *)Tpos(&ni, i); + /* last value */ + v = o[ni.count - 1]; + } else { + for (BUN i = 0, j = ni.count; i < j; i++) + o[i] = v++; + /* last value added (not one beyond) */ + v--; + } if (bi.maxpos != BUN_NONE) { - if (v + ni.count - 1 >= BUNtoid(b, bi.maxpos)) + if (v >= BUNtoid(b, bi.maxpos)) bi.maxpos = pos + ni.count - 1; else if (pos <= bi.maxpos && bi.maxpos < pos + ni.count) bi.maxpos = BUN_NONE; } - for (BUN i = 0, j = ni.count; i < j; i++) - o[i] = v++; } } else { /* if the extremes of n are at least as diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -14,7 +14,7 @@ #include "mutils.h" #include <string.h> -static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id); +static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id, int tid); static gdk_return logger_del_bat(logger *lg, log_bid bid); /* * The logger uses a directory to store its log files. One master log @@ -157,18 +157,33 @@ log_find(BAT *b, BAT *d, int val) } static log_bid -internal_find_bat(logger *lg, log_id id) +internal_find_bat(logger *lg, log_id id, int tid) { BATiter cni = bat_iterator_nolock(lg->catalog_id); BUN p; if (BAThash(lg->catalog_id) == GDK_SUCCEED) { MT_rwlock_rdlock(&cni.b->thashlock); - HASHloop_int(cni, cni.b->thash, p, &id) { - oid pos = p; - if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) { + if (tid < 0) { + HASHloop_int(cni, cni.b->thash, p, &id) { + oid pos = p; + if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) { + MT_rwlock_rdunlock(&cni.b->thashlock); + return *(log_bid *) Tloc(lg->catalog_bid, p); + } + } + } else { + BUN cp = BUN_NONE; + HASHloop_int(cni, cni.b->thash, p, &id) { + lng lid = *(lng *) Tloc(lg->catalog_lid, p); + if (lid != lng_nil && lid <= tid) { + break; + } + cp = p; + } + if (cp != BUN_NONE) { MT_rwlock_rdunlock(&cni.b->thashlock); - return *(log_bid *) Tloc(lg->catalog_bid, p); + return *(log_bid *) Tloc(lg->catalog_bid, cp); } } MT_rwlock_rdunlock(&cni.b->thashlock); @@ -232,9 +247,9 @@ log_read_clear(logger *lg, trans *tr, lo } static gdk_return -la_bat_clear(logger *lg, logaction *la) +la_bat_clear(logger *lg, logaction *la, int tid) { - log_bid bid = internal_find_bat(lg, la->cid); + log_bid bid = internal_find_bat(lg, la->cid, tid); BAT *b; if (lg->debug & 1) @@ -603,7 +618,7 @@ la_bat_update_count(logger *lg, log_id i static gdk_return la_bat_updates(logger *lg, logaction *la, int tid) { - log_bid bid = internal_find_bat(lg, la->cid); + log_bid bid = internal_find_bat(lg, la->cid, tid); BAT *b = NULL; if (bid == 0) @@ -705,9 +720,9 @@ log_read_destroy(logger *lg, trans *tr, } static gdk_return -la_bat_destroy(logger *lg, logaction *la) +la_bat_destroy(logger *lg, logaction *la, int tid) { - log_bid bid = internal_find_bat(lg, la->cid); + log_bid bid = internal_find_bat(lg, la->cid, tid); if (bid && logger_del_bat(lg, bid) != GDK_SUCCEED) return GDK_FAIL; @@ -740,7 +755,7 @@ log_read_create(logger *lg, trans *tr, l } static gdk_return -la_bat_create(logger *lg, logaction *la) +la_bat_create(logger *lg, logaction *la, int tid) { BAT *b; @@ -752,7 +767,7 @@ la_bat_create(logger *lg, logaction *la) BATtseqbase(b, 0); if ((b = BATsetaccess(b, BAT_READ)) == NULL || - logger_add_bat(lg, b, la->cid) != GDK_SUCCEED) { + logger_add_bat(lg, b, la->cid, tid) != GDK_SUCCEED) { logbat_destroy(b); return GDK_FAIL; } @@ -827,15 +842,15 @@ la_apply(logger *lg, logaction *c, int t break; case LOG_CREATE: if (!lg->flushing) - ret = la_bat_create(lg, c); + ret = la_bat_create(lg, c, tid); break; case LOG_DESTROY: if (!lg->flushing) - ret = la_bat_destroy(lg, c); + ret = la_bat_destroy(lg, c, tid); break; case LOG_CLEAR: if (!lg->flushing) - ret = la_bat_clear(lg, c); + ret = la_bat_clear(lg, c, tid); break; default: assert(0); @@ -2501,7 +2516,7 @@ log_bat_persists(logger *lg, BAT *b, log bte ta = find_type(lg, b->ttype); logformat l; - if (logger_add_bat(lg, b, id) != GDK_SUCCEED) { + if (logger_add_bat(lg, b, id, -1) != GDK_SUCCEED) { logger_unlock(lg); return GDK_FAIL; } @@ -2527,7 +2542,7 @@ gdk_return log_bat_transient(logger *lg, log_id id) { logger_lock(lg); - log_bid bid = internal_find_bat(lg, id); + log_bid bid = internal_find_bat(lg, id, -1); logformat l; l.flag = LOG_DESTROY; @@ -2814,9 +2829,9 @@ bm_commit(logger *lg) } static gdk_return -logger_add_bat(logger *lg, BAT *b, log_id id) +logger_add_bat(logger *lg, BAT *b, log_id id, int tid) { - log_bid bid = internal_find_bat(lg, id); + log_bid bid = internal_find_bat(lg, id, tid); lng cnt = 0; lng lid = lng_nil; @@ -2878,7 +2893,7 @@ log_bid logger_find_bat(logger *lg, log_id id) { logger_lock(lg); - log_bid bid = internal_find_bat(lg, id); + log_bid bid = internal_find_bat(lg, id, -1); logger_unlock(lg); return bid; } diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c --- a/gdk/gdk_project.c +++ b/gdk/gdk_project.c @@ -646,6 +646,10 @@ BATproject2(BAT *restrict l, BAT *restri l = BATunmask(l); if (l == NULL) goto doreturn; + if (complex_cand(l)) { + lcount = canditer_init(&ci, NULL, l); + lci = &ci; + } } if (lcount == 0 || (l->ttype == TYPE_void && is_oid_nil(l->tseqbase)) || 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 @@ -120,6 +120,11 @@ #ifdef HAVE_HGE #define MKEYHASH_hge(valp) ((lng) (valp >> 64) ^ (lng) (valp)) #endif +#if SIZEOF_OID == SIZEOF_INT +#define MKEYHASH_oid(valp) MKEYHASH_int(valp) +#else +#define MKEYHASH_oid(valp) MKEYHASH_lng(valp) +#endif static inline ulng GDK_ROTATE(ulng x, int y, int z) @@ -408,57 +413,66 @@ MKEYbulk_rotate_xor_hash(Client cntxt, M hbi = bat_iterator(hb); bi = bat_iterator(b); - switch (ATOMstorage(b->ttype)) { - case TYPE_bte: - MKEYbulk_rotate_xor_hashloop(bte); - break; - case TYPE_sht: - MKEYbulk_rotate_xor_hashloop(sht); - break; - case TYPE_int: - case TYPE_flt: - MKEYbulk_rotate_xor_hashloop(int); - break; - case TYPE_lng: { /* hb and b areas may overlap, so for this case the 'restrict' keyword cannot be used */ - const ulng *h = (const ulng *) hbi.base; - const lng *v = (const lng *) bi.base; - if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) { - for (BUN i = 0; i < n; i++) { - oid p1 = (canditer_next_dense(&ci1) - off1), p2 = (canditer_next_dense(&ci2) - off2); - r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^ (ulng) MKEYHASH_lng(v[p2]); - } - } else { - for (BUN i = 0; i < n; i++) { - oid p1 = (canditer_next(&ci1) - off1), p2 = (canditer_next(&ci2) - off2); - r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^ (ulng) MKEYHASH_lng(v[p2]); - } + if (complex_cand(b)) { + const ulng *restrict h = (const ulng *) hbi.base; + for (BUN i = 0; i < n; i++) { + oid p1 = canditer_next(&ci1) - off1; + oid p2 = canditer_next(&ci2) - off2; + r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^ MKEYHASH_oid(*(oid*)Tpos(&bi, p2)); } - } break; - case TYPE_dbl: - MKEYbulk_rotate_xor_hashloop(lng); - break; + } else { + switch (ATOMstorage(b->ttype)) { + case TYPE_bte: + MKEYbulk_rotate_xor_hashloop(bte); + break; + case TYPE_sht: + MKEYbulk_rotate_xor_hashloop(sht); + break; + case TYPE_int: + case TYPE_flt: + MKEYbulk_rotate_xor_hashloop(int); + break; + case TYPE_lng: { /* hb and b areas may overlap, so for this case the 'restrict' keyword cannot be used */ + const ulng *h = (const ulng *) hbi.base; + const lng *v = (const lng *) bi.base; + if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) { + for (BUN i = 0; i < n; i++) { + oid p1 = (canditer_next_dense(&ci1) - off1), p2 = (canditer_next_dense(&ci2) - off2); + r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^ (ulng) MKEYHASH_lng(v[p2]); + } + } else { + for (BUN i = 0; i < n; i++) { + oid p1 = (canditer_next(&ci1) - off1), p2 = (canditer_next(&ci2) - off2); + r[i] = GDK_ROTATE(h[p1], lbit, rbit) ^ (ulng) MKEYHASH_lng(v[p2]); + } + } + } break; + case TYPE_dbl: + MKEYbulk_rotate_xor_hashloop(lng); + break; #ifdef HAVE_HGE - case TYPE_hge: - MKEYbulk_rotate_xor_hashloop(hge); - break; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org