Changeset: 0703e21a01f9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0703e21a01f9
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 subanyequal and suballnotequal versions 
without rowids (ie 2 arguments)


diffs (truncated from 645 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
@@ -247,9 +247,11 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "str_group_concat",     "pattern 
aggr.str_group_concat(X_1:bat[:str], X_2:bat[:str], X_3:bit):str ",    
"CMDBATstr_group_concat;",      ""      ]
 [ "aggr",      "str_group_concat",     "pattern 
aggr.str_group_concat(X_1:bat[:str], X_2:bit):str ",   
"CMDBATstr_group_concat;",      ""      ]
 [ "aggr",      "suballnotequal",       "command 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",       
"SQLallnotequal_grp2;", ""      ]
-[ "aggr",      "suballnotequal",       "command 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bit):bat[:bit] ",      "SQLallnotequal_grp;",  ""      ]
+[ "aggr",      "suballnotequal",       "pattern 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",       
"SQLallnotequal_grp;",  ""      ]
+[ "aggr",      "suballnotequal",       "pattern 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bit):bat[:bit] ",      "SQLallnotequal_grp;",  ""      ]
 [ "aggr",      "subanyequal",  "command aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid], 
X_6:bit):bat[:bit] ",  "SQLanyequal_grp2;",    ""      ]
-[ "aggr",      "subanyequal",  "command aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ", 
"SQLanyequal_grp;",     ""      ]
+[ "aggr",      "subanyequal",  "pattern aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid], 
X_6:bit):bat[:bit] ",  "SQLanyequal_grp;",     ""      ]
+[ "aggr",      "subanyequal",  "pattern aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ", 
"SQLanyequal_grp;",     ""      ]
 [ "aggr",      "subavg",       "command aggr.subavg(X_1:bat[:bte], 
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",      
"AGGRsubavg1_dbl;",     ""      ]
 [ "aggr",      "subavg",       "command aggr.subavg(X_1:bat[:dbl], 
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",      
"AGGRsubavg1_dbl;",     ""      ]
 [ "aggr",      "subavg",       "command aggr.subavg(X_1:bat[:flt], 
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",      
"AGGRsubavg1_dbl;",     ""      ]
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
@@ -287,9 +287,11 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "str_group_concat",     "pattern 
aggr.str_group_concat(X_1:bat[:str], X_2:bat[:str], X_3:bit):str ",    
"CMDBATstr_group_concat;",      ""      ]
 [ "aggr",      "str_group_concat",     "pattern 
aggr.str_group_concat(X_1:bat[:str], X_2:bit):str ",   
"CMDBATstr_group_concat;",      ""      ]
 [ "aggr",      "suballnotequal",       "command 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",       
"SQLallnotequal_grp2;", ""      ]
-[ "aggr",      "suballnotequal",       "command 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bit):bat[:bit] ",      "SQLallnotequal_grp;",  ""      ]
+[ "aggr",      "suballnotequal",       "pattern 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bat[:oid], X_6:bit):bat[:bit] ",       
"SQLallnotequal_grp;",  ""      ]
+[ "aggr",      "suballnotequal",       "pattern 
aggr.suballnotequal(X_1:bat[:any_1], X_2:bat[:any_1], X_3:bat[:oid], 
X_4:bat[:oid], X_5:bit):bat[:bit] ",      "SQLallnotequal_grp;",  ""      ]
 [ "aggr",      "subanyequal",  "command aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid], 
X_6:bit):bat[:bit] ",  "SQLanyequal_grp2;",    ""      ]
-[ "aggr",      "subanyequal",  "command aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ", 
"SQLanyequal_grp;",     ""      ]
+[ "aggr",      "subanyequal",  "pattern aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bat[:oid], 
X_6:bit):bat[:bit] ",  "SQLanyequal_grp;",     ""      ]
+[ "aggr",      "subanyequal",  "pattern aggr.subanyequal(X_1:bat[:any_1], 
X_2:bat[:any_1], X_3:bat[:oid], X_4:bat[:oid], X_5:bit):bat[:bit] ", 
"SQLanyequal_grp;",     ""      ]
 [ "aggr",      "subavg",       "command aggr.subavg(X_1:bat[:bte], 
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",      
"AGGRsubavg1_dbl;",     ""      ]
 [ "aggr",      "subavg",       "command aggr.subavg(X_1:bat[:dbl], 
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",      
"AGGRsubavg1_dbl;",     ""      ]
 [ "aggr",      "subavg",       "command aggr.subavg(X_1:bat[:flt], 
X_2:bat[:oid], X_3:bat[:any_1], X_4:bit, X_5:bit):bat[:dbl] ",      
"AGGRsubavg1_dbl;",     ""      ]
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
@@ -6625,21 +6625,23 @@ static mel_func sql_init_funcs[] = {
  command("sql", "zero_or_one", zero_or_one, false, "if col contains exactly 
one value return this. Incase of more raise an exception else return nil", 
args(1,2, argany("",1),batargany("col",1))),
  command("sql", "zero_or_one", zero_or_one_error, false, "if col contains 
exactly one value return this. Incase of more raise an exception if err is true 
else return nil", args(1,3, argany("",1),batargany("col",1),arg("err",bit))),
  command("sql", "zero_or_one", zero_or_one_error_bat, false, "if col contains 
exactly one value return this. Incase of more raise an exception if err is true 
else return nil", args(1,3, argany("",1),batargany("col",1),batarg("err",bit))),
- command("sql", "subzero_or_one", SQLsubzero_or_one, false, "", args(1,5, 
batargany("",1),batargany("b",1),batarg("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
+ command("sql", "subzero_or_one", SQLsubzero_or_one, false, "", args(1,5, 
batargany("",1),batargany("b",1),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
  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("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
+ 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("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
+ 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))),
  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))),
 // pattern("aggr", "not_anyequal", CMDvarNE, false, "", args(1,3, 
arg("",bit),argany("l",1),argany("r",1))),
  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))),
