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

Reply via email to