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

Reply via email to