Changeset: b6759d6882ca for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b6759d6882ca
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
Branch: pushcands
Log Message:

Add sql relation to rel_bin_stmt struct. It makes easier to debug and switch on 
the possible extra statements on joins and groupings


diffs (truncated from 510 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
@@ -386,7 +386,7 @@ subrel_project( backend *be, rel_bin_stm
                s->cand = NULL;
                list_append(l, s);
        }
-       s = create_rel_bin_stmt(be->mvc->sa, l, NULL);
+       s = create_rel_bin_stmt(be->mvc->sa, rel, l, NULL);
        stmt_set_nrcols(s);
        if (rel && rel_is_ref(rel))
                refs_update_stmt(refs, rel, s);
@@ -1219,7 +1219,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                                                r = stmt_fetch(be, r);
                                }
                                if (r->type == st_list)
-                                       r = stmt_table(be, 
create_rel_bin_stmt(sql->sa, r->op4.lval, NULL), 1);
+                                       r = stmt_table(be, 
create_rel_bin_stmt(sql->sa, e->l, r->op4.lval, NULL), 1);
                        }
                        s = stmt_return(be, r, GET_PSM_LEVEL(e->flag));
                } else if (e->flag & PSM_WHILE) {
@@ -1362,7 +1362,8 @@ exp_bin(backend *be, sql_exp *e, rel_bin
        }       break;
        case e_aggr: {
                list *attr = e->l;
-               stmt *as = NULL, *input_group = right ? right->grp : NULL;
+               bool is_right_groupby = right && is_groupby(right->rel->op);
+               stmt *as = NULL, *input_group = is_right_groupby ? right->grp : 
NULL;
                sql_subfunc *a = e->f;
 
                if (attr && attr->h) {
@@ -1379,7 +1380,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                                if (as && as->nrcols <= 0 && left)
                                        as = stmt_const(be, 
bin_find_smallest_column(be, left), left->cand, as);
                                if (en == attr->h && !en->next && 
exp_aggr_is_count(e))
-                                       as = exp_count_no_nil_arg(e, right ? 
right->ext : NULL, at, as);
+                                       as = exp_count_no_nil_arg(e, 
is_right_groupby ? right->ext : NULL, at, as);
                                /* insert single value into a column */
                                if (as && as->nrcols <= 0 && !left)
                                        as = const_column(be, as);
@@ -1388,11 +1389,11 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                                        return NULL;
                                append(l, as);
                        }
-                       if (need_distinct(e) && ((right && right->grp) || 
list_length(l) > 1)){
+                       if (need_distinct(e) && ((is_right_groupby && 
right->grp) || list_length(l) > 1)){
                                list *nl = sa_list(sql->sa);
-                               stmt *ngrp = right ? right->grp : NULL;
-                               stmt *next = right ? right->ext : NULL;
-                               stmt *ncnt = right ? right->cnt : NULL;
+                               stmt *ngrp = is_right_groupby ? right->grp : 
NULL;
+                               stmt *next = is_right_groupby ? right->ext : 
NULL;
+                               stmt *ncnt = is_right_groupby ? right->cnt : 
NULL;
                                for (en = l->h; en; en = en->next) {
                                        stmt *as = en->data;
                                        stmt *g = stmt_group(be, as, 
right->cand, ngrp, next, ncnt, 1);
@@ -1404,7 +1405,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                                        stmt *as = en->data;
                                        append(nl, stmt_project(be, next, as));
                                }
-                               if (right && right->grp)
+                               if (is_right_groupby && right->grp)
                                        input_group = stmt_project(be, next, 
right->grp);
                                l = nl;
                        } else if (need_distinct(e)) {
@@ -1417,13 +1418,13 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                } else {
                        /* count(*) may need the default group (relation) and
                           and/or an attribute to count */
-                       if (right && right->grp) {
+                       if (is_right_groupby && right->grp) {
                                as = right->grp;
                                right->cnt->cand = NULL; /* cand has been 
applied */
                                return right->cnt;
                        } else if (right) {
                                as = bin_find_smallest_column(be, left);
-                               as = exp_count_no_nil_arg(e, right->ext, NULL, 
as);
+                               as = exp_count_no_nil_arg(e, is_right_groupby ? 
right->ext : NULL, NULL, as);
                        } else {
                                /* create dummy single value in a column */
                                as = stmt_atom_lng(be, 0);
@@ -1431,7 +1432,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                        }
                }
                if (right)
-                       s = stmt_aggr(be, as, left->cand, input_group, 
right->ext, a, 1, need_no_nil(e) /* ignore nil*/, !zero_if_empty(e));
+                       s = stmt_aggr(be, as, left->cand, input_group, 
is_right_groupby ? right->ext : NULL, a, 1, need_no_nil(e) /* ignore nil*/, 
!zero_if_empty(e));
                else
                        s = stmt_aggr(be, as, left?left->cand:NULL, NULL, NULL, 
a, 1, need_no_nil(e) /* ignore nil*/, !zero_if_empty(e));
                if (find_prop(e->p, PROP_COUNT)) /* propagate count == 0 ipv 
NULL in outer joins */
@@ -1440,18 +1441,10 @@ exp_bin(backend *be, sql_exp *e, rel_bin
        case e_column: {
                if (right) {/* check relation names */
                        s = bin_find_column(be, right, e->l, e->r);
-#if 0
-                       if (s && s->nrcols > 0 && depth == 0 && right->cand) /* 
topmost column reference, needs to be projected on the cand */
-                               s = stmt_project_column_on_cand(be, 
right->cand, s);
-#endif
                }
                if (!s && left) {
                        s = bin_find_column(be, left, e->l, e->r);
-#if 0
-                       if (s && s->nrcols > 0 && depth == 0 && left->cand) /* 
topmost column reference, needs to be projected on the cand */
-                               s = stmt_project_column_on_cand(be, left->cand, 
s);
-#endif
-                       if (s && right && right->grp) {
+                       if (s && right && is_groupby(right->rel->op) && 
right->grp) {
                                if (left->cand && !s->cand)
                                        s = stmt_project(be, left->cand, s);
                                s = stmt_project(be, right->ext, s);
@@ -1780,7 +1773,7 @@ stmt_rename(backend *be, sql_exp *exp, s
 }
 
 static rel_bin_stmt *
-rel2bin_sql_table(backend *be, sql_table *t, list *aliases)
+rel2bin_sql_table(backend *be, sql_rel *rel, sql_table *t, list *aliases)
 {
        mvc *sql = be->mvc;
        list *l = sa_list(sql->sa);
@@ -1851,7 +1844,7 @@ rel2bin_sql_table(backend *be, sql_table
                        }
                }
        }
-       return create_rel_bin_stmt(sql->sa, l, NULL);
+       return create_rel_bin_stmt(sql->sa, rel, l, NULL);
 }
 
 static rel_bin_stmt *
@@ -1922,7 +1915,7 @@ rel2bin_basetable(backend *be, sql_rel *
                s->cname = exp_name(exp);
                list_append(l, s);
        }
-       return create_rel_bin_stmt(sql->sa, l, dels);
+       return create_rel_bin_stmt(sql->sa, rel, l, dels);
 }
 
 static int
@@ -2106,7 +2099,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                                assert(ti->type != 1);
                        }
                }
-               return create_rel_bin_stmt(sql->sa, l, NULL);
+               return create_rel_bin_stmt(sql->sa, rel, l, NULL);
        } else if (op) {
                int i;
                sql_subfunc *f = op->f;
@@ -2120,7 +2113,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                                sql_table *t = rel_ddl_table_get(l);
 
                                if (t)
-                                       sub = rel2bin_sql_table(be, t, NULL);
+                                       sub = rel2bin_sql_table(be, l, t, NULL);
                        } else {
                                sub = subrel_bin(be, rel->l, refs);
                        }
@@ -2239,7 +2232,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                        }
                }
                assert(rel->flag != TABLE_PROD_FUNC || !sub || !(sub->nrcols));
-               sub = create_rel_bin_stmt(sql->sa, l, NULL);
+               sub = create_rel_bin_stmt(sql->sa, rel, l, NULL);
        } else if (rel->l) { /* handle sub query via function */
                int i;
                char name[16], *nme;
@@ -2266,7 +2259,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                                s = stmt_fetch(be, s);
                        list_append(l, s);
                }
