Changeset: 3a9d0ddc995d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3a9d0ddc995d
Modified Files:
        gdk/gdk_batop.c
        gdk/gdk_project.c
        monetdb5/modules/mal/mkey.c
        sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:

BATunmask can return a "complex_cand" bat (negative candidates).
Add code to deal with that situation.


diffs (239 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1413,10 +1413,19 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                        BATrmprop_nolock(b, GDK_MIN_POS);
                                }
                                MT_lock_unset(&b->theaplock);
-                               for (BUN i = 0, j = ni.count; i < j; i++)
-                                       o[i] = v++;
+                               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--;
+                               }
                                MT_lock_set(&b->theaplock);
-                               if (maxprop && --v >= maxprop->val.oval) {
+                               if (maxprop && v >= maxprop->val.oval) {
                                        BATsetprop_nolock(b, GDK_MAX_VALUE, 
TYPE_oid, &v);
                                        BATsetprop_nolock(b, GDK_MAX_POS, 
TYPE_oid, &(oid){pos + ni.count - 1});
                                } else {
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,62 +376,67 @@ 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);
-               }
-               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);
-               }
-               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);
+       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_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_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;
-       }
-#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);
-               }
-               break;
-       }
-#endif
-       case TYPE_str:
-               if (bi.vh->hashash) {
+               case TYPE_int:
+               case TYPE_flt: {
+                       const int *restrict v = (const int *) bi.base;
                        for (BUN i = 0; i < n; i++) {
-                               const void *restrict s = BUNtvar(bi, i);
-                               r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ (ulng) 
((const BUN *) s)[-1];
+                               r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ 
MKEYHASH_int(v + i);
                        }
                        break;
                }
-               /* fall through */
-       default: {
-               BUN (*hash)(const void *) = BATatoms[b->ttype].atomHash;
+               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;
+               }
+#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);
+                       }
+                       break;
+               }
+#endif
+               case TYPE_str:
+                       if (bi.vh->hashash) {
+                               for (BUN i = 0; i < n; i++) {
+                                       const void *restrict s = BUNtvar(bi, i);
+                                       r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ 
(ulng) ((const BUN *) s)[-1];
+                               }
+                               break;
+                       }
+                       /* fall through */
+               default: {
+                       BUN (*hash)(const void *) = BATatoms[b->ttype].atomHash;
 
-               for (BUN i = 0; i < n; i++)
-                       r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ (ulng) 
(*hash)(BUNtail(bi, i));
-               break;
-       }
+                       for (BUN i = 0; i < n; i++)
+                               r[i] = GDK_ROTATE(h[i], lbit, rbit) ^ (ulng) 
(*hash)(BUNtail(bi, i));
+                       break;
+               }
+               }
        }
        bat_iterator_end(&bi);
        bat_iterator_end(&hbi);
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
@@ -1071,7 +1071,7 @@ cs_update_bat( sql_trans *tr, column_sto
                                bat_destroy(tids);
                        return LOG_ERR;
                }
-       } else if (updates && updates->ttype == TYPE_void) { /* dense later use 
optimized log structure */
+       } else if (updates && updates->ttype == TYPE_void && 
!complex_cand(updates)) { /* dense later use optimized log structure */
                updates = COLcopy(updates, TYPE_oid, true /* make sure we get a 
oid col */, TRANSIENT);
                if (!updates) {
                        if (otids != tids)
@@ -2517,20 +2517,42 @@ load_storage(sql_trans *tr, sql_table *t
                        assert(BATtordered(b));
                        BUN icnt = BATcount(b);
                        BATiter bi = bat_iterator(b);
-                       oid *o = bi.base, n = o[0]+1;
                        size_t lcnt = 1;
-                       for (size_t i=1; i<icnt; i++) {
-                               if (o[i] == n) {
-                                       lcnt++;
-                                       n++;
-                               } else {
-                                       if ((ok = delete_range(tr, t, s, 
n-lcnt, lcnt)) != LOG_OK)
-                                               break;
-                                       lcnt = 0;
+                       oid n;
+                       if (complex_cand(b)) {
+                               oid o = * (oid *) Tpos(&bi, 0);
+                               n = o + 1;
+                               for (BUN i = 1; i < icnt; i++) {
+                                       o = * (oid *) Tpos(&bi, i);
+                                       if (o == n) {
+                                               lcnt++;
+                                               n++;
+                                       } else {
+                                               if ((ok = delete_range(tr, t, 
s, n-lcnt, lcnt)) != LOG_OK)
+                                                       break;
+                                               lcnt = 0;
+                                       }
+                                       if (!lcnt) {
+                                               n = o + 1;
+                                               lcnt = 1;
+                                       }
                                }
-                               if (!lcnt) {
-                                       n = o[i]+1;
-                                       lcnt = 1;
+                       } else {
+                               oid *o = bi.base;
+                               n = o[0] + 1;
+                               for (BUN i = 1; i < icnt; i++) {
+                                       if (o[i] == n) {
+                                               lcnt++;
+                                               n++;
+                                       } else {
+                                               if ((ok = delete_range(tr, t, 
s, n-lcnt, lcnt)) != LOG_OK)
+                                                       break;
+                                               lcnt = 0;
+                                       }
+                                       if (!lcnt) {
+                                               n = o[i]+1;
+                                               lcnt = 1;
+                                       }
                                }
                        }
                        if (lcnt && ok == LOG_OK)
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to