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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to