Changeset: d53e6dec5173 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d53e6dec5173 Added Files: sql/test/out2in/Tests/All sql/test/out2in/Tests/out2in.sql sql/test/out2in/Tests/out2in.stable.err sql/test/out2in/Tests/out2in.stable.out Modified Files: sql/backends/monet5/sql_subquery.c sql/backends/monet5/sql_upgrades.c sql/common/sql_types.c sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_out2inner_join.txt sql/storage/bat/bat_logger.c sql/test/Tests/50ways.stable.out sql/test/osm/Tests/drop_constraint_bug.stable.out sql/test/subquery/Tests/correlated.stable.out sql/test/subquery/Tests/subquery5.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out.int128 Branch: mbedded Log Message:
Merge with default branch. diffs (truncated from 1347 to 300 lines): diff --git a/sql/backends/monet5/sql_subquery.c b/sql/backends/monet5/sql_subquery.c --- a/sql/backends/monet5/sql_subquery.c +++ b/sql/backends/monet5/sql_subquery.c @@ -287,6 +287,17 @@ SQLall_grp(bat *ret, const bat *bid, con return MAL_SUCCEED; } +#define SQLnil_imp(TPE) \ + do { \ + TPE *restrict bp = (TPE*)Tloc(b, 0); \ + for (BUN q = 0; q < o; q++) { \ + if (is_##TPE##_nil(bp[q])) { \ + *ret = TRUE; \ + break; \ + } \ + } \ + } while (0) + str SQLnil(bit *ret, const bat *bid) { @@ -299,25 +310,65 @@ SQLnil(bit *ret, const bat *bid) if (BATcount(b) == 0) *ret = bit_nil; if (BATcount(b) > 0) { - BUN q, o; - int (*ocmp) (const void *, const void *); - BATiter bi = bat_iterator(b); - const void *nilp = ATOMnilptr(b->ttype); + BUN o = BUNlast(b); - o = BUNlast(b); - ocmp = ATOMcompare(b->ttype); - for (q = 0; q < o; q++) { - const void *c = BUNtail(bi, q); - if (ocmp(nilp, c) == 0) { - *ret = TRUE; - break; + switch (b->ttype) { + case TYPE_bit: + SQLnil_imp(bit); + break; + case TYPE_bte: + SQLnil_imp(bte); + break; + case TYPE_sht: + SQLnil_imp(sht); + break; + case TYPE_int: + SQLnil_imp(int); + break; + case TYPE_lng: + SQLnil_imp(lng); + break; +#ifdef HAVE_HGE + case TYPE_hge: + SQLnil_imp(hge); + break; +#endif + case TYPE_flt: + SQLnil_imp(flt); + break; + case TYPE_dbl: + SQLnil_imp(dbl); + break; + default: { + int (*ocmp) (const void *, const void *) = ATOMcompare(b->ttype); + const void *restrict nilp = ATOMnilptr(b->ttype); + BATiter bi = bat_iterator(b); + + for (BUN q = 0; q < o; q++) { + const void *restrict c = BUNtail(bi, q); + if (ocmp(nilp, c) == 0) { + *ret = TRUE; + break; + } } } + } } BBPunfix(b->batCacheid); return MAL_SUCCEED; } +#define SQLnil_grp_imp(TPE) \ + do { \ + TPE *restrict lp = (TPE*)Tloc(l, 0); \ + for (BUN q = offset, s = 0; s < o; q++, s++) { \ + TPE lv = lp[q]; \ + oid id = *(oid*)BUNtail(gi, s); \ + if (ret[id] != TRUE && is_##TPE##_nil(lv)) \ + ret[id] = TRUE; \ + } \ + } while (0) + str SQLnil_grp(bat *ret, const bat *bid, const bat *gp, const bat *gpe, bit *no_nil) { @@ -347,27 +398,51 @@ SQLnil_grp(bat *ret, const bat *bid, con BAThseqbase(res, e->hseqbase); offset = g->hseqbase - l->hseqbase; if (BATcount(g) > 0) { - BUN q, o, s; - int (*ocmp) (const void *, const void *); - BATiter li = bat_iterator(l); + bit *restrict ret = (bit*)Tloc(res, 0); BATiter gi = bat_iterator(g); - BATiter rt = bat_iterator(res); - - bit *ret = BUNtail(rt, 0); - const void *nilp = ATOMnilptr(l->ttype); + BUN o = BUNlast(g); - o = BUNlast(g); - ocmp = ATOMcompare(l->ttype); - for (q = offset, s = 0; s < o; q++, s++) { - const void *lv = BUNtail(li, q); - oid id = *(oid*)BUNtail(gi, s); + switch (l->ttype) { + case TYPE_bit: + SQLnil_grp_imp(bit); + break; + case TYPE_bte: + SQLnil_grp_imp(bte); + break; + case TYPE_sht: + SQLnil_grp_imp(sht); + break; + case TYPE_int: + SQLnil_grp_imp(int); + break; + case TYPE_lng: + SQLnil_grp_imp(lng); + break; +#ifdef HAVE_HGE + case TYPE_hge: + SQLnil_grp_imp(hge); + break; +#endif + case TYPE_flt: + SQLnil_grp_imp(flt); + break; + case TYPE_dbl: + SQLnil_grp_imp(dbl); + break; + default: { + int (*ocmp) (const void *, const void *) = ATOMcompare(l->ttype); + const void *restrict nilp = ATOMnilptr(l->ttype); + BATiter li = bat_iterator(l); - if (ret[id] != TRUE) { - if (ocmp(lv, nilp) == 0) { + for (BUN q = offset, s = 0; s < o; q++, s++) { + const void *restrict lv = BUNtail(li, q); + const oid id = *(oid*)BUNtail(gi, s); + + if (ret[id] != TRUE && ocmp(lv, nilp) == 0) ret[id] = TRUE; - } } } + } } res->hseqbase = g->hseqbase; res->tnil = 0; @@ -409,11 +484,24 @@ SQLall_cmp(bit *ret, const bit *cmp, con return MAL_SUCCEED; } +#define SQLanyequal_or_not_imp(TPE, OUTPUT) \ + do { \ + TPE *rp = (TPE*)Tloc(r, 0), *lp = (TPE*)Tloc(l, 0), p = lp[0]; \ + for (BUN q = 0; q < o; q++) { \ + TPE c = rp[q]; \ + if (is_##TPE##_nil(c)) { \ + *ret = bit_nil; \ + } else if (p == c) { \ + *ret = OUTPUT; \ + break; \ + } \ + } \ + } while (0) + str SQLanyequal(bit *ret, const bat *bid1, const bat *bid2) { BAT *l, *r; - const void *p; if ((l = BATdescriptor(*bid1)) == NULL) { throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); @@ -424,30 +512,75 @@ SQLanyequal(bit *ret, const bat *bid1, c } *ret = FALSE; if (BATcount(r) > 0) { - BUN q, o; - int (*ocmp) (const void *, const void *); - BATiter li = bat_iterator(l); - BATiter ri = bat_iterator(r); - const void *nilp = ATOMnilptr(l->ttype); + BUN o = BUNlast(r); - o = BUNlast(r); - p = BUNtail(li, 0); - ocmp = ATOMcompare(l->ttype); - for (q = 0; q < o; q++) { - const void *c = BUNtail(ri, q); - if (ocmp(nilp, c) == 0) - *ret = bit_nil; - else if (ocmp(p, c) == 0) { - *ret = TRUE; - break; + switch (l->ttype) { + case TYPE_bit: + SQLanyequal_or_not_imp(bit, TRUE); + break; + case TYPE_bte: + SQLanyequal_or_not_imp(bte, TRUE); + break; + case TYPE_sht: + SQLanyequal_or_not_imp(sht, TRUE); + break; + case TYPE_int: + SQLanyequal_or_not_imp(int, TRUE); + break; + case TYPE_lng: + SQLanyequal_or_not_imp(lng, TRUE); + break; +#ifdef HAVE_HGE + case TYPE_hge: + SQLanyequal_or_not_imp(hge, TRUE); + break; +#endif + case TYPE_flt: + SQLanyequal_or_not_imp(flt, TRUE); + break; + case TYPE_dbl: + SQLanyequal_or_not_imp(dbl, TRUE); + break; + default: { + int (*ocmp) (const void *, const void *) = ATOMcompare(l->ttype); + const void *nilp = ATOMnilptr(l->ttype); + BATiter li = bat_iterator(l), ri = bat_iterator(r); + const void *p = BUNtail(li, 0); + + for (BUN q = 0; q < o; q++) { + const void *c = BUNtail(ri, q); + if (ocmp(nilp, c) == 0) + *ret = bit_nil; + else if (ocmp(p, c) == 0) { + *ret = TRUE; + break; + } } } + } } BBPunfix(l->batCacheid); BBPunfix(r->batCacheid); return MAL_SUCCEED; } +#define SQLanyequal_or_not_grp_imp(TPE, TEST) \ + do { \ + TPE *lp = (TPE*)Tloc(l, 0), *rp = (TPE*)Tloc(r, 0); \ + for (BUN q = offset, s = 0; s < o; q++, s++) { \ + TPE lv = lp[q], rv = rp[q]; \ + oid id = *(oid*)BUNtail(gi, s); \ + if (ret[id] != TEST) { \ + if (is_##TPE##_nil(lv) || is_##TPE##_nil(rv)) { \ + ret[id] = bit_nil; \ + hasnil = 1; \ + } else if (lv == rv) { \ + ret[id] = TEST; \ + } \ + } \ + } \ + } while (0) + str SQLanyequal_grp(bat *ret, const bat *bid1, const bat *bid2, const bat *gp, const bat *gpe, bit *no_nil) { @@ -485,31 +618,57 @@ SQLanyequal_grp(bat *ret, const bat *bid assert(BATcount(l) == BATcount(r)); offset = g->hseqbase - l->hseqbase; if (BATcount(g) > 0) { - BUN q, o, s; - int (*ocmp) (const void *, const void *); - BATiter li = bat_iterator(l); - BATiter ri = bat_iterator(r); + bit *restrict ret = (bit*)Tloc(res, 0); BATiter gi = bat_iterator(g); - BATiter rt = bat_iterator(res); - - bit *ret = BUNtail(rt, 0); - const void *nilp = ATOMnilptr(l->ttype); + BUN o = BUNlast(g); - o = BUNlast(g); - ocmp = ATOMcompare(l->ttype); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list