Changeset: e14c0cfaafed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e14c0cfaafed
Modified Files:
        gdk/gdk_analytic.c
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_rank.h
        sql/backends/monet5/sql_rank.mal
        sql/backends/monet5/sql_rank.mal.sh
        sql/common/sql_types.c
        sql/server/rel_select.c
        sql/test/analytics/Tests/analytics00.sql
        sql/test/analytics/Tests/analytics00.stable.out
Branch: analytics
Log Message:

Cleaned count analytical function call.

This fixes the query: select count(*) over () from table;
However the query: select count(*) over (); is still crashing (have to check 
the projection).


diffs (truncated from 356 to 300 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -425,13 +425,11 @@ ANALYTICAL_LIMIT(max, MAX, <)
 gdk_return
 GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const bit *ignore_nils, int 
tpe)
 {
-       BUN i, cnt;
+       BUN i, cnt = BATcount(b);
        gdk_return gdk_res = GDK_SUCCEED;
 
-       assert(b || p || o);
-       cnt = BATcount(b?b:p?p:o);
-
-       if(!*ignore_nils || !b || b->T.nonil) {
+       (void) o;
+       if(!*ignore_nils || b->T.nonil) {
                bit *np, *pnp;
                lng *rp, *rb, curval = 0;
                rb = rp = (lng*)Tloc(r, 0);
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -634,50 +634,63 @@ SQLmax(Client cntxt, MalBlkPtr mb, MalSt
 str
 SQLcount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       BAT *r = NULL, *p = NULL, *o = NULL, *cr;
-       str msg = MAL_SUCCEED;
-       int tpe, unit, excl;
-       bit ignore_nils = 0;
+       BAT *r = NULL, *b = NULL, *p = NULL, *o = NULL;
+       int tpe, unit, start, end, excl;
+       bit *ignore_nils;
        gdk_return gdk_res;
 
-       (void)cntxt;
-       if (pci->argc != 7 || (getArgType(mb, pci, 1) != TYPE_bit && 
getBatType(getArgType(mb, pci, 1)) != TYPE_bit) ||
-               (getArgType(mb, pci, 2) != TYPE_bit && 
getBatType(getArgType(mb, pci, 2)) != TYPE_bit)){
-               throw(SQL, "sql.count", "%s", "count(:any_1,:bit,:bit)");
+       (void) cntxt;
+       if (pci->argc != 9 || getArgType(mb, pci, 2) != TYPE_bit ||
+               (getArgType(mb, pci, 3) != TYPE_bit && 
getBatType(getArgType(mb, pci, 3)) != TYPE_bit) ||
+               (getArgType(mb, pci, 4) != TYPE_bit && 
getBatType(getArgType(mb, pci, 4)) != TYPE_bit)) {
+               throw(SQL, "sql.count", "%s", "count(:any_1,:bit,:bit,:bit)");
        }
-
        tpe = getArgType(mb, pci, 1);
-       unit = *getArgReference_int(stk, pci, 3);
-       //start = *getArgReference_int(stk, pci, 4);
-       //end = *getArgReference_int(stk, pci, 5);
-       excl = *getArgReference_int(stk, pci, 6);
-       if (unit != 0 || excl != 0)
-               throw(SQL, "sql.count", SQLSTATE(42000) "OVER currently only 
supports frame extends with unit ROWS (and none of the excludes)");
+       ignore_nils = getArgReference_bit(stk, pci, 2);
+       unit = *getArgReference_int(stk, pci, 5);
+       start = *getArgReference_int(stk, pci, 6);
+       end = *getArgReference_int(stk, pci, 7);
+       excl = *getArgReference_int(stk, pci, 8);
 
+       if (isaBatType(tpe))
+               tpe = getBatType(tpe);
        if (isaBatType(getArgType(mb, pci, 1))) {
-               p = BATdescriptor(*getArgReference_bat(stk, pci, 1));
-               if (!p)
+               b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
+               if (!b)
                        throw(SQL, "sql.count", SQLSTATE(HY005) "Cannot access 
column descriptor");
        }
-       if (isaBatType(getArgType(mb, pci, 2))) {
-               o = BATdescriptor(*getArgReference_bat(stk, pci, 2));
-               if (!o) {
-                       BBPunfix(p->batCacheid);
+       if (b) {
+               BUN cnt = BATcount(b);
+               voidresultBAT(r, TYPE_lng, cnt, b, "sql.count");
+       }
+       if (isaBatType(getArgType(mb, pci, 3))) {
+               p = BATdescriptor(*getArgReference_bat(stk, pci, 3));
+               if (!p) {
+                       if (b) BBPunfix(b->batCacheid);
+                       if (r) BBPunfix(r->batCacheid);
                        throw(SQL, "sql.count", SQLSTATE(HY005) "Cannot access 
column descriptor");
                }
        }
-       cr = o?o:p?p:NULL;
-       if (cr) {
-               voidresultBAT(r, TYPE_lng, BATcount(cr), cr, "sql.count");
+       if (isaBatType(getArgType(mb, pci, 4))) {
+               o = BATdescriptor(*getArgReference_bat(stk, pci, 4));
+               if (!o) {
+                       if (b) BBPunfix(b->batCacheid);
+                       if (r) BBPunfix(r->batCacheid);
+                       if (p) BBPunfix(p->batCacheid);
+                       throw(SQL, "sql.count", SQLSTATE(HY005) "Cannot access 
column descriptor");
+               }
        }
 
-       if (isaBatType(tpe))
-               tpe = getBatType(tpe);
+       if (unit != 0 || excl != 0)
+               throw(SQL, "sql.count", SQLSTATE(42000) "OVER currently only 
supports frame extends with unit ROWS (and none of the excludes)");
+       (void)start;
+       (void)end;
 
-       if (cr) {
+       if (b) {
                bat *res = getArgReference_bat(stk, pci, 0);
 
-               gdk_res = GDKanalyticalcount(r, NULL, p, o, &ignore_nils, tpe);
+               gdk_res = GDKanalyticalcount(r, b, p, o, ignore_nils, tpe);
+               BBPunfix(b->batCacheid);
                if (p) BBPunfix(p->batCacheid);
                if (o) BBPunfix(o->batCacheid);
                if (gdk_res == GDK_SUCCEED)
@@ -689,50 +702,7 @@ SQLcount(Client cntxt, MalBlkPtr mb, Mal
                ptr *in = getArgReference(stk, pci, 1);
                *res = *in;
        }
-       return msg;
-}
-
-str
-SQLcount_no_nil(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       BAT *r, *b, *p, *o;
-       str msg = SQLanalytics_args(&r, &b, &p, &o, cntxt, mb, stk, pci, 
TYPE_lng, "sql.count_no_nil",
-                                                               SQLSTATE(42000) 
"count_no_nil(:any_1,:bit,:bit)");
-       int tpe = getArgType(mb, pci, 1);
-       int unit = *getArgReference_int(stk, pci, 4);
-       int start = *getArgReference_int(stk, pci, 5);
-       int end = *getArgReference_int(stk, pci, 6);
-       int excl = *getArgReference_int(stk, pci, 7);
-       gdk_return gdk_res;
-       bit ignore_nils = 1;
-
-       if (unit != 0 || excl != 0)
-               throw(SQL, "sql.count_no_nil", SQLSTATE(42000) "OVER currently 
only supports frame extends with unit ROWS (and none of the excludes)");
-       (void)start;
-       (void)end;
-
-       if (msg)
-               return msg;
-       if (isaBatType(tpe))
-               tpe = getBatType(tpe);
-
-       if (b) {
-               bat *res = getArgReference_bat(stk, pci, 0);
-
-               gdk_res = GDKanalyticalcount(r, b, p, o, &ignore_nils, tpe);
-               BBPunfix(b->batCacheid);
-               if (p) BBPunfix(p->batCacheid);
-               if (o) BBPunfix(o->batCacheid);
-               if (gdk_res == GDK_SUCCEED)
-                       BBPkeepref(*res = r->batCacheid);
-               else
-                       return createException(SQL, "sql.count_no_nil", 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       } else {
-               ptr *res = getArgReference(stk, pci, 0);
-               ptr *in = getArgReference(stk, pci, 1);
-               *res = *in;
-       }
-       return msg;
+       return MAL_SUCCEED;
 }
 
 static str
@@ -740,11 +710,7 @@ do_analytical_sumprod(Client cntxt, MalB
                                          gdk_return (*func)(BAT *, BAT *, BAT 
*, BAT *, int, int), const str op, const str err)
 {
        BAT *r = NULL, *b = NULL, *p = NULL, *o = NULL;
-       int tp1 = getArgType(mb, pci, 1), tp2;
-       int unit = *getArgReference_int(stk, pci, 4);
-       int start = *getArgReference_int(stk, pci, 5);
-       int end = *getArgReference_int(stk, pci, 6);
-       int excl = *getArgReference_int(stk, pci, 7);
+       int tp1, tp2, unit, start, end, excl;
        gdk_return gdk_res;
 
        (void) cntxt;
@@ -753,6 +719,12 @@ do_analytical_sumprod(Client cntxt, MalB
                (getArgType(mb, pci, 3) != TYPE_bit && 
getBatType(getArgType(mb, pci, 3)) != TYPE_bit)) {
                throw(SQL, op, "%s", err);
        }
+       tp1 = getArgType(mb, pci, 1);
+       unit = *getArgReference_int(stk, pci, 4);
+       start = *getArgReference_int(stk, pci, 5);
+       end = *getArgReference_int(stk, pci, 6);
+       excl = *getArgReference_int(stk, pci, 7);
+
        if (isaBatType(tp1))
                tp1 = getBatType(tp1);
        if (isaBatType(getArgType(mb, pci, 1))) {
diff --git a/sql/backends/monet5/sql_rank.h b/sql/backends/monet5/sql_rank.h
--- a/sql/backends/monet5/sql_rank.h
+++ b/sql/backends/monet5/sql_rank.h
@@ -21,7 +21,6 @@ sql5_export str SQLntile(Client cntxt, M
 sql5_export str SQLmin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLmax(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLcount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
-sql5_export str SQLcount_no_nil(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLprod(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLavg(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
diff --git a/sql/backends/monet5/sql_rank.mal b/sql/backends/monet5/sql_rank.mal
--- a/sql/backends/monet5/sql_rank.mal
+++ b/sql/backends/monet5/sql_rank.mal
@@ -80,22 +80,14 @@ pattern batsql.max(b:bat[:any_1], p:any_
 address SQLmax
 comment "return the maximum of groups";
 
-pattern sql.count(p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
+pattern sql.count(b:any_1, ignils:bit, p:bit, o:bit, unit:int, s:int, e:int, 
excl:int) :lng
 address SQLcount
 comment "return count of groups";
 
-pattern batsql.count(p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) 
:bat[:lng]
+pattern batsql.count(b:bat[:any_1], ignils:bit, p:any_2, o:any_3, unit:int, 
s:int, e:int, exl:int) :bat[:lng]
 address SQLcount
 comment "return count of groups";
 
-pattern sql.count(b:any_1, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLcount_no_nil
-comment "return count of groups";
-
-pattern batsql.count(b:bat[:any_1], p:any_2, o:any_3, unit:int, s:int, e:int, 
exl:int) :bat[:lng]
-address SQLcount_no_nil
-comment "return count of groups";
-
 pattern sql.ntile(b:bat[:any_1], n:bte, p:any_2, o:any_3) :bte
 address SQLntile
 comment "return the groups divided as equally as possible";
diff --git a/sql/backends/monet5/sql_rank.mal.sh 
b/sql/backends/monet5/sql_rank.mal.sh
--- a/sql/backends/monet5/sql_rank.mal.sh
+++ b/sql/backends/monet5/sql_rank.mal.sh
@@ -86,22 +86,14 @@ pattern batsql.max(b:bat[:any_1], p:any_
 address SQLmax
 comment "return the maximum of groups";
 
-pattern sql.count(p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
+pattern sql.count(b:any_1, ignils:bit, p:bit, o:bit, unit:int, s:int, e:int, 
excl:int) :lng
 address SQLcount
 comment "return count of groups";
 
-pattern batsql.count(p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) 
:bat[:lng]
+pattern batsql.count(b:bat[:any_1], ignils:bit, p:any_2, o:any_3, unit:int, 
s:int, e:int, exl:int) :bat[:lng]
 address SQLcount
 comment "return count of groups";
 
-pattern sql.count(b:any_1, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLcount_no_nil
-comment "return count of groups";
-
-pattern batsql.count(b:bat[:any_1], p:any_2, o:any_3, unit:int, s:int, e:int, 
exl:int) :bat[:lng]
-address SQLcount_no_nil
-comment "return count of groups";
-
 EOF
 
 for tp1 in 1:bte 2:sht 4:int 8:lng; do
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1586,8 +1586,7 @@ sqltypeinit( sql_allocator *sa)
        //sql_create_analytic(sa, "last_value", "sql", "last_value", ANY, NULL, 
BIT, BIT, ANY, SCALE_NONE);
        //sql_create_analytic(sa, "nth_value", "sql", "nth_value", ANY, NULL, 
BIT, BIT, ANY, SCALE_NONE);
 
-       sql_create_analytic(sa, "count", "sql", "count", BIT, NULL, BIT, NULL, 
LNG, SCALE_NONE);
-       sql_create_analytic(sa, "count", "sql", "count", ANY, NULL, BIT, BIT, 
LNG, SCALE_NONE);
+       sql_create_analytic(sa, "count", "sql", "count", ANY, BIT, BIT, BIT, 
LNG, SCALE_NONE);
        sql_create_analytic(sa, "min", "sql", "min", ANY, NULL, BIT, BIT, ANY, 
SCALE_NONE);
        sql_create_analytic(sa, "max", "sql", "max", ANY, NULL, BIT, BIT, ANY, 
SCALE_NONE);
 
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4569,11 +4569,19 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
                dnode *n = dn->next;
 
                if (n) {
-                       int is_last = 0;
-                       exp_kind ek = {type_value, card_column, FALSE};
-
-                       distinct = n->data.i_val;
-                       e1 = rel_value_exp2(sql, &p, n->next->data.sym, f, ek, 
&is_last);
+                       if (!n->next->data.sym) { /* count(*) */
+                               e1 = p->exps->h->data;
+                               e1 = exp_column(sql->sa, exp_relname(e1), 
exp_name(e1), exp_subtype(e1), exp_card(e1), has_nil(e1), is_intern(e1));
+                               e2 = exp_atom_bool(sql->sa, 0);
+                       } else {
+                               int is_last = 0;
+                               exp_kind ek = {type_value, card_column, FALSE};
+
+                               distinct = n->data.i_val;
+                               e1 = rel_value_exp2(sql, &p, n->next->data.sym, 
f, ek, &is_last);
+                               if(strcmp(s->base.name, "sys") == 0 && 
strcmp(aname, "count") == 0)
+                                       e2 = exp_atom_bool(sql->sa, 1);
+                       }
                }
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to