Changeset: 1da413b6146f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1da413b6146f Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 sql/backends/monet5/sql.c sql/backends/monet5/sql_subquery.c sql/backends/monet5/sql_subquery.h sql/backends/monet5/sql_subquery.mal Branch: default Log Message:
Added candidate list support for SQLnil_grp diffs (257 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -10191,7 +10191,8 @@ stdout of test 'MAL-signatures` in direc [ "sql", "suball", "command sql.suball(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:any_1] ", "SQLall_grp;", "" ] [ "sql", "subdelta", "command sql.subdelta(X_1:bat[:oid], X_2:bat[:oid], X_3:bat[:oid], X_4:bat[:oid]):bat[:oid] ", "DELTAsub2;", "" ] [ "sql", "subdelta", "command sql.subdelta(X_1:bat[:oid], X_2:bat[:oid], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid]):bat[:oid] ", "DELTAsub;", "" ] -[ "sql", "subnull", "command sql.subnull(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:bit] ", "SQLnil_grp;", "" ] +[ "sql", "subnull", "pattern sql.subnull(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ", "SQLnil_grp;", "" ] +[ "sql", "subnull", "pattern sql.subnull(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:bit] ", "SQLnil_grp;", "" ] [ "sql", "subzero_or_one", "command sql.subzero_or_one(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:any_1] ", "SQLsubzero_or_one;", "" ] [ "sql", "sum", "pattern sql.sum(X_1:bte, X_2:lng, X_3:lng):lng ", "SQLsum;", "" ] [ "sql", "sum", "pattern sql.sum(X_1:dbl, X_2:lng, X_3:lng):dbl ", "SQLsum;", "" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -13557,7 +13557,8 @@ stdout of test 'MAL-signatures` in direc [ "sql", "suball", "command sql.suball(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:any_1] ", "SQLall_grp;", "" ] [ "sql", "subdelta", "command sql.subdelta(X_1:bat[:oid], X_2:bat[:oid], X_3:bat[:oid], X_4:bat[:oid]):bat[:oid] ", "DELTAsub2;", "" ] [ "sql", "subdelta", "command sql.subdelta(X_1:bat[:oid], X_2:bat[:oid], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid]):bat[:oid] ", "DELTAsub;", "" ] -[ "sql", "subnull", "command sql.subnull(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:bit] ", "SQLnil_grp;", "" ] +[ "sql", "subnull", "pattern sql.subnull(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ", "SQLnil_grp;", "" ] +[ "sql", "subnull", "pattern sql.subnull(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:bit] ", "SQLnil_grp;", "" ] [ "sql", "subzero_or_one", "command sql.subzero_or_one(X_1:bat[:any_1], X_2:bat[:oid], X_3:bat[:oid], X_4:bit):bat[:any_1] ", "SQLsubzero_or_one;", "" ] [ "sql", "sum", "pattern sql.sum(X_1:bte, X_2:lng, X_3:lng):hge ", "SQLsum;", "" ] [ "sql", "sum", "pattern sql.sum(X_1:bte, X_2:lng, X_3:lng):lng ", "SQLsum;", "" ] diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -6629,7 +6629,8 @@ static mel_func sql_init_funcs[] = { command("sql", "all", SQLall, false, "if all values in col are equal return this, else nil", args(1,2, argany("",1),batargany("col",1))), command("sql", "suball", SQLall_grp, false, "if all values in l are equal (per group) return the value, else nil", args(1,5, batargany("",1),batargany("l",1),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))), command("sql", "null", SQLnil, false, "if b has a nil return true, else false", args(1,2, arg("",bit),batargany("b",1))), - command("sql", "subnull", SQLnil_grp, false, "if any value in l is nil with in a group return true for that group, else false", args(1,5, batarg("",bit),batargany("l",1),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))), + pattern("sql", "subnull", SQLnil_grp, false, "if any value in l is nil with in a group return true for that group, else false", args(1,5, batarg("",bit),batargany("l",1),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))), + pattern("sql", "subnull", SQLnil_grp, false, "if any value in l is nil with in a group return true for that group, else false; with candidate list", args(1,6, batarg("",bit),batargany("l",1),batarg("g",oid),batarg("e",oid),batarg("s",oid),arg("no_nil",bit))), command("sql", "any", SQLany_cmp, false, "if cmp then true, (nl or nr) nil then nil, else false", args(1,4, arg("",bit),arg("cmp",bit),arg("nl",bit),arg("nr",bit))), command("sql", "all", SQLall_cmp, false, "if !cmp then false, (nl or nr) then nil, else true", args(1,4, arg("",bit),arg("cmp",bit),arg("nl",bit),arg("nr",bit))), // pattern("aggr", "anyequal", CMDvarEQ, false, "", args(1,3, arg("",bit),argany("l",1),argany("r",1))), 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 @@ -358,49 +358,86 @@ SQLnil(bit *ret, const bat *bid) 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; \ +#define SQLnil_grp_imp(TYPE) \ + do { \ + const TYPE *restrict vals = (const TYPE *) Tloc(l, 0); \ + while (ncand > 0) { \ + ncand--; \ + i = canditer_next(&ci) - l->hseqbase; \ + if (gids == NULL || \ + (gids[i] >= min && gids[i] <= max)) { \ + if (gids) \ + gid = gids[i] - min; \ + else \ + gid = (oid) i; \ + if (ret[gid] != TRUE && is_##TYPE##_nil(vals[i])) \ + ret[gid] = TRUE; \ + } \ } \ } while (0) str -SQLnil_grp(bat *ret, const bat *bid, const bat *gp, const bat *gpe, bit *no_nil) +SQLnil_grp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - BAT *l, *g, *e, *res; - bit F = FALSE; - BUN offset = 0; + bat *ret = getArgReference_bat(stk, pci, 0); + bat *lp = getArgReference_bat(stk, pci, 1); + bat *gp = getArgReference_bat(stk, pci, 2); + bat *gpe = getArgReference_bat(stk, pci, 3); + bat *sp = pci->argc == 6 ? getArgReference_bat(stk, pci, 4) : NULL; + //bit *no_nil = getArgReference_bit(stk, pci, pci->argc == 6 ? 5 : 4); no_nil argument is ignored + BAT *l = NULL, *g = NULL, *e = NULL, *s = NULL, *res = NULL; + const oid *restrict gids; + oid gid, min, max; + BUN i, ngrp, ncand; + struct canditer ci; + str msg = MAL_SUCCEED; + bit hasnil = 0; - (void)no_nil; - if ((l = BATdescriptor(*bid)) == NULL) { - throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); + (void)cntxt; + (void)mb; + if ((l = BATdescriptor(*lp)) == NULL) { + msg = createException(SQL, "sql.nil", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; } if ((g = BATdescriptor(*gp)) == NULL) { - BBPunfix(l->batCacheid); - throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); + msg = createException(SQL, "sql.nil", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; } if ((e = BATdescriptor(*gpe)) == NULL) { - BBPunfix(l->batCacheid); - BBPunfix(g->batCacheid); - throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); + msg = createException(SQL, "sql.nil", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; + } + if (sp && (s = BATdescriptor(*sp)) == NULL) { + msg = createException(SQL, "sql.nil", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; + } + + if ((msg = (str)BATgroupaggrinit(l, g, e, s, &min, &max, &ngrp, &ci, &ncand)) != NULL) + goto bailout; + if (g == NULL) { + msg = createException(SQL, "sql.nil", SQLSTATE(HY005) "l and g must be aligned"); + goto bailout; } - if ((res = BATconstant(0, TYPE_bit, &F, BATcount(e), TRANSIENT)) == NULL) { - BBPunfix(l->batCacheid); - BBPunfix(g->batCacheid); - BBPunfix(e->batCacheid); - throw(SQL, "sql.any =", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - BAThseqbase(res, e->hseqbase); - offset = g->hseqbase - l->hseqbase; - if (BATcount(g) > 0) { - bit *restrict ret = (bit*)Tloc(res, 0); - BATiter gi = bat_iterator(g); - BUN o = BUNlast(g); + if (BATcount(l) == 0 || ngrp == 0) { + bit F = FALSE; + if ((res = BATconstant(ngrp == 0 ? 0 : min, TYPE_bit, &F, ngrp, TRANSIENT)) == NULL) { + msg = createException(SQL, "sql.nil", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; + } + } else { + bit *restrict ret; + + if ((res = COLnew(min, TYPE_bit, ngrp, TRANSIENT)) == NULL) { + msg = createException(SQL, "sql.nil", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; + } + ret = (bit *) Tloc(res, 0); + memset(ret, FALSE, ngrp * sizeof(bit)); + + if (!g || BATtdense(g)) + gids = NULL; + else + gids = (const oid *) Tloc(g, 0); switch (l->ttype) { case TYPE_bit: @@ -431,29 +468,47 @@ SQLnil_grp(bat *ret, const bat *bid, con break; default: { int (*ocmp) (const void *, const void *) = ATOMcompare(l->ttype); - const void *restrict nilp = ATOMnilptr(l->ttype); + const void *nilp = ATOMnilptr(l->ttype); BATiter li = bat_iterator(l); - 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; + while (ncand > 0) { + ncand--; + i = canditer_next(&ci) - l->hseqbase; + if (gids == NULL || + (gids[i] >= min && gids[i] <= max)) { + if (gids) + gid = gids[i] - min; + else + gid = (oid) i; + const void *lv = BUNtail(li, i); + if (ret[gid] != TRUE && ocmp(lv, nilp) == 0) + ret[gid] = TRUE; + } } } } + BATsetcount(res, ngrp); + res->tkey = BATcount(res) <= 1; + res->tsorted = BATcount(res) <= 1; + res->trevsorted = BATcount(res) <= 1; + res->tnil = hasnil != 0; + res->tnonil = hasnil == 0; } - res->hseqbase = g->hseqbase; - res->tnil = 0; - res->tnonil = 1; - res->tsorted = res->trevsorted = 0; - res->tkey = 0; - BBPunfix(l->batCacheid); - BBPunfix(g->batCacheid); - BBPunfix(e->batCacheid); - BBPkeepref(*ret = res->batCacheid); - return MAL_SUCCEED; + +bailout: + if (res && !msg) + BBPkeepref(*ret = res->batCacheid); + else if (res) + BBPreclaim(res); + if (l) + BBPunfix(l->batCacheid); + if (g) + BBPunfix(g->batCacheid); + if (e) + BBPunfix(e->batCacheid); + if (s) + BBPunfix(s->batCacheid); + return msg; } str diff --git a/sql/backends/monet5/sql_subquery.h b/sql/backends/monet5/sql_subquery.h --- a/sql/backends/monet5/sql_subquery.h +++ b/sql/backends/monet5/sql_subquery.h @@ -18,7 +18,7 @@ sql5_export str SQLsubzero_or_one(bat *r sql5_export str SQLall(ptr ret, const bat *bid); sql5_export str SQLall_grp(bat *ret, const bat *l, const bat *gp, const bat *gpe, bit *no_nil); sql5_export str SQLnil(bit *ret, const bat *bid); -sql5_export str SQLnil_grp(bat *ret, const bat *l, const bat *gp, const bat *gpe, bit *no_nil); +sql5_export str SQLnil_grp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str SQLany_cmp(bit *ret, const bit *cmp, const bit *nl, const bit *nr); sql5_export str SQLall_cmp(bit *ret, const bit *cmp, const bit *nl, const bit *nr); sql5_export str SQLanyequal(bit *ret, const bat *l, const bat *r); diff --git a/sql/backends/monet5/sql_subquery.mal b/sql/backends/monet5/sql_subquery.mal --- a/sql/backends/monet5/sql_subquery.mal +++ b/sql/backends/monet5/sql_subquery.mal @@ -33,10 +33,14 @@ command null(b:bat[:any_1]) :bit address SQLnil comment "if b has a nil return true, else false"; -command subnull(l:bat[:any_1], g:bat[:oid], e:bat[:oid], no_nil:bit) :bat[:bit] +pattern subnull(l:bat[:any_1], g:bat[:oid], e:bat[:oid], no_nil:bit) :bat[:bit] address SQLnil_grp comment "if any value in l is nil with in a group return true for that group, else false"; +pattern subnull(l:bat[:any_1], g:bat[:oid], e:bat[:oid], s:bat[:oid], no_nil:bit) :bat[:bit] +address SQLnil_grp +comment "if any value in l is nil with in a group return true for that group, else false; with candidate list"; + command any(cmp:bit, nl:bit, nr:bit) :bit address SQLany_cmp comment "if cmp then true, (nl or nr) nil then nil, else false"; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list