-               sub = create_rel_bin_stmt(sql->sa, l, NULL);
+               sub = create_rel_bin_stmt(sql->sa, rel, l, NULL);
        }
        if (!sub) {
                assert(sql->session->status == -10); /* Stack overflow errors 
shouldn't terminate the server */
@@ -2675,7 +2668,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
                        s = stmt_alias(be, s, rnme, nme);
                        list_append(nl, s);
                }
-               sub = create_rel_bin_stmt(sql->sa, nl, NULL);
+               sub = create_rel_bin_stmt(sql->sa, rel, nl, NULL);
 
                /* continue with non equi-joins */
                while(sexps) {
@@ -2756,7 +2749,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
                s = stmt_alias(be, s, rnme, nme);
                list_append(l, s);
        }
-       return create_rel_bin_join_stmt(sql->sa, left, right, l, NULL, jl, jr, 
ld, rd);
+       return create_rel_bin_join_stmt(sql->sa, rel, l, NULL, left, right, jl, 
jr, ld, rd);
 }
 
 static int
@@ -2838,7 +2831,7 @@ rel2bin_antijoin(backend *be, sql_rel *r
                s = stmt_alias(be, s, rnme, nme);
                list_append(l, s);
        }
-       return create_rel_bin_join_stmt(sql->sa, left, right, l, NULL, join, 
NULL, NULL, NULL);
+       return create_rel_bin_join_stmt(sql->sa, rel, l, NULL, left, right, 
join, NULL, NULL, NULL);
 }
 
 static rel_bin_stmt *
@@ -3012,7 +3005,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                        s = stmt_alias(be, s, rnme, nme);
                        list_append(nl, s);
                }
