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

Reply via email to