Changeset: 5128f1c24e72 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/5128f1c24e72 Modified Files: gdk/gdk_batop.c gdk/gdk_logger.c gdk/gdk_project.c monetdb5/modules/mal/mkey.c sql/storage/bat/bat_storage.c Branch: Jan2022 Log Message:
Merge with Jul2021 branch. diffs (truncated from 445 to 300 lines): diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -1404,14 +1404,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 @@ -179,18 +179,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); @@ -254,9 +269,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) @@ -625,7 +640,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) @@ -727,9 +742,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; @@ -762,7 +777,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; @@ -774,7 +789,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; } @@ -851,15 +866,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); @@ -2545,7 +2560,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; } @@ -2571,7 +2586,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; @@ -2858,9 +2873,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; @@ -2922,7 +2937,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 @@ -121,6 +121,11 @@ #define MKEYHASH_hge(valp) ((ulng) (*(const uhge *)(valp) >> 64) ^ \ (ulng) *(const uhge *)(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) @@ -371,54 +376,59 @@ MKEYbulk_rotate_xor_hash(bat *res, const BATiter bi = bat_iterator(b); BATiter hbi = bat_iterator(hb); h = (const ulng *) hbi.base; - switch (ATOMstorage(b->ttype)) { - case TYPE_bte: { - const bte *restrict v = (const bte *) bi.base; - for (BUN i = 0; i < n; i++) { - r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_bte(v + i); + if (complex_cand(b)) { + for (BUN i = 0; i < n; i++) + r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_oid(Tpos(&bi, i)); + } else { + switch (ATOMstorage(b->ttype)) { + case TYPE_bte: { + const bte *restrict v = (const bte *) bi.base; + for (BUN i = 0; i < n; i++) { + r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_bte(v + i); + } + break; } - break; - } - case TYPE_sht: { - const sht *restrict v = (const sht *) bi.base; - for (BUN i = 0; i < n; i++) { - r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_sht(v + i); + case TYPE_sht: { + const sht *restrict v = (const sht *) bi.base; + for (BUN i = 0; i < n; i++) { + r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_sht(v + i); + } + break; } - break; - } - case TYPE_int: - case TYPE_flt: { - const int *restrict v = (const int *) bi.base; - for (BUN i = 0; i < n; i++) { - r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_int(v + i); + case TYPE_int: + case TYPE_flt: { + const int *restrict v = (const int *) bi.base; + for (BUN i = 0; i < n; i++) { + r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_int(v + i); + } + break; } - break; - } - case TYPE_lng: - case TYPE_dbl: { - const lng *restrict v = (const lng *) bi.base; - for (BUN i = 0; i < n; i++) { - r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_lng(v + i); + case TYPE_lng: + case TYPE_dbl: { + const lng *restrict v = (const lng *) bi.base; + for (BUN i = 0; i < n; i++) { + r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_lng(v + i); + } + break; } - break; - } #ifdef HAVE_HGE - case TYPE_hge: { - const hge *restrict v = (const hge *) bi.base; - for (BUN i = 0; i < n; i++) { - r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_hge(v + i); + case TYPE_hge: { + const hge *restrict v = (const hge *) bi.base; + for (BUN i = 0; i < n; i++) { + r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ MKEYHASH_hge(v + i); + } + break; } - break; - } #endif _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org