Changeset: a57bb0d1a461 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a57bb0d1a461
Modified Files:
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
Branch: analytics
Log Message:
Cleaned SQLsum and SQLprod implementations.
diffs (truncated from 531 to 300 lines):
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
@@ -737,10 +737,9 @@ SQLcount_no_nil(Client cntxt, MalBlkPtr
static str
do_analytical_sumprod(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci,
- gdk_return (*func)(BAT *, BAT *, BAT
*, BAT *, int, int), int tpe, const str op, const str err)
+ gdk_return (*func)(BAT *, BAT *, BAT
*, BAT *, int, int), const str op, const str err)
{
- BAT *r, *b, *p, *o;
- str msg = SQLanalytics_args(&r, &b, &p, &o, cntxt, mb, stk, pci, tpe,
op, 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);
@@ -748,19 +747,73 @@ do_analytical_sumprod(Client cntxt, MalB
int excl = *getArgReference_int(stk, pci, 7);
gdk_return gdk_res;
+ (void) cntxt;
+ 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, op, "%s", err);
+ }
+ if (isaBatType(tp1))
+ tp1 = getBatType(tp1);
+ if (isaBatType(getArgType(mb, pci, 1))) {
+ b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
+ if (!b)
+ throw(SQL, op, SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ switch (tp1) {
+ case TYPE_bte:
+ case TYPE_sht:
+ case TYPE_int:
+ case TYPE_lng:
+#ifdef HAVE_HGE
+ case TYPE_hge:
+#endif
+#ifdef HAVE_HGE
+ tp2 = TYPE_hge;
+#else
+ tp2 = TYPE_lng;
+#endif
+ break;
+ case TYPE_flt:
+ tp2 = TYPE_flt;
+ break;
+ case TYPE_dbl:
+ tp2 = TYPE_dbl;
+ break;
+ default: {
+ if(b) BBPunfix(b->batCacheid);
+ throw(SQL, op, SQLSTATE(42000) "%s not available for
%s", op, ATOMname(tp1));
+ }
+ }
+ if (b) {
+ BUN cnt = BATcount(b);
+ voidresultBAT(r, tp2, cnt, b, op);
+ }
+ if (isaBatType(getArgType(mb, pci, 2))) {
+ p = BATdescriptor(*getArgReference_bat(stk, pci, 2));
+ if (!p) {
+ if (b) BBPunfix(b->batCacheid);
+ if (r) BBPunfix(r->batCacheid);
+ throw(SQL, op, SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ }
+ if (isaBatType(getArgType(mb, pci, 3))) {
+ o = BATdescriptor(*getArgReference_bat(stk, pci, 3));
+ if (!o) {
+ if (b) BBPunfix(b->batCacheid);
+ if (r) BBPunfix(r->batCacheid);
+ if (p) BBPunfix(p->batCacheid);
+ throw(SQL, op, SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ }
+
if (unit != 0 || excl != 0)
throw(SQL, op, 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(tp1))
- tp1 = getBatType(tp1);
-
if (b) {
bat *res = getArgReference_bat(stk, pci, 0);
- tp2 = getBatType(r->T.type);
gdk_res = func(r, b, p, o, tp1, tp2);
BBPunfix(b->batCacheid);
@@ -773,59 +826,21 @@ do_analytical_sumprod(Client cntxt, MalB
ptr *in = getArgReference(stk, pci, 1);
*res = *in;
}
- return msg;
+ return MAL_SUCCEED;
}
str
-SQLscalarsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+SQLsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- ValPtr ret = &stk->stk[getArg(pci, 0)];
- return do_analytical_sumprod(cntxt, mb, stk, pci, GDKanalyticalsum,
ret->vtype,
- "sql.sum",
SQLSTATE(42000) "sum(:any_1,:bit,:bit)");
-}
-
-#define SQLVECTORSUM(TPE)
\
-str
\
-SQLvectorsum_##TPE(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
\
-{
\
- return do_analytical_sumprod(cntxt, mb, stk, pci, GDKanalyticalsum,
TYPE_##TPE, \
- "sql.sum",
SQLSTATE(42000) "sum(:any_1,:bit,:bit)"); \
+ return do_analytical_sumprod(cntxt, mb, stk, pci, GDKanalyticalsum,
"sql.sum", SQLSTATE(42000) "sum(:any_1,:bit,:bit)");
}
-SQLVECTORSUM(lng)
-#ifdef HAVE_HGE
-SQLVECTORSUM(hge)
-#endif
-SQLVECTORSUM(flt)
-SQLVECTORSUM(dbl)
-
-#undef SQLVECTORSUM
-
str
-SQLscalarprod(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+SQLprod(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- ValPtr ret = &stk->stk[getArg(pci, 0)];
- return do_analytical_sumprod(cntxt, mb, stk, pci, GDKanalyticalprod,
ret->vtype,
- "sql.prod",
SQLSTATE(42000) "prod(:any_1,:bit,:bit)");
+ return do_analytical_sumprod(cntxt, mb, stk, pci, GDKanalyticalprod,
"sql.prod", SQLSTATE(42000) "prod(:any_1,:bit,:bit)");
}
-#define SQLVECTORPROD(TPE)
\
-str
\
-SQLvectorprod_##TPE(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
\
-{
\
- return do_analytical_sumprod(cntxt, mb, stk, pci, GDKanalyticalprod,
TYPE_##TPE, \
- "sql.prod",
SQLSTATE(42000) "prod(:any_1,:bit,:bit)"); \
-}
-
-SQLVECTORPROD(lng)
-SQLVECTORPROD(flt)
-SQLVECTORPROD(dbl)
-#ifdef HAVE_HGE
-SQLVECTORPROD(hge)
-#endif
-
-#undef SQLVECTORPROD
-
str
SQLavg(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
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
@@ -22,32 +22,8 @@ sql5_export str SQLmin(Client cntxt, Mal
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 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
-
-sql5_export str SQLscalarprod(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
-
-#define SQLVECTORPROD(TPE) sql_export str SQLvectorprod_##TPE(Client cntxt,
MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
-
-SQLVECTORPROD(lng)
-SQLVECTORPROD(flt)
-SQLVECTORPROD(dbl)
-#ifdef HAVE_HGE
-SQLVECTORPROD(hge)
-#endif
-
-#undef SQLVECTORPROD
-
+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);
#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
@@ -129,115 +129,115 @@ address SQLntile
comment "return the groups divided as equally as possible";
pattern sql.sum(b:bte, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarsum
+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[:lng]
-address SQLvectorsum_lng
+address SQLsum
comment "return the sum of groups";
pattern sql.prod(b:bte, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarprod
+address SQLprod
comment "return the product of groups";
pattern batsql.prod(b:bat[:bte], p:any_1, o:any_2, unit:int, s:int, e:int,
exl:int) :bat[:lng]
-address SQLvectorprod_lng
+address SQLprod
comment "return the product of groups";
pattern sql.sum(b:sht, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarsum
+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[:lng]
-address SQLvectorsum_lng
+address SQLsum
comment "return the sum of groups";
pattern sql.prod(b:sht, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarprod
+address SQLprod
comment "return the product of groups";
pattern batsql.prod(b:bat[:sht], p:any_1, o:any_2, unit:int, s:int, e:int,
exl:int) :bat[:lng]
-address SQLvectorprod_lng
+address SQLprod
comment "return the product of groups";
pattern sql.sum(b:int, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarsum
+address SQLsum
comment "return the sum of groups";
pattern batsql.sum(b:bat[:int], p:any_1, o:any_2, unit:int, s:int, e:int,
exl:int) :bat[:lng]
-address SQLvectorsum_lng
+address SQLsum
comment "return the sum of groups";
pattern sql.prod(b:int, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarprod
+address SQLprod
comment "return the product of groups";
pattern batsql.prod(b:bat[:int], p:any_1, o:any_2, unit:int, s:int, e:int,
exl:int) :bat[:lng]
-address SQLvectorprod_lng
+address SQLprod
comment "return the product of groups";
pattern sql.sum(b:lng, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarsum
+address SQLsum
comment "return the sum of groups";
pattern batsql.sum(b:bat[:lng], p:any_1, o:any_2, unit:int, s:int, e:int,
exl:int) :bat[:lng]
-address SQLvectorsum_lng
+address SQLsum
comment "return the sum of groups";
pattern sql.prod(b:lng, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :lng
-address SQLscalarprod
+address SQLprod
comment "return the product of groups";
pattern batsql.prod(b:bat[:lng], p:any_1, o:any_2, unit:int, s:int, e:int,
exl:int) :bat[:lng]
-address SQLvectorprod_lng
+address SQLprod
comment "return the product of groups";
pattern sql.sum(b:flt, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :flt
-address SQLscalarsum
+address SQLsum
comment "return the sum of groups";
pattern batsql.sum(b:bat[:flt], p:any_1, o:any_2, unit:int, s:int, e:int,
exl:int) :bat[:flt]
-address SQLvectorsum_flt
+address SQLsum
comment "return the sum of groups";
pattern sql.prod(b:flt, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :flt
-address SQLscalarprod
+address SQLprod
comment "return the product of groups";
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list