- command("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("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
- command("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("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
- command("aggr", "suballnotequal", SQLallnotequal_grp, false, "if all values 
in r are not 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("gp",oid),batarg("gpe",oid),arg("no_nil",bit))),
- command("aggr", "suballnotequal", SQLallnotequal_grp2, false, "if all values 
in r are not equal to l return true, else if r has nil nil else false, except 
if rid is nil (ie empty) then true", args(1,7, 
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("gp",oid),batarg("gpe",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", 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))),
+ command("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))),
+ pattern("aggr", "suballnotequal", SQLallnotequal_grp, false, "if all values 
in r are not 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", "suballnotequal", SQLallnotequal_grp, false, "if all values 
in r are not 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))),
+ command("aggr", "suballnotequal", SQLallnotequal_grp2, false, "if all values 
in r are not equal to l return true, else if r has nil nil else false, except 
if rid is nil (ie empty) then true", args(1,7, 
batarg("",bit),batargany("l",1),batargany("r",1),batarg("rid",oid),batarg("g",oid),batarg("e",oid),arg("no_nil",bit))),
 // command("aggr", "exist", ALGexist, false, "", args(1,3, 
arg("",bit),batargany("b",2),argany("h",1))),
  pattern("aggr", "exist", SQLexist, false, "", args(1,2, arg("",bit), 
argany("b",1))),
  pattern("bataggr", "exist", SQLexist, false, "", args(1,2, batarg("",bit), 
argany("b",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
@@ -564,63 +564,99 @@ SQLanyequal(bit *ret, const bat *bid1, c
        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; \
+#define SQLanyequal_or_not_grp_imp(TYPE, TEST) \
+       do {                                                            \
+               const TYPE *vals1 = (const TYPE *) Tloc(l, 0);          \
+               const TYPE *vals2 = (const TYPE *) Tloc(r, 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] != TEST) { \
+                                       if (is_##TYPE##_nil(vals1[i]) || 
is_##TYPE##_nil(vals2[i])) { \
+                                               ret[gid] = bit_nil; \
+                                               hasnil = 1; \
+                                       } else if (vals1[i] == vals2[i]) { \
+                                               ret[gid] = TEST; \
+                                       } \
                                } \
                        } \
                } \
        } while (0)
 
 str
-SQLanyequal_grp(bat *ret, const bat *bid1, const bat *bid2, const bat *gp, 
const bat *gpe, bit *no_nil)
+SQLanyequal_grp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       BAT *l, *r, *g, *e, *res;
-       bit F = FALSE, hasnil = 0;
-       BUN offset = 0;
+       bat *ret = getArgReference_bat(stk, pci, 0);
+       bat *lp = getArgReference_bat(stk, pci, 1);
+       bat *rp = getArgReference_bat(stk, pci, 2);
+       bat *gp = getArgReference_bat(stk, pci, 3);
+       bat *gpe = getArgReference_bat(stk, pci, 4);
+       bat *sp = pci->argc == 7 ? getArgReference_bat(stk, pci, 5) : NULL;
+       //bit *no_nil = getArgReference_bit(stk, pci, pci->argc == 7 ? 6 : 5); 
no_nil argument is ignored
+       BAT *l = NULL, *r = 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(*bid1)) == NULL) {
-               throw(SQL, "sql.any =", SQLSTATE(HY005) "Cannot access column 
descriptor");
+       (void)cntxt;
+       (void)mb;
+       if ((l = BATdescriptor(*lp)) == NULL) {
+               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");
+       if ((r = BATdescriptor(*rp)) == NULL) {
+               msg = createException(SQL, "sql.any =", SQLSTATE(HY005) "Cannot 
access column descriptor");
+               goto bailout;
        }
        if ((g = BATdescriptor(*gp)) == NULL) {
-               BBPunfix(l->batCacheid);
-               BBPunfix(r->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 ((e = BATdescriptor(*gpe)) == NULL) {
-               BBPunfix(l->batCacheid);
-               BBPunfix(r->batCacheid);
-               BBPunfix(g->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 (sp && (s = BATdescriptor(*sp)) == NULL) {
+               msg = createException(SQL, "sql.any =", 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.any =", SQLSTATE(HY005) "l, r 
and g must be aligned");
+               goto bailout;
        }
-       if ((res = BATconstant(0, TYPE_bit, &F, BATcount(e), TRANSIENT)) == 
NULL) {
-               BBPunfix(l->batCacheid);
-               BBPunfix(r->batCacheid);
-               BBPunfix(g->batCacheid);
-               BBPunfix(e->batCacheid);
-               throw(SQL, "sql.any =", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       }
-       BAThseqbase(res, e->hseqbase);
-       assert(BATcount(l) == BATcount(r));
-       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.any =", 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.any =", 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:
@@ -654,33 +690,52 @@ SQLanyequal_grp(bat *ret, const bat *bid
                        const void *nilp = ATOMnilptr(l->ttype);
                        BATiter li = bat_iterator(l), ri = bat_iterator(r);
 
-                       for (BUN q = offset, s = 0; s < o; q++, s++) {
-                               const void *lv = BUNtail(li, q);
-                               const void *rv = BUNtail(ri, q);
-                               const oid id = *(oid*)BUNtail(gi, s);
-
-                               if (ret[id] != TRUE) {
-                                       if (ocmp(lv, nilp) == 0 || ocmp(rv, 
nilp) == 0) {
-                                               ret[id] = bit_nil;
-                                               hasnil = 1;
-                                       } else if (ocmp(lv, rv) == 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;
+                                       if (ret[gid] != TRUE) {
+                                               const void *lv = BUNtail(li, i);
+                                               const void *rv = BUNtail(ri, i);
+                                               if (ocmp(lv, nilp) == 0 || 
ocmp(rv, nilp) == 0) {
+                                                       ret[gid] = bit_nil;
+                                                       hasnil = 1;
+                                               } else if (ocmp(lv, rv) == 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 = hasnil != 0;
-       res->tnonil = hasnil == 0;
-       res->tsorted = res->trevsorted = 0;
-       res->tkey = 0;
-       BBPunfix(l->batCacheid);
-       BBPunfix(r->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 (r)
+               BBPunfix(r->batCacheid);
+       if (g)
+               BBPunfix(g->batCacheid);
+       if (e)
+               BBPunfix(e->batCacheid);
+       if (s)
+               BBPunfix(s->batCacheid);
+       return msg;
 }
 
 #define SQLanyequal_or_not_grp2_imp(TPE, VAL1, VAL2) \
@@ -882,45 +937,73 @@ SQLallnotequal(bit *ret, const bat *bid1
 }
 
 str
-SQLallnotequal_grp(bat *ret, const bat *bid1, const bat *bid2, const bat *gp, 
const bat *gpe, bit *no_nil)
+SQLallnotequal_grp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       BAT *l, *r, *g, *e, *res;
-       bit T = TRUE, hasnil = 0;
-       BUN offset = 0;
+       bat *ret = getArgReference_bat(stk, pci, 0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to