Changeset: 8a8c50beceb1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/8a8c50beceb1 Modified Files: gdk/gdk_aggr.c gdk/gdk_join.c gdk/gdk_select.c Branch: qcancel Log Message:
merge with default diffs (truncated from 1950 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -447,19 +447,20 @@ ssize_t bitToStr(str *dst, size_t *len, ssize_t bteFromStr(const char *src, size_t *len, bte **dst, bool external); ssize_t bteToStr(str *dst, size_t *len, const bte *src, bool external); const bte bte_nil; -oid canditer_idx(struct canditer *ci, BUN p); +oid canditer_idx(const struct canditer *ci, BUN p); BUN canditer_init(struct canditer *ci, BAT *b, BAT *s); -oid canditer_last(struct canditer *ci); +oid canditer_last(const struct canditer *ci); +oid canditer_mask_next(const struct canditer *ci, oid o, bool next); oid canditer_peek(struct canditer *ci); oid canditer_peekprev(struct canditer *ci); oid canditer_prev(struct canditer *ci); void canditer_reset(struct canditer *ci); -BUN canditer_search(struct canditer *ci, oid o, bool next); +BUN canditer_search(const struct canditer *ci, oid o, bool next); void canditer_setidx(struct canditer *ci, BUN p); -BAT *canditer_slice(struct canditer *ci, BUN lo, BUN hi); -BAT *canditer_slice2(struct canditer *ci, BUN lo1, BUN hi1, BUN lo2, BUN hi2); -BAT *canditer_slice2val(struct canditer *ci, oid lo1, oid hi1, oid lo2, oid hi2); -BAT *canditer_sliceval(struct canditer *ci, oid lo, oid hi); +BAT *canditer_slice(const struct canditer *ci, BUN lo, BUN hi); +BAT *canditer_slice2(const struct canditer *ci, BUN lo1, BUN hi1, BUN lo2, BUN hi2); +BAT *canditer_slice2val(const struct canditer *ci, oid lo1, oid hi1, oid lo2, oid hi2); +BAT *canditer_sliceval(const struct canditer *ci, oid lo, oid hi); int closedir(DIR *dir); char *ctime_r(const time_t *restrict, char *restrict); date date_add_day(date dt, int days) __attribute__((__const__)); diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -3895,7 +3895,8 @@ static BAT * doBATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile, bool skip_nils, bool abort_on_error, bool average) { - bool freeb = false, freeg = false; + BAT *origb = b; + BAT *origg = g; oid min, max; BUN ngrp; BUN nils = 0; @@ -3969,12 +3970,10 @@ doBATgroupquantile(BAT *b, BAT *g, BAT * b = BATproject(s, b); if (b == NULL) return NULL; - freeb = true; if (g) { g = BATproject(s, g); if (g == NULL) goto bunins_failed; - freeg = true; } } @@ -3994,27 +3993,25 @@ doBATgroupquantile(BAT *b, BAT *g, BAT * else bn = COLcopy(b, tp, false, TRANSIENT); BAThseqbase(bn, g->tseqbase); /* deals with NULL */ - if (freeb) + if (b != origb) BBPunfix(b->batCacheid); - if (freeg) + if (g != origg) BBPunfix(g->batCacheid); return bn; } if (BATsort(&t1, &t2, NULL, g, NULL, NULL, false, false, false) != GDK_SUCCEED) goto bunins_failed; - if (freeg) + if (g != origg) BBPunfix(g->batCacheid); g = t1; - freeg = true; if (BATsort(&t1, NULL, NULL, b, t2, g, false, false, false) != GDK_SUCCEED) { BBPunfix(t2->batCacheid); goto bunins_failed; } - if (freeb) + if (b != origb) BBPunfix(b->batCacheid); b = t1; - freeb = true; BBPunfix(t2->batCacheid); if (average) @@ -4191,7 +4188,7 @@ doBATgroupquantile(BAT *b, BAT *g, BAT * goto bunins_failed; } - if (freeb) + if (b != origb) BBPunfix(b->batCacheid); bn->tkey = BATcount(bn) <= 1; @@ -4203,15 +4200,15 @@ doBATgroupquantile(BAT *b, BAT *g, BAT * "e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT ",quantile=%g,average=%s -> " ALGOOPTBATFMT "; start " OIDFMT ", count " BUNFMT " (" LLFMT " usec)\n", - ALGOBATPAR(b), ALGOOPTBATPAR(g), ALGOOPTBATPAR(e), + ALGOBATPAR(origb), ALGOOPTBATPAR(origg), ALGOOPTBATPAR(e), ALGOOPTBATPAR(s), quantile, average ? "true" : "false", ALGOOPTBATPAR(bn), ci.seq, ncand, GDKusec() - t0); return bn; bunins_failed: - if (freeb) + if (b && b != origb) BBPunfix(b->batCacheid); - if (freeg) + if (g && g != origg) BBPunfix(g->batCacheid); if (bn) BBPunfix(bn->batCacheid); diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -1673,7 +1673,7 @@ BATkeyed(BAT *b) if ((*cmpf)(prev, cur) == 0) { b->tnokey[0] = p - 1; b->tnokey[1] = p; - TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p - 1, p, BATgetId(b), BATcount(b), GDKusec() - t0); + TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", p - 1, p, ALGOBATPAR(b), GDKusec() - t0); goto doreturn; } prev = cur; @@ -1707,7 +1707,7 @@ BATkeyed(BAT *b) if ((*cmpf)(v, BUNtail(bi, hb - lo)) == 0) { b->tnokey[0] = hb - lo; b->tnokey[1] = p; - TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", hb - lo, p, BATgetId(b), BATcount(b), GDKusec() - t0); + TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", hb - lo, p, ALGOBATPAR(b), GDKusec() - t0); goto doreturn; } } @@ -1751,7 +1751,7 @@ BATkeyed(BAT *b) (*cmpf)(v, BUNtail(bi, hb)) == 0) { b->tnokey[0] = hb; b->tnokey[1] = p; - TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", hb, p, BATgetId(b), BATcount(b), GDKusec() - t0); + TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", hb, p, ALGOBATPAR(b), GDKusec() - t0); goto doreturn_free; } } @@ -1774,36 +1774,51 @@ BATkeyed(BAT *b) return b->tkey; } -#define BAT_ORDERED(TPE) \ +#define BAT_ORDERED(TPE) \ do { \ - const TPE *restrict vals = Tloc(b, 0); \ - for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ - if (vals[p - 1] > vals[p]) { \ - b->tnosorted = p; \ - TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); \ - goto doreturn; \ - } else if (!b->trevsorted && b->tnorevsorted == 0 && vals[p - 1] < vals[p]) { \ - b->tnorevsorted = p; \ - TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); \ - } \ - } \ + const TPE *restrict vals = Tloc(b, 0); \ + for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ + if (vals[p - 1] > vals[p]) { \ + b->tnosorted = p; \ + TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - t0); \ + goto doreturn; \ + } else if (vals[p - 1] < vals[p]) { \ + if (!b->trevsorted && b->tnorevsorted == 0) { \ + b->tnorevsorted = p; \ + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for " ALGOBATFMT "\n", p, ALGOBATPAR(b)); \ + } \ + } else if (!b->tkey && b->tnokey[1] == 0) { \ + b->tnokey[0] = p - 1; \ + b->tnokey[1] = p; \ + TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT") for " ALGOBATFMT "\n", p - 1, p, ALGOBATPAR(b)); \ + } \ + } \ } while (0) -#define BAT_ORDERED_FP(TPE) \ +#define BAT_ORDERED_FP(TPE) \ do { \ - const TPE *restrict vals = Tloc(b, 0); \ - for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ - TPE prev = vals[p - 1], next = vals[p]; \ - int cmp = is_flt_nil(prev) ? -!is_flt_nil(next) : is_flt_nil(next) ? 1 : (prev > next) - (prev < next); \ - if (cmp > 0) { \ - b->tnosorted = p; \ - TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); \ - goto doreturn; \ - } else if (!b->trevsorted && b->tnorevsorted == 0 && cmp < 0) { \ - b->tnorevsorted = p; \ - TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); \ - } \ - } \ + const TPE *restrict vals = Tloc(b, 0); \ + TPE prev = vals[0]; \ + bool prevnil = is_##TPE##_nil(prev); \ + for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ + TPE next = vals[p]; \ + int cmp = prevnil ? -!(prevnil = is_##TPE##_nil(next)) : (prevnil = is_##TPE##_nil(next)) ? 1 : (prev > next) - (prev < next); \ + prev = next; \ + if (cmp > 0) { \ + b->tnosorted = p; \ + TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - t0); \ + goto doreturn; \ + } else if (cmp < 0) { \ + if (!b->trevsorted && b->tnorevsorted == 0) { \ + b->tnorevsorted = p; \ + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for " ALGOBATFMT "\n", p, ALGOBATPAR(b)); \ + } \ + } else if (!b->tkey && b->tnokey[1] == 0) { \ + b->tnokey[0] = p - 1; \ + b->tnokey[1] = p; \ + TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT") for " ALGOBATFMT "\n", p - 1, p, ALGOBATPAR(b)); \ + } \ + } \ } while (0) /* Return whether the BAT is ordered or not. If we don't know, invest @@ -1815,7 +1830,7 @@ BATordered(BAT *b) { lng t0 = GDKusec(); - if (b->ttype == TYPE_void || b->tsorted) + if (b->ttype == TYPE_void || b->tsorted || BATcount(b) == 0) return true; if (b->tnosorted > 0 || !ATOMlinear(b->ttype)) return false; @@ -1859,25 +1874,36 @@ BATordered(BAT *b) int c; if ((c = cmpf(BUNtail(bi, p - 1), BUNtail(bi, p))) > 0) { b->tnosorted = p; - TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); + TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - t0); goto doreturn; - } else if (!b->trevsorted && b->tnorevsorted == 0 && c < 0) { - b->tnorevsorted = p; - TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); + } else if (c < 0) { + if (!b->trevsorted && b->tnorevsorted == 0) { + b->tnorevsorted = p; + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for " ALGOBATFMT "\n", p, ALGOBATPAR(b)); + } + } else if (!b->tkey && b->tnokey[1] == 0) { + b->tnokey[0] = p - 1; + b->tnokey[1] = p; + TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," BUNFMT") for " ALGOBATFMT "\n", p - 1, p, ALGOBATPAR(b)); } } break; } } - /* we only get here if we completed the scan; note - * that if we didn't record evidence about *reverse* + /* we only get here if we completed the scan; note that + * if we didn't record evidence about *reverse* * sortedness, we know that the BAT is also reverse - * sorted */ + * sorted; similarly, if we didn't record evidence about + * keyness, we know the BAT is key */ b->tsorted = true; - TRC_DEBUG(ALGO, "Fixed sorted for %s#" BUNFMT " (" LLFMT " usec)\n", BATgetId(b), BATcount(b), GDKusec() - t0); + TRC_DEBUG(ALGO, "Fixed sorted for " ALGOBATFMT " (" LLFMT " usec)\n", ALGOBATPAR(b), GDKusec() - t0); if (!b->trevsorted && b->tnorevsorted == 0) { b->trevsorted = true; - TRC_DEBUG(ALGO, "Fixed revsorted for %s#" BUNFMT "\n", BATgetId(b), BATcount(b)); + TRC_DEBUG(ALGO, "Fixed revsorted for " ALGOBATFMT "\n", ALGOBATPAR(b)); + } + if (!b->tkey && b->tnokey[1] == 0) { + b->tkey = true; + TRC_DEBUG(ALGO, "Fixed key for " ALGOBATFMT "\n", ALGOBATPAR(b)); } } doreturn: @@ -1885,30 +1911,30 @@ BATordered(BAT *b) return b->tsorted; } -#define BAT_REVORDERED(TPE) \ +#define BAT_REVORDERED(TPE) \ do { \ - const TPE *restrict vals = Tloc(b, 0); \ - for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ - if (vals[p - 1] < vals[p]) { \ - b->tnorevsorted = p; \ - TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); \ - goto doreturn; \ - } \ - } \ + const TPE *restrict vals = Tloc(b, 0); \ + for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ + if (vals[p - 1] < vals[p]) { \ + b->tnorevsorted = p; \ + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - t0); \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list