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

Reply via email to