Changeset: ca0392d75ac5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ca0392d75ac5 Modified Files: gdk/gdk_project.c Branch: candidate-exceptions Log Message:
Accept candidates with exceptions in BATprojectchain. diffs (227 lines): diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c --- a/gdk/gdk_project.c +++ b/gdk/gdk_project.c @@ -416,6 +416,7 @@ BATprojectchain(BAT **bats) BAT *b; /* the BAT */ oid hlo; /* lowest allowed oid to index the BAT */ BUN cnt; /* size of allowed index range */ + struct canditer ci; /* candidate iterator for cand w/ except. */ } *ba; int i, n, tpe; BAT *b, *bn; @@ -431,7 +432,7 @@ BATprojectchain(BAT **bats) * temporary work space */ for (n = 0; bats[n]; n++) ; - ba = GDKmalloc(sizeof(*ba) * n); + ba = GDKzalloc(sizeof(*ba) * n); if (ba == NULL) return NULL; b = *bats++; @@ -444,7 +445,7 @@ BATprojectchain(BAT **bats) issorted &= b->tsorted; if (!allnil) { if (n > 0 && ba[i-1].vals == NULL) { - /* previous BAT was dense-tailed: we will + /* previous BAT was dense: we will * combine it with this one */ i--; assert(off == 0); @@ -483,6 +484,11 @@ BATprojectchain(BAT **bats) is_oid_nil(b->tseqbase)) { tseq = oid_nil; allnil = true; + } else if (b->ttype == TYPE_void) { + assert(b->tvheap != NULL); + canditer_init(&ba[i].ci, NULL, b); + /* make sure .vals != NULL */ + ba[i].vals = ba[i].ci.oids; } else ba[i].vals = (const oid *) Tloc(b, off); } @@ -498,7 +504,11 @@ BATprojectchain(BAT **bats) if (b->ttype == TYPE_void && is_oid_nil(b->tseqbase)) allnil = true; - else + else if (b->ttype == TYPE_void) { + assert(b->tvheap != NULL); + /* make sure .vals != NULL */ + ba[i].vals = (const oid *) b->tvheap->base; + } else ba[i].vals = (const oid *) Tloc(b, 0); } } @@ -587,19 +597,19 @@ BATprojectchain(BAT **bats) offset = (lng) tseq - (lng) ba[n].hlo; ba[n].cnt += ba[n].hlo; /* upper bound of last BAT */ for (p = 0; p < cnt; p++) { - o = ba[0].vals[p]; + o = ba[0].ci.oids ? canditer_next(&ba[0].ci) : ba[0].vals[p]; for (i = 1; i < n; i++) { + if (is_oid_nil(o)) { + bn->tnil = true; + o = oid_nil; + break; + } o -= ba[i].hlo; if (o >= ba[i].cnt) { - if (o == oid_nil - ba[i].hlo) { - bn->tnil = true; - o = oid_nil; - break; - } GDKerror("BATprojectchain: does not match always\n"); goto bunins_failed; } - o = ba[i].vals[o]; + o = ba[i].ci.oids ? canditer_idx(&ba[i].ci, (BUN) o) : ba[i].vals[o]; } if (is_oid_nil(o)) { *v++ = *(oid *) nil; @@ -614,19 +624,19 @@ BATprojectchain(BAT **bats) } else { /* last BAT is materialized */ for (p = 0; p < cnt; p++) { - o = ba[0].vals[p]; + o = ba[0].ci.oids ? canditer_next(&ba[0].ci) : ba[0].vals[p]; for (i = 1; i <= n; i++) { /* note "<=" */ + if (is_oid_nil(o)) { + bn->tnil = true; + o = oid_nil; + break; + } o -= ba[i].hlo; if (o >= ba[i].cnt) { - if (o == oid_nil - ba[i].hlo) { - bn->tnil = true; - o = oid_nil; - break; - } GDKerror("BATprojectchain: does not match always\n"); goto bunins_failed; } - o = ba[i].vals[o]; + o = ba[i].ci.oids ? canditer_idx(&ba[i].ci, (BUN) o) : ba[i].vals[o]; } *v++ = (is_oid_nil(o)) & !stringtrick ? *(oid *) nil : o; } @@ -638,19 +648,19 @@ BATprojectchain(BAT **bats) OTPE *restrict dst = (OTPE *) Tloc(bn, 0); for (p = 0; p < cnt; p++) { - o = ba[0].vals[p]; + o = ba[0].ci.oids ? canditer_next(&ba[0].ci) : ba[0].vals[p]; for (i = 1; i < n; i++) { + if (is_oid_nil(o)) { + bn->tnil = true; + o = oid_nil; + break; + } o -= ba[i].hlo; if (o >= ba[i].cnt) { - if (o == oid_nil - ba[i].hlo) { - bn->tnil = true; - o = oid_nil; - break; - } GDKerror("BATprojectchain: does not match always\n"); goto bunins_failed; } - o = ba[i].vals[o]; + o = ba[i].ci.oids ? canditer_idx(&ba[i].ci, (BUN) o) : ba[i].vals[o]; } if (is_oid_nil(o)) { *dst++ = * (OTPE *) nil; @@ -666,26 +676,27 @@ BATprojectchain(BAT **bats) } else if (ATOMvarsized(tpe)) { /* generic code for var-sized atoms */ BATiter bi = bat_iterator(b); - const void *v = nil; /* make compiler happy with init */ + const void *v; assert(!stringtrick); for (p = 0; p < cnt; p++) { - o = ba[0].vals[p]; + o = ba[0].ci.oids ? canditer_next(&ba[0].ci) : ba[0].vals[p]; for (i = 1; i < n; i++) { + if (is_oid_nil(o)) { + bn->tnil = true; + o = oid_nil; + break; + } o -= ba[i].hlo; if (o >= ba[i].cnt) { - if (o == oid_nil - ba[i].hlo) { - bn->tnil = true; - v = nil; - o = oid_nil; - break; - } GDKerror("BATprojectchain: does not match always\n"); goto bunins_failed; } - o = ba[i].vals[o]; + o = ba[i].ci.oids ? canditer_idx(&ba[i].ci, (BUN) o) : ba[i].vals[o]; } - if (!is_oid_nil(o)) { + if (is_oid_nil(o)) { + v = nil; + } else { o -= ba[n].hlo; if (o >= ba[n].cnt) { GDKerror("BATprojectchain: does not match always\n"); @@ -698,25 +709,26 @@ BATprojectchain(BAT **bats) } else { /* generic code for fixed-sized atoms */ BATiter bi = bat_iterator(b); - const void *v = nil; /* make compiler happy with init */ + const void *v; for (p = 0; p < cnt; p++) { - o = ba[0].vals[p]; + o = ba[0].ci.oids ? canditer_next(&ba[0].ci) : ba[0].vals[p]; for (i = 1; i < n; i++) { + if (is_oid_nil(o)) { + bn->tnil = true; + o = oid_nil; + break; + } o -= ba[i].hlo; if (o >= ba[i].cnt) { - if (o == oid_nil - ba[i].hlo) { - bn->tnil = true; - v = nil; - o = oid_nil; - break; - } GDKerror("BATprojectchain: does not match always\n"); goto bunins_failed; } - o = ba[i].vals[o]; + o = ba[i].ci.oids ? canditer_idx(&ba[i].ci, (BUN) o) : ba[i].vals[o]; } - if (!is_oid_nil(o)) { + if (is_oid_nil(o)) { + v = nil; + } else { o -= ba[n].hlo; if (o >= ba[n].cnt) { GDKerror("BATprojectchain: does not match always\n"); @@ -724,16 +736,7 @@ BATprojectchain(BAT **bats) } v = BUNtloc(bi, o + off); } - if (BATcount(bn) >= BATcapacity(bn)) { - if (BATcount(bn) == BUN_MAX) { - GDKerror("BATprojectchain: too many elements to accomodate (" BUNFMT ")\n", BUN_MAX); - goto bunins_failed; - } - if (BATextend(bn, BATgrows(bn)) != GDK_SUCCEED) - goto bunins_failed; - } bn->theap.free += Tsize(bn); - bn->theap.dirty |= Tsize(bn) != 0; ATOMputFIX(bn->ttype, Tloc(bn, bn->batCount), v); bn->batCount++; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list