Changeset: fa0227021fc1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fa0227021fc1
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_rank.c
sql/common/sql_types.c
sql/server/rel_select.c
Branch: analytics
Log Message:
Cleanup and made min analytical function on integers working.
diffs (251 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -511,7 +511,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
}
es = stmt_uselect(be, es,
stmt_bool(be,1), cmp_equal, NULL, 0);
- } else /* need a condition */
+ } else if (f->func->type !=
F_ANALYTIC)/* need a condition */
cond_execution = es;
}
if (es->nrcols > nrcols)
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
@@ -35,11 +35,11 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
int (*cmp)(const void *, const void *);
BATiter it;
ptr v;
-
+
if (!b)
- throw(SQL, "sql.rank", SQLSTATE(HY005) "Cannot access
column descriptor");
+ throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot access
column descriptor");
cnt = (int)BATcount(b);
- voidresultBAT(r, TYPE_bit, cnt, b, "Cannot create bat");
+ voidresultBAT(r, TYPE_bit, cnt, b, "sql.diff");
rp = (bit*)Tloc(r, 0);
if (pci->argc > 2) {
c = b;
@@ -47,7 +47,7 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
b = BATdescriptor(*bid);
if (!b) {
BBPunfix(c->batCacheid);
- throw(SQL, "sql.rank", SQLSTATE(HY005) "Cannot
access column descriptor");
+ throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot
access column descriptor");
}
cmp = ATOMcompare(b->ttype);
@@ -64,8 +64,8 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
}
BBPunfix(c->batCacheid);
} else {
- cmp = ATOMcompare(b->ttype);
- it = bat_iterator(b);
+ cmp = ATOMcompare(b->ttype);
+ it = bat_iterator(b);
v = BUNtail(it, 0);
for(i=0; i<cnt; i++, rp++) {
@@ -105,7 +105,7 @@ SQLrow_number(Client cntxt, MalBlkPtr mb
if (!b)
throw(SQL, "sql.row_number", SQLSTATE(HY005) "Cannot
access column descriptor");
cnt = (int)BATcount(b);
- voidresultBAT(r, TYPE_int, cnt, b, "Cannot create bat");
+ voidresultBAT(r, TYPE_int, cnt, b, "sql.row_number");
rp = (int*)Tloc(r, 0);
if (isaBatType(getArgType(mb, pci, 2))) {
/* order info not used */
@@ -154,7 +154,7 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
if (!b)
throw(SQL, "sql.rank", SQLSTATE(HY005) "Cannot access
column descriptor");
cnt = (int)BATcount(b);
- voidresultBAT(r, TYPE_int, cnt, b, "Cannot create bat");
+ voidresultBAT(r, TYPE_int, cnt, b, "sql.rank");
rp = (int*)Tloc(r, 0);
if (isaBatType(getArgType(mb, pci, 2))) {
if (isaBatType(getArgType(mb, pci, 3))) {
@@ -227,7 +227,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
if (pci->argc != 4 ||
(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, "sql.rank", SQLSTATE(42000)
"dense_rank(:any_1,:bit,:bit)");
+ throw(SQL, "sql.dense_rank", SQLSTATE(42000)
"dense_rank(:any_1,:bit,:bit)");
}
(void)cntxt;
if (isaBatType(getArgType(mb, pci, 1))) {
@@ -239,7 +239,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
if (!b)
throw(SQL, "sql.dense_rank", SQLSTATE(HY005) "Cannot
access column descriptor");
cnt = (int)BATcount(b);
- voidresultBAT(r, TYPE_int, cnt, b, "Cannot create bat");
+ voidresultBAT(r, TYPE_int, cnt, b, "sql.dense_rank");
rp = (int*)Tloc(r, 0);
if (isaBatType(getArgType(mb, pci, 2))) {
if (isaBatType(getArgType(mb, pci, 3))) {
@@ -307,7 +307,7 @@ 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)
+SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o, Client cntxt, MalBlkPtr
mb, MalStkPtr stk, InstrPtr pci, const str mod, const str err)
{
*r = *b = *p = *o = NULL;
@@ -320,11 +320,11 @@ SQLanalytics_args(BAT **r, BAT **b, BAT
if (isaBatType(getArgType(mb, pci, 1))) {
*b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
if (!*b)
- throw(SQL, mod, "Cannot access descriptor");
+ throw(SQL, mod, SQLSTATE(HY005) "Cannot access column
descriptor");
}
if (b) {
size_t cnt = BATcount(*b);
- voidresultBAT((*r), (*b)->ttype, cnt, (*b), "Cannot create
bat");
+ voidresultBAT((*r), (*b)->ttype, cnt, (*b), mod);
if (!*r)
if (*b) BBPunfix((*b)->batCacheid);
}
@@ -333,7 +333,7 @@ SQLanalytics_args(BAT **r, BAT **b, BAT
if (!*p) {
if (*b) BBPunfix((*b)->batCacheid);
if (*r) BBPunfix((*r)->batCacheid);
- throw(SQL, mod, "Cannot access descriptor");
+ throw(SQL, mod, SQLSTATE(HY005) "Cannot access column
descriptor");
}
}
if (isaBatType(getArgType(mb, pci, 3))) {
@@ -342,18 +342,18 @@ SQLanalytics_args(BAT **r, BAT **b, BAT
if (*b) BBPunfix((*b)->batCacheid);
if (*r) BBPunfix((*r)->batCacheid);
if (*p) BBPunfix((*p)->batCacheid);
- throw(SQL, mod, "Cannot access descriptor");
+ throw(SQL, mod, SQLSTATE(HY005) "Cannot access column
descriptor");
}
}
- return NULL;
+ return MAL_SUCCEED;
}
str
SQLmin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
BAT *r, *b, *p, *o;
- str res = SQLanalytics_args( &r, &b, &p, &o, cntxt, mb, stk, pci,
"sql.min", "min(:any_1,:bit,:bit)");
- int tpe = getArgType(mb, pci, 1);
+ str msg = SQLanalytics_args( &r, &b, &p, &o, cntxt, mb, stk, pci,
"sql.min", "min(: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);
@@ -366,8 +366,8 @@ SQLmin(Client cntxt, MalBlkPtr mb, MalSt
if (isaBatType(tpe))
tpe = getBatType(tpe);
- if (res)
- return res;
+ if (msg)
+ return msg;
/*
switch(ATOMstorage(tpe)) {
@@ -388,34 +388,32 @@ SQLmin(Client cntxt, MalBlkPtr mb, MalSt
/* FOR NOW only int input type !! */
if (b) {
bat *res = getArgReference_bat(stk, pci, 0);
- int i, j, cnt, *rp, *rb, *bp, curval;
+ int i, j, cnt;
+ int *rp, *rb, *bp, curval;
bit *np, *no;
-
+
cnt = (int)BATcount(b);
rb = rp = (int*)Tloc(r, 0);
bp = (int*)Tloc(b, 0);
curval = *bp;
if (p) {
if (o) {
- np = (bit*)Tloc(p, 0);
- no = (bit*)Tloc(o, 0);
- for(i=1,j=1; i<=cnt; i++, np++, no++, rp++,
bp++) {
+ np = (bit*)Tloc(p, 0);
+ no = (bit*)Tloc(o, 0);
+ for(i=1; i<=cnt; i++, np++, no++, rp++, bp++) {
if (*np) {
- j=1;
for (;rb < rp; rb++)
*rb = curval;
curval = *bp;
- } else if (*no)
- j++;
+ }
curval = MIN(*bp,curval);
}
for (;rb < rp; rb++)
*rb = curval;
} else { /* single value, ie no ordering */
- np = (bit*)Tloc(p, 0);
- for(i=1,j=1; i<=cnt; i++, np++, rp++, bp++) {
+ np = (bit*)Tloc(p, 0);
+ for(i=1; i<=cnt; i++, np++, rp++, bp++) {
if (*np) {
- j=1;
for (;rb < rp; rb++)
*rb = curval;
curval = *bp;
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
@@ -1567,8 +1567,7 @@ sqltypeinit( sql_allocator *sa)
sql_create_analytic(sa, "dense_rank", "sql", "dense_rank", ANY, BIT,
BIT, INT, SCALE_NONE);
sql_create_analytic(sa, "row_number", "sql", "row_number", ANY, BIT,
BIT, INT, SCALE_NONE);
-
- //sql_create_analytic(sa, "percent_rank", "sql", "precent_rank", ANY,
BIT, BIT, INT, SCALE_NONE);
+ //sql_create_analytic(sa, "percent_rank", "sql", "percent_rank", ANY,
BIT, BIT, INT, SCALE_NONE);
//sql_create_analytic(sa, "cume_dist", "sql", "cume_dist", ANY, BIT,
BIT, ANY, SCALE_NONE);
//sql_create_analytic(sa, "lag", "sql", "lag", ANY, BIT, BIT, ANY,
SCALE_NONE);
//sql_create_analytic(sa, "lead", "sql", "lead", ANY, 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
@@ -4446,7 +4446,7 @@ rel_frame(mvc *sql, symbol *frame, list
* a = project( table ) [ x, y, z, w, v ], [ x, y]
* b = project( table ) [ x, y, z, w, v ], [ y, x]
*
- * project with order dependend operators, ie combined prev/current value
+ * project with order dependent operators, ie combined prev/current value
* aa = project (a) [ x, y, r = rank_op(diff(x) (marks a new partition),
rediff(diff(x), y) (marks diff value with in partition)), z, w, v ]
* project(aa) [ aa.x, aa.y, aa.r ] -- only keep current output list
* bb = project (b) [ x, y, a = aggr_op(z, diff(y), rediff(diff(y), x)), z, w,
v ]
@@ -4467,7 +4467,7 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
list *gbe = NULL, *obe = NULL, *fbe = NULL, *args, *types;
sql_schema *s = sql->session->schema;
int distinct = 0, project_added = 0, aggr = 0;
-
+
if (window_function->token == SQL_RANK) {
aname = qname_fname(window_function->data.lval);
sname = qname_schema(window_function->data.lval);
@@ -4515,7 +4515,7 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
obe = rel_order_by(sql, &p,
window_specification->h->next->data.sym, f);
if (!obe)
return NULL;
- /* conditionaly? */
+ /* conditionally? */
g = p->l;
if (g->op == op_groupby) {
list_merge(p->exps, obe, (fdup)NULL);
@@ -4527,6 +4527,11 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
} else {
p->r = obe;
}
+ } else if(aggr && p->r) { //set ascending order by default for
aggregations
+ for(node *nn = ((list*)p->r)->h ; nn ; nn = nn->next) {
+ sql_exp *en = nn->data;
+ set_direction(en, 1);
+ }
}
/* Frame */
if (window_specification->h->next->next->data.sym) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list