-               sub = create_rel_bin_stmt(sql->sa, nl, NULL);
+               sub = create_rel_bin_stmt(sql->sa, rel, nl, NULL);
 
                /* continue with non equi-joins */
                while(sexps) {
@@ -3069,7 +3062,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                s = stmt_alias(be, s, rnme, nme);
                list_append(l, s);
        }
-       return create_rel_bin_join_stmt(sql->sa, left, right, l, NULL, join, 
NULL, NULL, NULL);
+       return create_rel_bin_join_stmt(sql->sa, rel, l, NULL, left, right, 
join, NULL, NULL, NULL);
 }
 
 static rel_bin_stmt *
@@ -3184,7 +3177,7 @@ rel2bin_union(backend *be, sql_rel *rel,
                s = stmt_alias(be, s, rnme, nme);
                list_append(l, s);
        }
-       sub = create_rel_bin_stmt(sql->sa, l, NULL);
+       sub = create_rel_bin_stmt(sql->sa, rel, l, NULL);
 
        sub = rel_rename(be, rel, sub);
        if (need_distinct(rel))
@@ -3301,7 +3294,7 @@ rel2bin_except(backend *be, sql_rel *rel
                c1 = stmt_alias(be, c1, rnme, nme);
                list_append(stmts, c1);
        }
-       sub = create_rel_bin_stmt(sql->sa, stmts, NULL);
+       sub = create_rel_bin_stmt(sql->sa, rel, stmts, NULL);
        return rel_rename(be, rel, sub);
 }
 
@@ -3398,7 +3391,7 @@ rel2bin_inter(backend *be, sql_rel *rel,
                c1 = stmt_alias(be, c1, rnme, nme);
                list_append(stmts, c1);
        }
-       sub = create_rel_bin_stmt(sql->sa, stmts, NULL);
+       sub = create_rel_bin_stmt(sql->sa, rel, stmts, NULL);
        return rel_rename(be, rel, sub);
 }
 
@@ -3479,7 +3472,7 @@ rel2bin_project(backend *be, sql_rel *re
                        sql_table *t = rel_ddl_table_get(l);
 
                        if (t)
-                               sub = rel2bin_sql_table(be, t, rel->exps);
+                               sub = rel2bin_sql_table(be, l, t, rel->exps);
                } else {
                        sub = subrel_bin(be, rel->l, refs);
                        if (sub && sub->pushed) /* no partial candidates yet */
@@ -3492,7 +3485,7 @@ rel2bin_project(backend *be, sql_rel *re
        pl = sa_list(sql->sa);
        if (sub)
                pl->expected_cnt = list_length(sub->cols);
-       psub = create_rel_bin_stmt(sql->sa, pl, NULL);
+       psub = create_rel_bin_stmt(sql->sa, rel, pl, NULL);
        int used = 0;
        for( en = rel->exps->h; en; en = en->next ) {
                sql_exp *exp = en->data;
@@ -3659,7 +3652,7 @@ rel2bin_select(backend *be, sql_rel *rel
        }
        if (sub && !sel)
                sel = sub->cand;
-       sub = create_rel_bin_stmt(sql->sa, sub->cols, sel);
+       sub = create_rel_bin_stmt(sql->sa, rel, sub->cols, sel);
        for( en = rel->exps->h; en; en = en->next ) {
                sql_exp *e = en->data;
                stmt *s = exp_bin(be, e, sub, NULL, 0, 1, 0);
@@ -3747,7 +3740,7 @@ rel2bin_groupby(backend *be, sql_rel *re
        }
        /* now aggregate */
        l = sa_list(sql->sa);
-       cursub = create_rel_bin_group_stmt(sql->sa, l, NULL, grp, ext, cnt);
+       cursub = create_rel_bin_group_stmt(sql->sa, rel, l, NULL, grp, ext, 
cnt);
        for( n = rel->exps->h; n; n = n->next ) {
                sql_exp *aggrexp = n->data;
                stmt *aggrstmt = NULL;
@@ -3877,7 +3870,7 @@ rel2bin_sample(backend *be, sql_rel *rel
                 if (!(sample_size = exp_bin(be, rel->exps->h->data, NULL, 
NULL, 0, 0, 0)))
                        return NULL;
 
-               if (rel->exps->cnt == 2) {
+               if (list_length(rel->exps) == 2) {
                        seed = exp_bin(be, rel->exps->h->next->data, NULL, 
NULL, 0, 0, 0);
                        if (!seed)
                                return NULL;
@@ -4337,7 +4330,7 @@ rel2bin_insert(backend *be, sql_rel *rel
                be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, 
ret->nr) : ret->nr;
        }
 
-       return create_rel_bin_stmt(sql->sa, sa_list(sql->sa), NULL);
+       return create_rel_bin_stmt(sql->sa, rel, sa_list(sql->sa), NULL);
 }
 
 static int
@@ -5303,7 +5296,7 @@ rel2bin_update(backend *be, sql_rel *rel
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to