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