Changeset: ef12f771922c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef12f771922c Modified Files: gdk/gdk.h gdk/gdk_bat.c gdk/gdk_batop.c gdk/gdk_join.c gdk/gdk_logger.c monetdb5/modules/atoms/json.c monetdb5/modules/mal/tokenizer.c sql/backends/monet5/sql_cast.c sql/storage/bat/bat_logger.c sql/storage/bat/bat_table.c Branch: default Log Message:
New macro: BUNtoid(BAT *b, BUN p). The macro returns the value at BUN position p in the (v)oid BAT b. If b is dense (void or oid), it calculates the value (i.e. doesn't touch the heap for oid). There is no need for an iterator since it doesn't return a pointer to the value. diffs (truncated from 387 to 300 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1229,6 +1229,15 @@ typedef var_t stridx_t; #define BUNtvar(bi,p) (assert((bi).b->ttype && (bi).b->tvarsized), Tbase((bi).b)+BUNtvaroff(bi,p)) #define BUNtail(bi,p) ((bi).b->ttype?(bi).b->tvarsized?BUNtvar(bi,p):BUNtloc(bi,p):BUNtpos(bi,p)) +/* return the oid value at BUN position p from the (v)oid bat b + * works with any TYPE_void or TYPE_oid bat */ +#define BUNtoid(b,p) (assert(ATOMtype((b)->ttype) == TYPE_oid), \ + (is_oid_nil((b)->tseqbase) \ + ? ((b)->ttype == TYPE_void \ + ? (void) (p), oid_nil \ + : ((const oid *) (b)->T.heap.base)[p]) \ + : (oid) ((b)->tseqbase + (BUN) (p)))) + static inline BATiter bat_iterator(BAT *b) { diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -1339,11 +1339,10 @@ gdk_return void_replace_bat(BAT *b, BAT *p, BAT *u, bool force) { BUN r, s; - BATiter uii = bat_iterator(p); BATiter uvi = bat_iterator(u); BATloop(u, r, s) { - oid updid = *(oid *) BUNtail(uii, r); + oid updid = BUNtoid(p, r); const void *val = BUNtail(uvi, r); if (void_inplace(b, updid, val, force) != GDK_SUCCEED) diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -705,7 +705,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bool f if (b->ttype != TYPE_void && b->tsorted && BATtdense(b) && (BATtdense(n) == 0 || cand != NULL || - 1 + *(oid *) BUNtloc(bi, last) != *(oid *) BUNtail(ni, start))) { + 1 + *(oid *) BUNtloc(bi, last) != BUNtoid(n, start))) { b->tseqbase = oid_nil; } b->tnonil &= n->tnonil; @@ -2050,7 +2050,6 @@ BATmergecand(BAT *a, BAT *b) const oid *restrict ap, *restrict bp, *ape, *bpe; oid *restrict p, i; oid af, al, bf, bl; - BATiter ai, bi; bit ad, bd; BATcheck(a, "BATmergecand", NULL); @@ -2072,12 +2071,10 @@ BATmergecand(BAT *a, BAT *b) return COLcopy(a, a->ttype, false, TRANSIENT); } /* we can return a if a fully covers b (and v.v) */ - ai = bat_iterator(a); - bi = bat_iterator(b); - af = *(oid*) BUNtail(ai, 0); - bf = *(oid*) BUNtail(bi, 0); - al = *(oid*) BUNtail(ai, BUNlast(a) - 1); - bl = *(oid*) BUNtail(bi, BUNlast(b) - 1); + af = BUNtoid(a, 0); + bf = BUNtoid(b, 0); + al = BUNtoid(a, BUNlast(a) - 1); + bl = BUNtoid(b, BUNlast(b) - 1); ad = (af + BATcount(a) - 1 == al); /* i.e., dense */ bd = (bf + BATcount(b) - 1 == bl); /* i.e., dense */ if (ad && bd) { @@ -2181,7 +2178,6 @@ BATintersectcand(BAT *a, BAT *b) const oid *restrict ap, *restrict bp, *ape, *bpe; oid *restrict p; oid af, al, bf, bl; - BATiter ai, bi; BATcheck(a, "BATintersectcand", NULL); BATcheck(b, "BATintersectcand", NULL); @@ -2198,12 +2194,10 @@ BATintersectcand(BAT *a, BAT *b) return newdensecand(0, 0); } - ai = bat_iterator(a); - bi = bat_iterator(b); - af = *(oid*) BUNtail(ai, 0); - bf = *(oid*) BUNtail(bi, 0); - al = *(oid*) BUNtail(ai, BUNlast(a) - 1); - bl = *(oid*) BUNtail(bi, BUNlast(b) - 1); + af = BUNtoid(a, 0); + bf = BUNtoid(b, 0); + al = BUNtoid(a, BUNlast(a) - 1); + bl = BUNtoid(b, BUNlast(b) - 1); if ((af + BATcount(a) - 1 == al) && (bf + BATcount(b) - 1 == bl)) { /* both lists are VOID */ diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c --- a/gdk/gdk_join.c +++ b/gdk/gdk_join.c @@ -2538,7 +2538,7 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT * BUN rstart, rend, rcnt; const oid *rcand = NULL, *rcandend = NULL; oid lo, ro; - BATiter ri, sri; + BATiter ri; BUN rb; BUN rl, rh; oid rseq; @@ -2643,7 +2643,6 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT * hsh = r->thash; } ri = bat_iterator(r); - sri = bat_iterator(sr); t = ATOMbasetype(r->ttype); if (lcand) { @@ -2662,7 +2661,7 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT * for (rb = HASHget(hsh, HASHprobe(hsh, v)); rb != HASHnil(hsh); rb = HASHgetlink(hsh, rb)) { - ro = * (const oid *) BUNtail(sri, rb); + ro = BUNtoid(sr, rb); if ((*cmp)(v, BUNtail(ri, ro - r->hseqbase)) != 0) continue; if (only_misses) { @@ -2793,7 +2792,7 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT * for (rb = HASHget(hsh, HASHprobe(hsh, v)); rb != HASHnil(hsh); rb = HASHgetlink(hsh, rb)) { - ro = * (const oid *) BUNtail(sri, rb); + ro = BUNtoid(sr, rb); if ((*cmp)(v, BUNtail(ri, ro - r->hseqbase)) != 0) continue; if (only_misses) { diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -580,11 +580,10 @@ la_bat_updates(logger *lg, logaction *la } } else if (la->type == LOG_UPDATE) { BATiter vi = bat_iterator(la->b); - BATiter ii = bat_iterator(la->uid); BUN p, q; BATloop(la->b, p, q) { - oid h = * (const oid *) BUNtail(ii, p); + oid h = BUNtoid(la->uid, p); const void *t = BUNtail(vi, p); if (h < b->hseqbase || h >= b->hseqbase + BATcount(b)) { @@ -2643,7 +2642,6 @@ log_delta(logger *lg, BAT *uid, BAT *uva lg->changes += l.nr; if (l.nr) { - BATiter ii = bat_iterator(uid); BATiter vi = bat_iterator(uval); gdk_return (*wh) (const void *, stream *, size_t) = BATatoms[TYPE_oid].atomWrite; gdk_return (*wt) (const void *, stream *, size_t) = BATatoms[uval->ttype].atomWrite; @@ -2654,10 +2652,10 @@ log_delta(logger *lg, BAT *uid, BAT *uva return GDK_FAIL; for (p = 0; p < BUNlast(uid) && ok == GDK_SUCCEED; p++) { - const void *id = BUNtail(ii, p); + const oid id = BUNtoid(uid, p); const void *val = BUNtail(vi, p); - ok = wh(id, lg->log, 1); + ok = wh(&id, lg->log, 1); if (ok == GDK_SUCCEED) ok = wt(val, lg->log, 1); } diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c --- a/monetdb5/modules/atoms/json.c +++ b/monetdb5/modules/atoms/json.c @@ -1807,7 +1807,7 @@ static str JSONfoldKeyValue(str *ret, const bat *id, const bat *key, const bat *values) { BAT *bo = 0, *bk = 0, *bv; - BATiter boi, bki, bvi; + BATiter bki, bvi; int tpe; char *row, *val = 0, *nme = 0; BUN i, cnt; @@ -1851,17 +1851,15 @@ JSONfoldKeyValue(str *ret, const bat *id row[1] = 0; len = 1; if (id) { - boi = bat_iterator(bo); - o = *(oid *) BUNtail(boi, 0); + o = BUNtoid(bo, 0); } for (i = 0; i < cnt; i++) { if (id && bk) { - p = BUNtail(boi, i); - if (*(oid *) p != o) { + if (BUNtoid(bo, i) != o) { snprintf(row + len, lim - len, ", "); len += 2; - o = *(oid *) p; + o = BUNtoid(bo, i); } } diff --git a/monetdb5/modules/mal/tokenizer.c b/monetdb5/modules/mal/tokenizer.c --- a/monetdb5/modules/mal/tokenizer.c +++ b/monetdb5/modules/mal/tokenizer.c @@ -65,12 +65,11 @@ static char name[128]; static int prvlocate(BAT* b, BAT* bidx, oid *prv, str part) { BATiter bi = bat_iterator(b); - BATiter biidx = bat_iterator(bidx); BUN p; if (BAThash(b) == GDK_SUCCEED) { HASHloop_str(bi, b->thash, p, part) { - if (*((oid *) BUNtail(biidx, p)) == *prv) { + if (BUNtoid(bidx, p) == *prv) { *prv = (oid) p; return TRUE; } @@ -80,7 +79,7 @@ static int prvlocate(BAT* b, BAT* bidx, BUN q; BATloop(b, p, q) { - if (*((oid *) BUNtail(biidx, p)) == *prv && + if (BUNtoid(bidx, p) == *prv && strcmp(BUNtail(bi, p), part) == 0) { *prv = (oid) p; return TRUE; @@ -522,7 +521,6 @@ takeOid(oid id, str *val) str parts[MAX_TKNZR_DEPTH]; size_t lngth = 0; str s; - BATiter biidx; /* Iterator for index bat */ if (id >= BATcount(tokenBAT[INDEX].val)) { throw(MAL, "tokenizer.takeOid", OPERATION_FAILED " illegal oid"); @@ -535,9 +533,8 @@ takeOid(oid id, str *val) for (i = depth - 1; i >= 0; i--) { BATiter bi = bat_iterator(tokenBAT[i].val); - biidx = bat_iterator(tokenBAT[i].idx); parts[i] = (str) BUNtvar(bi, id); - id = *(oid *) BUNtail(biidx, id); + id = BUNtoid(tokenBAT[i].idx, id); lngth += strlen(parts[i]); } diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c --- a/sql/backends/monet5/sql_cast.c +++ b/sql/backends/monet5/sql_cast.c @@ -101,7 +101,7 @@ batstr_2_timestamp(bat *res, const bat * throw(SQL, "sql.2_timestamp", SQLSTATE(HY001) MAL_MALLOC_FAIL); } BATloop(b, p, q) { - str v = (str) BUNtail(bi, p); + str v = (str) BUNtvar(bi, p); timestamp r; msg = str_2_timestamp(&r, &v); if (msg) { @@ -196,7 +196,7 @@ batstr_2_daytime(bat *res, const bat *bi throw(SQL, "sql.2_daytime", SQLSTATE(HY001) MAL_MALLOC_FAIL); } BATloop(b, p, q) { - str v = (str) BUNtail(bi, p); + str v = (str) BUNtvar(bi, p); daytime r; msg = str_2_daytime(&r, &v); if (msg) { @@ -304,7 +304,7 @@ batstr_2_date(bat *res, const bat *bid) throw(SQL, "sql.2_date", SQLSTATE(HY001) MAL_MALLOC_FAIL); } BATloop(b, p, q) { - str v = (str) BUNtail(bi, p); + str v = (str) BUNtvar(bi, p); date r; msg = str_2_date(&r, &v); if (msg) { @@ -373,7 +373,7 @@ batstr_2_sqlblob(bat *res, const bat *bi throw(SQL, "sql.2_sqlblob", SQLSTATE(HY001) MAL_MALLOC_FAIL); } BATloop(b, p, q) { - str v = (str) BUNtail(bi, p); + str v = (str) BUNtvar(bi, p); sqlblob *r; msg = str_2_sqlblob(&r, &v); if (msg) { diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c --- a/sql/storage/bat/bat_logger.c +++ b/sql/storage/bat/bat_logger.c @@ -74,8 +74,7 @@ find_table_id(logger *lg, const char *va bat_destroy(s); return 0; } - bi = bat_iterator(s); - o = * (const oid *) BUNtail(bi, 0); + o = BUNtoid(s, 0); bat_destroy(s); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list