Changeset: 5f3be508d43a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5f3be508d43a
Modified Files:
sql/server/rel_select.c
sql/server/rel_unnest.c
Branch: default
Log Message:
Set cardinality of subquery aggregates to aggregation level
diffs (175 lines):
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
@@ -1947,10 +1947,8 @@ rel_in_value_exp(sql_query *query, sql_r
}
e = exp_in_func(sql, le, exp_values(sql->sa, vals), (sc->token
== SQL_IN), 0);
}
- if (e) {
- /* only freevar should have CARD_AGGR */
- e->card = CARD_ATOM;
- }
+ if (e)
+ e->card = le->card;
return e;
}
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -24,10 +24,10 @@ exp_set_freevar(mvc *sql, sql_exp *e, sq
case e_cmp:
if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
exps_set_freevar(sql, e->l, r);
- exps_set_freevar(sql, e->r, r);
+ exps_set_freevar(sql, e->r, r);
} else if (e->flag == cmp_in || e->flag == cmp_notin) {
exp_set_freevar(sql, e->l, r);
- exps_set_freevar(sql, e->r, r);
+ exps_set_freevar(sql, e->r, r);
} else {
exp_set_freevar(sql, e->l, r);
exp_set_freevar(sql, e->r, r);
@@ -46,7 +46,7 @@ exp_set_freevar(mvc *sql, sql_exp *e, sq
case e_column:
if ((e->l && rel_bind_column2(sql, r, e->l, e->r, 0)) ||
(!e->l && rel_bind_column(sql, r, e->r, 0)))
- return;
+ return;
set_freevar(e, 0);
break;
case e_atom:
@@ -61,7 +61,7 @@ exps_set_freevar(mvc *sql, list *exps, s
node *n;
if (list_empty(exps))
- return;
+ return;
for(n = exps->h; n; n = n->next)
exp_set_freevar(sql, n->data, r);
}
@@ -471,7 +471,7 @@ exp_rewrite(mvc *sql, sql_rel *rel, sql_
if (e->type != e_func)
return e;
e->l = exps_rewrite(sql, rel, e->l, ad);
- sf = e->f;
+ sf = e->f;
/* window functions need to be run per freevars */
if (sf->func->type == F_ANALYTIC && list_length(sf->func->ops) > 2) {
sql_subtype *bt = sql_bind_localtype("bit");
@@ -1043,9 +1043,9 @@ push_up_join(mvc *sql, sql_rel *rel)
j->r = jl;
if (!is_simple_project(jr->op))
- rel->r = jr = rel_project(sql->sa, jr,
rel_projections(sql, jr, NULL, 1, 1));
+ rel->r = jr = rel_project(sql->sa, jr,
rel_projections(sql, jr, NULL, 1, 1));
if (!is_simple_project(jl->op))
- j->r = jl = rel_project(sql->sa, jl,
rel_projections(sql, jl, NULL, 1, 1));
+ j->r = jl = rel_project(sql->sa, jl,
rel_projections(sql, jl, NULL, 1, 1));
l = exp_label(sql->sa, l, ++sql->label);
r = exp_label(sql->sa, r, ++sql->label);
append(jl->exps, l);
@@ -1146,7 +1146,7 @@ rel_general_unnest(mvc *sql, sql_rel *re
set_distinct(D);
r = rel_crossproduct(sql->sa, D, r, rel->op);
- r->op = /*is_semi(rel->op)?op_left:*/op_join;
+ r->op = /*is_semi(rel->op)?op_left:*/op_join;
move_join_exps(sql, rel, r);
set_dependent(r);
r = rel_project(sql->sa, r,
(is_semi(r->op))?sa_list(sql->sa):rel_projections(sql, r->r, NULL, 1, 1));
@@ -1798,7 +1798,7 @@ rewrite_anyequal(mvc *sql, sql_rel *rel,
if (list_length(l) == 2) { /* input is a set */
- sql_exp *ile = l->h->data, *le, *re = l->h->next->data;
+ sql_exp *ile = l->h->data, *le, *re = l->h->next->data;
sql_rel *lsq = NULL, *rsq = NULL;
int is_tuple = 0;
@@ -1869,7 +1869,7 @@ rewrite_anyequal(mvc *sql, sql_rel *rel,
lsq->exps = exps;
sql_subaggr *ea = sql_bind_aggr(sql->sa,
sql->session->schema, is_anyequal(sf)?"anyequal":"allnotequal",
exp_subtype(re));
- sql_exp *a = exp_aggr1(sql->sa, le, ea, 0, 0,
CARD_ATOM, 0);
+ sql_exp *a = exp_aggr1(sql->sa, le, ea, 0, 0,
CARD_AGGR, 0);
append(a->l, re);
append(a->l, rid);
le = rel_groupby_add_aggr(sql, lsq, a);
@@ -1942,7 +1942,7 @@ rewrite_compare(mvc *sql, sql_rel *rel,
if (list_length(l) == 2) { /* input is a set */
char *op = sf->func->base.name;
- sql_exp *ile = l->h->data, *le, *re = l->h->next->data,
*rnull = NULL;
+ sql_exp *ile = l->h->data, *le, *re = l->h->next->data,
*rnull = NULL;
sql_rel *lsq = NULL, *rsq = NULL;
int is_tuple = 0; /* TODO add this feature, ie select
(1,2) = (1,2) etc */
/* cleanup tuple handling by
introducing an expression for tuples */
@@ -2018,34 +2018,34 @@ rewrite_compare(mvc *sql, sql_rel *rel,
rsq = rel_groupby(sql, rsq, NULL);
a = sql_bind_aggr(sql->sa, NULL,
"null", exp_subtype(re));
- rnull = exp_aggr1(sql->sa, re, a, 0, 1,
CARD_ATOM, 0);
+ rnull = exp_aggr1(sql->sa, re, a, 0, 1,
CARD_AGGR, 0);
rnull = rel_groupby_add_aggr(sql, rsq,
rnull);
if (is_notequal_func(sf))
op = "=";
if (op[0] == '<') {
- a = sql_bind_aggr(sql->sa,
sql->session->schema, (quantifier==1)?"max":"min", exp_subtype(re));
+ a = sql_bind_aggr(sql->sa,
sql->session->schema, (quantifier==1)?"max":"min", exp_subtype(re));
} else if (op[0] == '>') {
- a = sql_bind_aggr(sql->sa,
sql->session->schema, (quantifier==1)?"min":"max", exp_subtype(re));
+ a = sql_bind_aggr(sql->sa,
sql->session->schema, (quantifier==1)?"min":"max", exp_subtype(re));
} else /* (op[0] == '=')*/ /* only =
ALL */ {
a = sql_bind_aggr(sql->sa,
sql->session->schema, "all", exp_subtype(re));
is_cnt = 1;
}
- re = exp_aggr1(sql->sa, re, a, 0, 1,
CARD_ATOM, 0);
+ re = exp_aggr1(sql->sa, re, a, 0, 1,
CARD_AGGR, 0);
re = rel_groupby_add_aggr(sql, rsq, re);
} else if (rsq && exp_card(re) > CARD_ATOM) {
sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, NULL, compare_aggr_op(op, quantifier), exp_subtype(re));
rsq = rel_groupby(sql, rsq, NULL);
- re = exp_aggr1(sql->sa, re,
zero_or_one, 0, 0, CARD_ATOM, 0);
+ re = exp_aggr1(sql->sa, re,
zero_or_one, 0, 0, CARD_AGGR, 0);
re = rel_groupby_add_aggr(sql, rsq, re);
}
if (rsq)
(void)rewrite_inner(sql, rel, rsq,
is_cnt?op_left:op_join);
if (rel_convert_types(sql, NULL, NULL, &le,
&re, 1, type_equal) < 0)
- return NULL;
+ return NULL;
if (rnull) { /* complex compare operator */
sql_exp *lnull = rel_unop_(sql, rel,
le, NULL, "isnull", card_value);
set_has_no_nil(lnull);
@@ -2086,7 +2086,7 @@ rewrite_compare(mvc *sql, sql_rel *rel,
if (exp_has_freevar(sql, le))
rel_bind_var(sql, rel, le);
if (rel_convert_types(sql, NULL, NULL,
&le, &re, 1, type_equal) < 0)
- return NULL;
+ return NULL;
return exp_compare(sql->sa, le, re,
compare_str2type(op));
}
}
@@ -2215,7 +2215,7 @@ rewrite_exists(mvc *sql, sql_rel *rel, s
list *l = e->l;
if (list_length(l) == 1) { /* exp_values */
- sql_exp *ne = NULL, *ie = l->h->data, *le;
+ sql_exp *ne = NULL, *ie = l->h->data, *le;
sql_rel *sq = NULL;
if (!exp_is_rel(ie)) /* already fine */
@@ -2244,7 +2244,7 @@ rewrite_exists(mvc *sql, sql_rel *rel, s
if (exp_is_rel(ie)) /* TODO add set rel function */
ie->l = sq;
ea = sql_bind_aggr(sql->sa, sql->session->schema,
is_exists(sf)?"exist":"not_exist", exp_subtype(le));
- le = exp_aggr1(sql->sa, le, ea, 0, 0, CARD_ATOM, 0);
+ le = exp_aggr1(sql->sa, le, ea, 0, 0, CARD_AGGR, 0);
le = rel_groupby_add_aggr(sql, sq, le);
if (rel_has_freevar(sql, sq))
ne = le;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list