Changeset: cbccc31347b6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cbccc31347b6 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/backends/monet5/sql_rank_hge.mal sql/backends/monet5/sql_rank_hge.mal.sh sql/common/sql_types.c sql/server/rel_select.c sql/test/analytics/Tests/analytics00.sql Branch: analytics Log Message:
Implemented count with and without nils in a window. I'm still having problems calculating the sum of a window into a huge integer :/ diffs (truncated from 609 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 @@ -279,11 +279,13 @@ ANALYTICAL_LIMIT(max, MAX, <) gdk_return GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const bit *ignore_nils, int tpe) { - BUN i, cnt = BATcount(b); + BUN i, cnt; gdk_return gdk_res = GDK_SUCCEED; - (void) o; - if(*ignore_nils || b->T.nonil) { + assert(b || p || o); + cnt = BATcount(b?b:p?p:o); + + if(!*ignore_nils || !b || 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 @@ -309,13 +309,13 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb static str SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o, Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, - const str mod, const str err) + int rtype, const str mod, const str err) { *r = *b = *p = *o = NULL; (void)cntxt; - if (pci->argc != 8 || - (getArgType(mb, pci, 2) != TYPE_bit && getBatType(getArgType(mb, pci, 2)) != TYPE_bit) || + if (pci->argc != 8 || + (getArgType(mb, pci, 2) != TYPE_bit && getBatType(getArgType(mb, pci, 2)) != TYPE_bit) || (getArgType(mb, pci, 3) != TYPE_bit && getBatType(getArgType(mb, pci, 3)) != TYPE_bit)){ throw(SQL, mod, "%s", err); } @@ -326,9 +326,9 @@ SQLanalytics_args(BAT **r, BAT **b, BAT } if (b) { size_t cnt = BATcount(*b); - voidresultBAT((*r), (*b)->ttype, cnt, (*b), mod); - if (!*r) - if (*b) BBPunfix((*b)->batCacheid); + voidresultBAT((*r), rtype ? rtype : (*b)->ttype, cnt, (*b), mod); + if (!*r && *b) + BBPunfix((*b)->batCacheid); } if (isaBatType(getArgType(mb, pci, 2))) { *p = BATdescriptor(*getArgReference_bat(stk, pci, 2)); @@ -338,7 +338,7 @@ SQLanalytics_args(BAT **r, BAT **b, BAT throw(SQL, mod, SQLSTATE(HY005) "Cannot access column descriptor"); } } - if (isaBatType(getArgType(mb, pci, 3))) { + if (isaBatType(getArgType(mb, pci, 3))) { *o = BATdescriptor(*getArgReference_bat(stk, pci, 3)); if (!*o) { if (*b) BBPunfix((*b)->batCacheid); @@ -356,7 +356,7 @@ SQLanalytical_func(Client cntxt, MalBlkP gdk_return (*func)(BAT *, BAT *, BAT *, BAT *, int)) { BAT *r, *b, *p, *o; - str msg = SQLanalytics_args(&r, &b, &p, &o, cntxt, mb, stk, pci, op, err); + str msg = SQLanalytics_args(&r, &b, &p, &o, cntxt, mb, stk, pci, 0, op, err); int tpe = getArgType(mb, pci, 1); int unit = *getArgReference_int(stk, pci, 4); int start = *getArgReference_int(stk, pci, 5); @@ -402,24 +402,88 @@ SQLmin(Client cntxt, MalBlkPtr mb, MalSt str SQLmax(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - return SQLanalytical_func(cntxt, mb, stk, pci, "sql.max", SQLSTATE(42000) "max(:any_1,:bit,:bit)", GDKanalyticalmax); + return SQLanalytical_func(cntxt, mb, stk, pci, "sql.max", SQLSTATE(42000) "max(:any_1,:bit,:bit)", GDKanalyticalmax); } 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, start, end, excl; + bit ignore_nils = 0; + gdk_return gdk_res; + + (void)start; + (void)end; + (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)"); + } + + 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)"); + + if (isaBatType(getArgType(mb, pci, 1))) { + p = BATdescriptor(*getArgReference_bat(stk, pci, 1)); + if (!p) + 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); + 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(tpe)) + tpe = getBatType(tpe); + + if (cr) { + bat *res = getArgReference_bat(stk, pci, 0); + + gdk_res = GDKanalyticalcount(r, NULL, p, o, &ignore_nils, tpe); + 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", SQLSTATE(HY001) MAL_MALLOC_FAIL); + } else { + ptr *res = getArgReference(stk, pci, 0); + 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, "sql.count", SQLSTATE(42000) "count(:any_1,:bit,:bit)"); + 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; - gdk_return gdk_res; 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)"); + 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; @@ -438,7 +502,7 @@ SQLcount(Client cntxt, MalBlkPtr mb, Mal if (gdk_res == GDK_SUCCEED) BBPkeepref(*res = r->batCacheid); else - return createException(SQL, "sql.count", SQLSTATE(HY001) MAL_MALLOC_FAIL); + 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); @@ -447,11 +511,11 @@ SQLcount(Client cntxt, MalBlkPtr mb, Mal return msg; } -str -SQLsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +static str +do_analytical_sum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int tpe) { BAT *r, *b, *p, *o; - str msg = SQLanalytics_args(&r, &b, &p, &o, cntxt, mb, stk, pci, "sql.sum", "sum(:any_1,:bit,:bit)"); + str msg = SQLanalytics_args(&r, &b, &p, &o, cntxt, mb, stk, pci, tpe, "sql.sum", SQLSTATE(42000) "sum(:any_1,:bit,:bit)"); int tp1 = getArgType(mb, pci, 1), tp2; int unit = *getArgReference_int(stk, pci, 4); int start = *getArgReference_int(stk, pci, 5); @@ -486,3 +550,26 @@ SQLsum(Client cntxt, MalBlkPtr mb, MalSt } return msg; } + +str +SQLscalarsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + ValPtr ret = &stk->stk[getArg(pci, 0)]; + return do_analytical_sum(cntxt, mb, stk, pci, ret->vtype); +} + +#define SQLVECTORSUM(TPE) \ +str \ +SQLvectorsum_##TPE(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) \ +{ \ + return do_analytical_sum(cntxt, mb, stk, pci, TYPE_##TPE); \ +} + +SQLVECTORSUM(lng) +#ifdef HAVE_HGE +SQLVECTORSUM(hge) +#endif +SQLVECTORSUM(flt) +SQLVECTORSUM(dbl) + +#undef SQLVECTORSUM 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 @@ -18,6 +18,18 @@ sql5_export str SQLdense_rank(Client cnt 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 SQLsum(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 SQLscalarsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); + +#define SQLVECTORSUM(TPE) sql_export str SQLvectorsum_##TPE(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); + +SQLVECTORSUM(lng) +SQLVECTORSUM(flt) +SQLVECTORSUM(dbl) +#ifdef HAVE_HGE +SQLVECTORSUM(hge) +#endif + +#undef SQLVECTORSUM #endif /* _SQL_RANK_H */ 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 @@ -64,116 +64,76 @@ pattern batsql.max(b:bat[:any_1], p:any_ address SQLmax comment "return the maximum of groups"; -pattern sql.count(b:any_1, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng +pattern sql.count(p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng address SQLcount 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] +pattern batsql.count(p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) :bat[:lng] address SQLcount comment "return count of groups"; -pattern sql.sum(b:bte, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :bte -address SQLsum -comment "return the sum of groups"; - -pattern batsql.sum(b:bat[:bte], p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) :bat[:bte] -address SQLsum -comment "return the sum of groups"; - -pattern sql.sum(b:bte, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :sht -address SQLsum -comment "return the sum 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.sum(b:bat[:bte], p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) :bat[:sht] -address SQLsum -comment "return the sum of groups"; - -pattern sql.sum(b:bte, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :int -address SQLsum -comment "return the sum of groups"; - -pattern batsql.sum(b:bat[:bte], p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) :bat[:int] -address SQLsum -comment "return the sum 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.sum(b:bte, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng -address SQLsum +address SQLscalarsum comment "return the sum of groups"; pattern batsql.sum(b:bat[:bte], p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) :bat[:lng] -address SQLsum -comment "return the sum of groups"; - -pattern sql.sum(b:sht, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :sht -address SQLsum -comment "return the sum of groups"; - -pattern batsql.sum(b:bat[:sht], p:any_1, o:any_2, unit:int, s:int, e:int, exl:int) :bat[:sht] -address SQLsum _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list