Changeset: 6b4f34610cfc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6b4f34610cfc
Modified Files:
sql/backends/monet5/rel_bin.c
sql/scripts/39_analytics.sql
sql/server/rel_propagate.c
sql/server/rel_psm.c
sql/server/rel_select.c
sql/server/rel_select.h
sql/server/rel_sequence.c
sql/server/rel_updates.c
Branch: statistics-analytics
Log Message:
Some changes.
- Removed is_last flag from rel_value_exp2 as it is not used.
- Removed date,time and timestamp types from stdev_samp (not usefull).
- Added multiple argument compiling for aggregates as window functions.
diffs (truncated from 328 to 300 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
@@ -1294,10 +1294,9 @@ rel_parse_value(backend *be, char *query
if (m->sym->token == SQL_SELECT) {
SelectNode *sn = (SelectNode *)m->sym;
if (sn->selection->h->data.sym->token == SQL_COLUMN ||
sn->selection->h->data.sym->token == SQL_IDENT) {
- int is_last = 0;
sql_rel *rel = NULL;
sql_query *query = query_create(m);
- sql_exp *e = rel_value_exp2(query, &rel,
sn->selection->h->data.sym->data.lval->h->data.sym, sql_sel, ek, &is_last);
+ sql_exp *e = rel_value_exp2(query, &rel,
sn->selection->h->data.sym->data.lval->h->data.sym, sql_sel, ek);
if (!rel)
s = exp_bin(be, e, NULL, NULL, NULL, NULL,
NULL, NULL);
diff --git a/sql/scripts/39_analytics.sql b/sql/scripts/39_analytics.sql
--- a/sql/scripts/39_analytics.sql
+++ b/sql/scripts/39_analytics.sql
@@ -58,15 +58,6 @@ create window stddev_samp(val DOUBLE) re
external name "sql"."stdev";
GRANT EXECUTE ON WINDOW stddev_samp(DOUBLE) TO PUBLIC;
-create window stddev_samp(val DATE) returns DOUBLE
- external name "sql"."stdev";
-GRANT EXECUTE ON WINDOW stddev_samp(DATE) TO PUBLIC;
-create window stddev_samp(val TIME) returns DOUBLE
- external name "sql"."stdev";
-GRANT EXECUTE ON WINDOW stddev_samp(TIME) TO PUBLIC;
-create window stddev_samp(val TIMESTAMP) returns DOUBLE
- external name "sql"."stdev";
-GRANT EXECUTE ON WINDOW stddev_samp(TIMESTAMP) TO PUBLIC;
create window stddev_samp(val INTERVAL SECOND) returns DOUBLE
external name "sql"."stdev";
GRANT EXECUTE ON WINDOW stddev_samp(INTERVAL SECOND) TO PUBLIC;
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -159,9 +159,8 @@ generate_partition_limits(sql_query *que
}
return exp_atom(sql->sa, amax);
} else {
- int is_last = 0;
exp_kind ek = {type_value, card_value, FALSE};
- sql_exp *e = rel_value_exp2(query, r, s, sql_sel, ek, &is_last);
+ sql_exp *e = rel_value_exp2(query, r, s, sql_sel, ek);
if (!e)
return NULL;
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -89,7 +89,7 @@ psm_set_exp(sql_query *query, dnode *n)
mvc *sql = query->sql;
symbol *val = n->next->data.sym;
sql_exp *e = NULL;
- int level = 0, is_last = 0;
+ int level = 0;
sql_subtype *tpe = NULL;
sql_rel *rel = NULL;
sql_exp *res = NULL;
@@ -114,7 +114,7 @@ psm_set_exp(sql_query *query, dnode *n)
tpe = stack_find_type(sql, name);
}
- e = rel_value_exp2(query, &rel, val, sql_sel, ek, &is_last);
+ e = rel_value_exp2(query, &rel, val, sql_sel, ek);
if (!e || (rel && e->card > CARD_AGGR))
return NULL;
@@ -482,12 +482,11 @@ rel_psm_return( sql_query *query, sql_su
exp_kind ek = {type_value, card_value, FALSE};
sql_exp *res;
sql_rel *rel = NULL;
- int is_last = 0;
list *l = sa_list(sql->sa);
if (restypelist)
ek.card = card_relation;
- res = rel_value_exp2(query, &rel, return_sym, sql_sel, ek, &is_last);
+ res = rel_value_exp2(query, &rel, return_sym, sql_sel, ek);
if (!res)
return NULL;
if (!rel && exp_is_rel(res))
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
@@ -3203,7 +3203,7 @@ static sql_exp *
if (args && args->data.sym) {
int all_aggr = query_has_outer(query);
all_freevar = 1;
- for ( ; args && args->next; args = args->next ) {
+ for ( ; args && args->next; args = args->next ) { /* the last
dnode is the distinct flag */
int base = (!groupby || !is_project(groupby->op) ||
is_base(groupby->op) || is_processed(groupby));
sql_rel *gl = base?groupby:groupby->l, *ogl = gl; /*
handle case of subqueries without correlation */
sql_exp *e = rel_value_exp(query, &gl, args->data.sym,
(f | sql_aggr)& ~sql_farg, ek);
@@ -3836,9 +3836,8 @@ static sql_exp*
rel_group_column(sql_query *query, sql_rel **rel, symbol *grp, dlist
*selection, int f)
{
mvc *sql = query->sql;
- int is_last = 1;
exp_kind ek = {type_value, card_value, TRUE};
- sql_exp *e = rel_value_exp2(query, rel, grp, f, ek, &is_last);
+ sql_exp *e = rel_value_exp2(query, rel, grp, f, ek);
if (!e) {
char buf[ERRSIZE];
@@ -4014,9 +4013,8 @@ rel_partition_groupings(sql_query *query
for (; o; o = o->next) {
symbol *grp = o->data.sym;
- int is_last = 1;
exp_kind ek = {type_value, card_value, TRUE};
- sql_exp *e = rel_value_exp2(query, rel, grp, f, ek, &is_last);
+ sql_exp *e = rel_value_exp2(query, rel, grp, f, ek);
if (!e) {
int status = sql->session->status;
@@ -4167,10 +4165,9 @@ rel_order_by(sql_query *query, sql_rel *
order->data.lval->h->next = NULL;
}
if (col->token == SQL_COLUMN || col->token == SQL_IDENT
|| col->token == SQL_ATOM) {
- int is_last = 0;
exp_kind ek = {type_value, card_column, FALSE};
- e = rel_value_exp2(query, &rel, col, f, ek,
&is_last);
+ e = rel_value_exp2(query, &rel, col, f, ek);
if (e && e->card <= CARD_ATOM) {
sql_subtype *tpe = &e->tpe;
@@ -4335,7 +4332,6 @@ calculate_window_bound(sql_query *query,
}
res = exp_atom(sql->sa, a);
} else { /* arbitrary expression case */
- int is_last = 0;
exp_kind ek = {type_value, card_column, FALSE};
const char* bound_desc = (token == SQL_PRECEDING) ? "PRECEDING"
: "FOLLOWING";
iet = exp_subtype(ie);
@@ -4347,7 +4343,7 @@ calculate_window_bound(sql_query *query,
sql->args[bound->data.lval->h->data.i_val]->isnull)) {
return sql_error(sql, 02, SQLSTATE(42000) "%s offset
must not be NULL", bound_desc);
}
- res = rel_value_exp2(query, &p, bound, f, ek, &is_last);
+ res = rel_value_exp2(query, &p, bound, f, ek);
if (!res)
return NULL;
bt = exp_subtype(res);
@@ -4464,7 +4460,7 @@ rel_rankop(sql_query *query, sql_rel **r
list *gbe = NULL, *obe = NULL, *args = NULL, *types = NULL, *fargs =
NULL;
sql_schema *s = sql->session->schema;
dnode *dn = window_function->data.lval->h;
- int distinct = 0, is_last, frame_type, pos, nf = f;
+ int distinct = 0, frame_type, pos, nf = f;
bool is_nth_value, supports_frames;
stack_clear_frame_visited_flag(sql); /* clear visited flags before
iterating */
@@ -4571,11 +4567,11 @@ rel_rankop(sql_query *query, sql_rel **r
nfargs++;
}
if (dnn) {
- for(dnode *nn = dnn->h ; nn ; nn = nn->next) {
- is_last = 0;
+ for (dnode *nn = dnn->h ; nn ; nn = nn->next) {
exp_kind ek = {type_value, card_column, FALSE};
- in = rel_value_exp2(query, &p, nn->data.sym, f
| sql_window, ek, &is_last);
- if(!in)
+
+ in = rel_value_exp2(query, &p, nn->data.sym, f
| sql_window, ek);
+ if (!in)
return NULL;
if(is_ntile && nfargs == 1) { /* ntile first
argument null handling case */
sql_subtype *empty =
sql_bind_localtype("void");
@@ -4602,40 +4598,38 @@ rel_rankop(sql_query *query, sql_rel **r
}
} else { /* aggregation function call */
dnode *n = dn->next;
-
- if (n) {
- if (!n->data.sym) { /* count(*) */
- in = rel_first_column(sql, p);
- if (!exp_name(in))
- exp_label(sql->sa, in, ++sql->label);
- in = exp_ref(sql->sa, in);
- append(fargs, in);
- append(fargs, exp_atom_bool(sql->sa, 0)); /*
don't ignore nills */
- in = exp_ref_save(sql, in);
- } else {
- is_last = 0;
- exp_kind ek = {type_value, card_column, FALSE};
-
- distinct = n->next->data.i_val;
- /*
- * all aggregations implemented in a window
have 1 and only 1 argument only, so for now no further
- * symbol compilation is required
- */
- in = rel_value_exp2(query, &p, n->data.sym, f |
sql_window, ek, &is_last);
- if(!in)
- return NULL;
-
- append(fargs, in);
- if(strcmp(s->base.name, "sys") == 0 &&
strcmp(aname, "count") == 0) {
- sql_subtype *empty =
sql_bind_localtype("void"), *bte = sql_bind_localtype("bte");
- sql_exp* eo = fargs->h->data;
- /* corner case, if the argument is null
convert it into something countable such as bte */
- if(subtype_cmp(&(eo->tpe), empty) == 0)
- fargs->h->data =
exp_convert(sql->sa, eo, empty, bte);
- append(fargs, exp_atom_bool(sql->sa,
1)); /* ignore nills */
- }
- in = exp_ref_save(sql, in);
+ bool has_args = false;
+
+ for ( ; n->next && n->data.sym ; n = n->next) { /* the last
dnode is the distinct flag */
+ exp_kind ek = {type_value, card_column, FALSE};
+
+ has_args = true;
+ in = rel_value_exp2(query, &p, n->data.sym, f |
sql_window, ek);
+ if (!in)
+ return NULL;
+
+ append(fargs, in);
+ if (strcmp(s->base.name, "sys") == 0 && strcmp(aname,
"count") == 0) {
+ sql_subtype *empty =
sql_bind_localtype("void"), *bte = sql_bind_localtype("bte");
+ sql_exp *eo = fargs->h->data;
+ /* corner case, if the argument is null convert
it into something countable such as bte */
+ if (subtype_cmp(&(eo->tpe), empty) == 0)
+ fargs->h->data = exp_convert(sql->sa,
eo, empty, bte);
+ append(fargs, exp_atom_bool(sql->sa, 1)); /*
ignore nills */
}
+ in = exp_ref_save(sql, in);
+ }
+
+ distinct = n->data.i_val;
+
+ if (!has_args) { /* count(*) */
+ in = rel_first_column(sql, p);
+ if (!exp_name(in))
+ exp_label(sql->sa, in, ++sql->label);
+ in = exp_ref(sql->sa, in);
+ append(fargs, in);
+ append(fargs, exp_atom_bool(sql->sa, 0)); /* don't
ignore nills */
+ in = exp_ref_save(sql, in);
}
}
@@ -4811,10 +4805,9 @@ rel_rankop(sql_query *query, sql_rel **r
}
sql_exp *
-rel_value_exp2(sql_query *query, sql_rel **rel, symbol *se, int f, exp_kind
ek, int *is_last)
+rel_value_exp2(sql_query *query, sql_rel **rel, symbol *se, int f, exp_kind ek)
{
mvc *sql = query->sql;
- (void)is_last;
if (!se)
return NULL;
@@ -4949,7 +4942,6 @@ rel_value_exp2(sql_query *query, sql_rel
sql_exp *
rel_value_exp(sql_query *query, sql_rel **rel, symbol *se, int f, exp_kind ek)
{
- int is_last = 0;
sql_exp *e;
if (!se)
return NULL;
@@ -4957,8 +4949,8 @@ rel_value_exp(sql_query *query, sql_rel
if (THRhighwater())
return sql_error(query->sql, 10, SQLSTATE(42000) "Query too
complex: running out of stack space");
- e = rel_value_exp2(query, rel, se, f, ek, &is_last);
- if (e && (se->token == SQL_SELECT || se->token == SQL_TABLE) &&
!is_last && !exp_is_rel(e)) {
+ e = rel_value_exp2(query, rel, se, f, ek);
+ if (e && (se->token == SQL_SELECT || se->token == SQL_TABLE) &&
!exp_is_rel(e)) {
assert(*rel);
return rel_lastexp(query->sql, *rel);
}
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -21,7 +21,7 @@ extern sql_exp * rel_logical_value_exp(s
extern sql_exp *rel_column_exp(sql_query *query, sql_rel **rel, symbol
*column_e, int f);
extern sql_exp * rel_value_exp(sql_query *query, sql_rel **rel, symbol *se,
int f, exp_kind ek);
-extern sql_exp * rel_value_exp2(sql_query *query, sql_rel **rel, symbol *se,
int f, exp_kind ek, int *is_last);
+extern sql_exp * rel_value_exp2(sql_query *query, sql_rel **rel, symbol *se,
int f, exp_kind ek);
/* TODO rename to exp_check_type + move to rel_exp.c */
extern sql_exp *rel_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp
*exp, check_type tpe);
diff --git a/sql/server/rel_sequence.c b/sql/server/rel_sequence.c
--- a/sql/server/rel_sequence.c
+++ b/sql/server/rel_sequence.c
@@ -279,10 +279,9 @@ rel_alter_seq(
val = exp_atom_lng(sql->sa, seq->start);
} else if (start_type == 1) { /* value (exp) */
exp_kind ek = {type_value, card_value, FALSE};
- int is_last = 0;
sql_subtype *lng_t = sql_bind_localtype("lng");
- val = rel_value_exp2(query, &r, start_list->h->next->data.sym,
sql_sel, ek, &is_last);
+ val = rel_value_exp2(query, &r, start_list->h->next->data.sym,
sql_sel, ek);
if (!val || !(val = rel_check_type(sql, lng_t, r, val,
type_equal)))
return NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list