Changeset: 7d8379a3a118 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7d8379a3a118 Modified Files: gdk/gdk_aggr.c gdk/gdk_bat.c gdk/gdk_batop.c gdk/gdk_bbp.c gdk/gdk_storage.c sql/backends/monet5/dict.c Branch: Jun2023 Log Message:
Fix a bunch of properties and concurrency issues. diffs (truncated from 558 to 300 lines): diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -3817,9 +3817,18 @@ BATmax_skipnil(BAT *b, void *aggr, bit s if (BATordered(b)) { pos = bi.count - 1 + b->hseqbase; + if (skipnil && !bi.nonil && + ATOMcmp(bi.type, BUNtail(bi, bi.count - 1), + ATOMnilptr(bi.type)) == 0) + goto slow; } else if (BATordered_rev(b)) { pos = b->hseqbase; + if (skipnil && !bi.nonil && + ATOMcmp(bi.type, BUNtail(bi, 0), + ATOMnilptr(bi.type)) == 0) + goto slow; } else { + slow: if (BATcheckorderidx(b)) { MT_lock_set(&b->batIdxLock); oidxh = b->torderidx; diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -1097,152 +1097,8 @@ BUNappendmulti(BAT *b, const void *value return rc; } + const void *t = b->ttype == TYPE_msk ? &(msk){false} : ATOMnilptr(b->ttype); MT_lock_set(&b->theaplock); - if (count > BATcount(b) / gdk_unique_estimate_keep_fraction) - b->tunique_est = 0; - - const void *t = b->ttype == TYPE_msk ? &(msk){false} : ATOMnilptr(b->ttype); - if (b->ttype == TYPE_oid) { - /* spend extra effort on oid (possible candidate list) */ - if (values == NULL || is_oid_nil(((oid *) values)[0])) { - b->tnil = true; - b->tnonil = false; - b->tsorted = false; - b->trevsorted = false; - b->tkey = false; - b->tseqbase = oid_nil; - } else { - if (b->batCount == 0) { - b->tsorted = true; - b->trevsorted = true; - b->tkey = true; - b->tseqbase = count == 1 ? ((oid *) values)[0] : oid_nil; - b->tnil = false; - b->tnonil = true; - } else { - if (!is_oid_nil(b->tseqbase) && - (count > 1 || - b->tseqbase + b->batCount != ((oid *) values)[0])) - b->tseqbase = oid_nil; - if (b->tsorted && ((oid *) b->theap->base)[b->batCount - 1] > ((oid *) values)[0]) { - b->tsorted = false; - if (b->tnosorted == 0) - b->tnosorted = b->batCount; - } - if (b->trevsorted && ((oid *) b->theap->base)[b->batCount - 1] < ((oid *) values)[0]) { - b->trevsorted = false; - if (b->tnorevsorted == 0) - b->tnorevsorted = b->batCount; - } - if (b->tkey) { - if (((oid *) b->theap->base)[b->batCount - 1] == ((oid *) values)[0]) { - b->tkey = false; - if (b->tnokey[1] == 0) { - b->tnokey[0] = b->batCount - 1; - b->tnokey[1] = b->batCount; - } - } else if (!b->tsorted && !b->trevsorted) - b->tkey = false; - } - } - for (BUN i = 1; i < count; i++) { - if (is_oid_nil(((oid *) values)[i])) { - b->tnil = true; - b->tnonil = false; - b->tsorted = false; - b->trevsorted = false; - b->tkey = false; - b->tseqbase = oid_nil; - break; - } - if (((oid *) values)[i - 1] == ((oid *) values)[i]) { - b->tkey = false; - if (b->tnokey[1] == 0) { - b->tnokey[0] = b->batCount + i - 1; - b->tnokey[1] = b->batCount + i; - } - } else if (((oid *) values)[i - 1] > ((oid *) values)[i]) { - b->tsorted = false; - if (b->tnosorted == 0) - b->tnosorted = b->batCount + i; - if (!b->trevsorted) - b->tkey = false; - } else { - if (((oid *) values)[i - 1] + 1 != ((oid *) values)[i]) - b->tseqbase = oid_nil; - b->trevsorted = false; - if (b->tnorevsorted == 0) - b->tnorevsorted = b->batCount + i; - if (!b->tsorted) - b->tkey = false; - } - } - } - } else if (!ATOMlinear(b->ttype)) { - b->tnil = b->tnonil = false; - b->tsorted = b->trevsorted = b->tkey = false; - } else if (b->batCount == 0) { - if (values == NULL) { - b->tsorted = b->trevsorted = true; - b->tkey = count == 1; - b->tnil = true; - b->tnonil = false; - b->tunique_est = 1; - } else { - int c; - b->tnil = b->tnonil = false; - switch (count) { - case 1: - b->tsorted = b->trevsorted = b->tkey = true; - b->tunique_est = 1; - break; - case 2: - if (b->tvheap) - c = ATOMcmp(b->ttype, - ((void **) values)[0], - ((void **) values)[1]); - else - c = ATOMcmp(b->ttype, - values, - (char *) values + b->twidth); - b->tsorted = c <= 0; - b->tnosorted = !b->tsorted; - b->trevsorted = c >= 0; - b->tnorevsorted = !b->trevsorted; - b->tkey = c != 0; - b->tnokey[0] = 0; - b->tnokey[1] = !b->tkey; - b->tunique_est = (double) (1 + b->tkey); - break; - default: - b->tsorted = b->trevsorted = b->tkey = false; - break; - } - } - } else if (b->batCount == 1 && count == 1) { - BATiter bi = bat_iterator_nolock(b); - if (values != NULL) { - if (b->tvheap) - t = ((void **) values)[0]; - else - t = values; - } - int c = ATOMcmp(b->ttype, BUNtail(bi, 0), t); - b->tsorted = c <= 0; - b->tnosorted = !b->tsorted; - b->trevsorted = c >= 0; - b->tnorevsorted = !b->trevsorted; - b->tkey = c != 0; - b->tnokey[0] = 0; - b->tnokey[1] = !b->tkey; - b->tunique_est = (double) (1 + b->tkey); - b->tnil |= values == NULL; - b->tnonil = false; - } else { - b->tnil |= values == NULL; - b->tnonil = false; - b->tsorted = b->trevsorted = b->tkey = false; - } BATiter bi = bat_iterator_nolock(b); MT_lock_unset(&b->theaplock); MT_rwlock_wrlock(&b->thashlock); @@ -1373,6 +1229,151 @@ BUNappendmulti(BAT *b, const void *value nunique = b->thash ? b->thash->nunique : 0; } MT_lock_set(&b->theaplock); + if (count > BATcount(b) / gdk_unique_estimate_keep_fraction) + b->tunique_est = 0; + + if (b->ttype == TYPE_oid) { + /* spend extra effort on oid (possible candidate list) */ + if (values == NULL || is_oid_nil(((oid *) values)[0])) { + b->tnil = true; + b->tnonil = false; + b->tsorted = false; + b->trevsorted = false; + b->tkey = false; + b->tseqbase = oid_nil; + } else { + if (b->batCount == 0) { + b->tsorted = true; + b->trevsorted = true; + b->tkey = true; + b->tseqbase = count == 1 ? ((oid *) values)[0] : oid_nil; + b->tnil = false; + b->tnonil = true; + } else { + if (!is_oid_nil(b->tseqbase) && + (count > 1 || + b->tseqbase + b->batCount != ((oid *) values)[0])) + b->tseqbase = oid_nil; + if (b->tsorted && ((oid *) b->theap->base)[b->batCount - 1] > ((oid *) values)[0]) { + b->tsorted = false; + if (b->tnosorted == 0) + b->tnosorted = b->batCount; + } + if (b->trevsorted && ((oid *) b->theap->base)[b->batCount - 1] < ((oid *) values)[0]) { + b->trevsorted = false; + if (b->tnorevsorted == 0) + b->tnorevsorted = b->batCount; + } + if (b->tkey) { + if (((oid *) b->theap->base)[b->batCount - 1] == ((oid *) values)[0]) { + b->tkey = false; + if (b->tnokey[1] == 0) { + b->tnokey[0] = b->batCount - 1; + b->tnokey[1] = b->batCount; + } + } else if (!b->tsorted && !b->trevsorted) + b->tkey = false; + } + } + for (BUN i = 1; i < count; i++) { + if (is_oid_nil(((oid *) values)[i])) { + b->tnil = true; + b->tnonil = false; + b->tsorted = false; + b->trevsorted = false; + b->tkey = false; + b->tseqbase = oid_nil; + break; + } + if (((oid *) values)[i - 1] == ((oid *) values)[i]) { + b->tkey = false; + if (b->tnokey[1] == 0) { + b->tnokey[0] = b->batCount + i - 1; + b->tnokey[1] = b->batCount + i; + } + } else if (((oid *) values)[i - 1] > ((oid *) values)[i]) { + b->tsorted = false; + if (b->tnosorted == 0) + b->tnosorted = b->batCount + i; + if (!b->trevsorted) + b->tkey = false; + } else { + if (((oid *) values)[i - 1] + 1 != ((oid *) values)[i]) + b->tseqbase = oid_nil; + b->trevsorted = false; + if (b->tnorevsorted == 0) + b->tnorevsorted = b->batCount + i; + if (!b->tsorted) + b->tkey = false; + } + } + } + } else if (!ATOMlinear(b->ttype)) { + b->tnil = b->tnonil = false; + b->tsorted = b->trevsorted = b->tkey = false; + } else if (b->batCount == 0) { + if (values == NULL) { + b->tsorted = b->trevsorted = true; + b->tkey = count == 1; + b->tnil = true; + b->tnonil = false; + b->tunique_est = 1; + } else { + int c; + b->tnil = b->tnonil = false; + switch (count) { + case 1: + b->tsorted = b->trevsorted = b->tkey = true; + b->tunique_est = 1; + break; + case 2: + if (b->tvheap) + c = ATOMcmp(b->ttype, + ((void **) values)[0], + ((void **) values)[1]); + else + c = ATOMcmp(b->ttype, + values, + (char *) values + b->twidth); + b->tsorted = c <= 0; + b->tnosorted = !b->tsorted; + b->trevsorted = c >= 0; + b->tnorevsorted = !b->trevsorted; + b->tkey = c != 0; + b->tnokey[0] = 0; + b->tnokey[1] = !b->tkey; + b->tunique_est = (double) (1 + b->tkey); + break; + default: + b->tsorted = b->trevsorted = b->tkey = false; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org