Changeset: cae451e1a212 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cae451e1a212 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/test/SQLancer/Tests/sqlancer06.sql sql/test/SQLancer/Tests/sqlancer06.stable.err sql/test/SQLancer/Tests/sqlancer06.stable.out Branch: Oct2020 Log Message:
Making SQLancer happy. Added missing bulk versions of 'anyequal' and 'allnotequal' diffs (truncated from 526 to 300 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 @@ -66,9 +66,9 @@ stdout of test 'MAL-signatures` in direc % clob, clob, clob, clob, clob # type % 12, 28, 313, 42, 0 # length [ "aggr", "all", "command aggr.all(X_1:bat[:any_1]):any_1 ", "SQLall;", "" ] -[ "aggr", "allnotequal", "command aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "aggr", "allnotequal", "pattern aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] [ "aggr", "anyequal", "pattern aggr.anyequal(X_1:any_1, X_2:any_1):bit ", "CMDvarEQ;", "" ] -[ "aggr", "anyequal", "command aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] +[ "aggr", "anyequal", "pattern aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:bte], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:dbl], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:flt], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] @@ -751,6 +751,8 @@ stdout of test 'MAL-signatures` in direc [ "bat", "setPersistent", "command bat.setPersistent(X_1:bat[:any_1]):void ", "BKCsetPersistent;", "" ] [ "bat", "setTransient", "command bat.setTransient(X_1:bat[:any_1]):void ", "BKCsetTransient;", "" ] [ "bat", "single", "pattern bat.single(X_1:any_1):bat[:any_1] ", "CMDBATsingle;", "" ] +[ "bataggr", "allnotequal", "pattern bataggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "bataggr", "anyequal", "pattern bataggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bat[:bit] ", "SQLanyequal;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:any_1):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bit ", "SQLexist;", "" ] 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 @@ -70,9 +70,9 @@ stdout of test 'MAL-signatures` in direc % clob, clob, clob, clob, clob # type % 12, 28, 313, 42, 0 # length [ "aggr", "all", "command aggr.all(X_1:bat[:any_1]):any_1 ", "SQLall;", "" ] -[ "aggr", "allnotequal", "command aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "aggr", "allnotequal", "pattern aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] [ "aggr", "anyequal", "pattern aggr.anyequal(X_1:any_1, X_2:any_1):bit ", "CMDvarEQ;", "" ] -[ "aggr", "anyequal", "command aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] +[ "aggr", "anyequal", "pattern aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:bte], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:dbl], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:flt], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] @@ -866,6 +866,8 @@ stdout of test 'MAL-signatures` in direc [ "bat", "setPersistent", "command bat.setPersistent(X_1:bat[:any_1]):void ", "BKCsetPersistent;", "" ] [ "bat", "setTransient", "command bat.setTransient(X_1:bat[:any_1]):void ", "BKCsetTransient;", "" ] [ "bat", "single", "pattern bat.single(X_1:any_1):bat[:any_1] ", "CMDBATsingle;", "" ] +[ "bataggr", "allnotequal", "pattern bataggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "bataggr", "anyequal", "pattern bataggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bat[:bit] ", "SQLanyequal;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:any_1):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bit ", "SQLexist;", "" ] 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 @@ -6297,8 +6297,10 @@ static mel_func sql_init_funcs[] = { pattern("batsql", "all", SQLall_cmp, false, "if !cmp then false, (nl or nr) then nil, else true", args(1,4, batarg("",bit),batarg("cmp",bit),arg("nl",bit),batarg("nr",bit))), pattern("batsql", "all", SQLall_cmp, false, "if !cmp then false, (nl or nr) then nil, else true", args(1,4, batarg("",bit),batarg("cmp",bit),batarg("nl",bit),arg("nr",bit))), pattern("batsql", "all", SQLall_cmp, false, "if !cmp then false, (nl or nr) then nil, else true", args(1,4, batarg("",bit),batarg("cmp",bit),batarg("nl",bit),batarg("nr",bit))), - command("aggr", "anyequal", SQLanyequal, false, "if any value in r is equal to l return true, else if r has nil nil else false", args(1,3, arg("",bit),batargany("l",1),batargany("r",1))), - command("aggr", "allnotequal", SQLallnotequal, false, "if all values in r are not equal to l return true, else if r has nil nil else false", args(1,3, arg("",bit),batargany("l",1),batargany("r",1))), + pattern("aggr", "anyequal", SQLanyequal, false, "if any value in r is equal to l return true, else if r has nil nil else false", args(1,3, arg("",bit),batargany("l",1),batargany("r",1))), + pattern("bataggr", "anyequal", SQLanyequal, false, "", args(1,3, batarg("",bit),batargany("l",1),batargany("r",1))), + pattern("aggr", "allnotequal", SQLallnotequal, false, "if all values in r are not equal to l return true, else if r has nil nil else false", args(1,3, arg("",bit),batargany("l",1),batargany("r",1))), + pattern("bataggr", "allnotequal", SQLallnotequal, false, "", args(1,3, arg("",bit),batargany("l",1),batargany("r",1))), pattern("aggr", "subanyequal", SQLanyequal_grp, false, "if any value in r is equal to l return true, else if r has nil nil else false", args(1,6, batarg("",bit),batargany("l",1),batargany("r",1),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))), pattern("aggr", "subanyequal", SQLanyequal_grp, false, "if any value in r is equal to l return true, else if r has nil nil else false; with candidate list", args(1,7, batarg("",bit),batargany("l",1),batargany("r",1),batarg("g",oid),batarg("e",oid),batarg("s",oid),arg("no_nil",bit))), pattern("aggr", "subanyequal", SQLanyequal_grp2, false, "if any value in r is equal to l return true, else if r has nil nil else false, except if rid is nil (ie empty) then false", args(1,7, batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))), 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 @@ -588,7 +588,7 @@ bailout: return msg; } -#define SQLanyequal_or_not_imp(TPE, OUTPUT) \ +#define SQLanyequal_or_not_imp_single(TPE, OUTPUT) \ do { \ TPE *rp = (TPE*)Tloc(r, 0), *lp = (TPE*)Tloc(l, 0), p = lp[0]; \ for (BUN q = 0; q < o; q++) { \ @@ -602,73 +602,146 @@ bailout: } \ } while (0) +#define SQLanyequal_or_not_imp_multi(TPE, OUTPUT) \ + do { \ + TPE *rp = (TPE*)Tloc(r, 0), *lp = (TPE*)Tloc(l, 0); \ + for (BUN q = 0; q < o; q++) { \ + TPE c = rp[q], d = lp[q]; \ + res_l[q] = (is_##TPE##_nil(c) || is_##TPE##_nil(d)) ? bit_nil : c == d; \ + } \ + } while (0) + str -SQLanyequal(bit *ret, const bat *bid1, const bat *bid2) +SQLanyequal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - BAT *l, *r; + bat *bret = isaBatType(getArgType(mb, pci, 0)) ? getArgReference_bat(stk, pci, 0) : NULL; + bat *bid1 = getArgReference_bat(stk, pci, 1); + bat *bid2 = getArgReference_bat(stk, pci, 2); + BAT *res = NULL, *l = NULL, *r = NULL; + str msg = MAL_SUCCEED; + BUN o = 0; + (void) cntxt; if ((l = BATdescriptor(*bid1)) == NULL) { - throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); + msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; } if ((r = BATdescriptor(*bid2)) == NULL) { - BBPunfix(l->batCacheid); - throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); + msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; } if (l->ttype != r->ttype) { - BBPunfix(l->batCacheid); - BBPunfix(r->batCacheid); - throw(MAL, "sql.any =", SQLSTATE(42000) "sql.any = requires both arguments of the same type"); + msg = createException(SQL, "sql.any =", SQLSTATE(42000) "sql.any = requires both arguments of the same type"); + goto bailout; } - *ret = FALSE; - if (BATcount(r) > 0) { - BUN o = BUNlast(r); + if (bret) { + o = BATcount(r); + if ((res = COLnew(r->hseqbase, TYPE_bit, o, TRANSIENT)) == NULL) + goto bailout; + bit *restrict res_l = (bit *) Tloc(res, 0); switch (ATOMbasetype(l->ttype)) { case TYPE_bte: - SQLanyequal_or_not_imp(bte, TRUE); + SQLanyequal_or_not_imp_multi(bte, TRUE); break; case TYPE_sht: - SQLanyequal_or_not_imp(sht, TRUE); + SQLanyequal_or_not_imp_multi(sht, TRUE); break; case TYPE_int: - SQLanyequal_or_not_imp(int, TRUE); + SQLanyequal_or_not_imp_multi(int, TRUE); break; case TYPE_lng: - SQLanyequal_or_not_imp(lng, TRUE); + SQLanyequal_or_not_imp_multi(lng, TRUE); break; #ifdef HAVE_HGE case TYPE_hge: - SQLanyequal_or_not_imp(hge, TRUE); + SQLanyequal_or_not_imp_multi(hge, TRUE); break; #endif case TYPE_flt: - SQLanyequal_or_not_imp(flt, TRUE); + SQLanyequal_or_not_imp_multi(flt, TRUE); break; case TYPE_dbl: - SQLanyequal_or_not_imp(dbl, TRUE); + SQLanyequal_or_not_imp_multi(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; - } + const void *c = BUNtail(ri, q), *d = BUNtail(li, q); + res_l[q] = ocmp(nilp, c) == 0 || ocmp(nilp, d) == 0 ? bit_nil : ocmp(c, d) == 0; } } } + + BATsetcount(res, o); + res->tkey = BATcount(res) <= 1; + res->tsorted = BATcount(res) <= 1; + res->trevsorted = BATcount(res) <= 1; + res->tnil = l->tnil || r->tnil; + res->tnonil = l->tnonil && r->tnonil; + } else { + bit *ret = getArgReference_bit(stk, pci, 0); + + *ret = FALSE; + if (BATcount(r) > 0) { + switch (ATOMbasetype(l->ttype)) { + case TYPE_bte: + SQLanyequal_or_not_imp_single(bte, TRUE); + break; + case TYPE_sht: + SQLanyequal_or_not_imp_single(sht, TRUE); + break; + case TYPE_int: + SQLanyequal_or_not_imp_single(int, TRUE); + break; + case TYPE_lng: + SQLanyequal_or_not_imp_single(lng, TRUE); + break; +#ifdef HAVE_HGE + case TYPE_hge: + SQLanyequal_or_not_imp_single(hge, TRUE); + break; +#endif + case TYPE_flt: + SQLanyequal_or_not_imp_single(flt, TRUE); + break; + case TYPE_dbl: + SQLanyequal_or_not_imp_single(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; + +bailout: + if (res && !msg) + BBPkeepref(*bret = res->batCacheid); + else if (res) + BBPreclaim(res); + if (l) + BBPunfix(l->batCacheid); + if (r) + BBPunfix(r->batCacheid); + return msg; } str @@ -796,72 +869,136 @@ SQLanyequal_grp2(Client cntxt, MalBlkPtr } str -SQLallnotequal(bit *ret, const bat *bid1, const bat *bid2) +SQLallnotequal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - BAT *l, *r; + bat *bret = isaBatType(getArgType(mb, pci, 0)) ? getArgReference_bat(stk, pci, 0) : NULL; + bat *bid1 = getArgReference_bat(stk, pci, 1); + bat *bid2 = getArgReference_bat(stk, pci, 2); + BAT *res = NULL, *l = NULL, *r = NULL; + str msg = MAL_SUCCEED; + BUN o = 0; + (void) cntxt; if ((l = BATdescriptor(*bid1)) == NULL) { - throw(SQL, "sql.all <>", SQLSTATE(HY005) "Cannot access column descriptor"); + msg = createException(SQL, "sql.all <>", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; } if ((r = BATdescriptor(*bid2)) == NULL) { - BBPunfix(l->batCacheid); - throw(SQL, "sql.all <>", SQLSTATE(HY005) "Cannot access column descriptor"); + msg = createException(SQL, "sql.all <>", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; } if (l->ttype != r->ttype) { - BBPunfix(l->batCacheid); - BBPunfix(r->batCacheid); - throw(MAL, "sql.all <>", SQLSTATE(42000) "sql.all <> requires both arguments of the same type"); + msg = createException(SQL, "sql.all <>", SQLSTATE(42000) "sql.all <> requires both arguments of the same type"); + goto bailout; } - *ret = TRUE; - if (BATcount(r) > 0) { - BUN o = BUNlast(r); + if (bret) { + o = BATcount(r); + if ((res = COLnew(r->hseqbase, TYPE_bit, o, TRANSIENT)) == NULL) + goto bailout; + bit *restrict res_l = (bit *) Tloc(res, 0); switch (ATOMbasetype(l->ttype)) { case TYPE_bte: - SQLanyequal_or_not_imp(bte, FALSE); + SQLanyequal_or_not_imp_multi(bte, FALSE); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list