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 -- [email protected]
To unsubscribe send an email to [email protected]