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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list