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

first attempts at pushing candidates into group and aggregates


diffs (truncated from 504 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
@@ -353,7 +353,7 @@ distinct_value_list(backend *be, list *v
        s = stmt_append_bulk(be, stmt_temp(be, exp_subtype(vals->h->data)), l);
        /* Probably faster to filter out the values directly in the underlying 
list of atoms.
           But for now use groupby to filter out duplicate values. */
-       stmt* groupby = stmt_group(be, s, NULL, NULL, NULL, 1);
+       stmt* groupby = stmt_group(be, s, NULL, NULL, NULL, NULL, 1);
        stmt* ext = stmt_result(be, groupby, 1);
 
        return stmt_project(be, ext, s);
@@ -369,10 +369,13 @@ stmt_selectnonil( backend *be, stmt *col
 }
 
 static rel_bin_stmt *
-subrel_project( backend *be, rel_bin_stmt *s, list *refs, sql_rel *rel, bool 
allow_single_cand)
+subrel_project( backend *be, rel_bin_stmt *s, list *refs, sql_rel *rel, bool 
partial_push)
 {
-       if (!s || !s->cand || (s->cand && allow_single_cand && !s->pushed))
+       if (!s || !s->cand || (s->cand && partial_push && !s->pushed)) {
+               if (s->cand)
+                       s->pushed = partial_push;
                return s;
+       }
 
        list *l = sa_list(be->mvc->sa);
        stmt *cand = s->cand;
@@ -1374,7 +1377,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                                        as = exp_bin(be, at, left, right, 
depth+1, 0, push);
 
                                if (as && as->nrcols <= 0 && left)
-                                       as = stmt_const(be, 
bin_find_smallest_column(be, left), NULL, as);
+                                       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);
                                /* insert single value into a column */
@@ -1392,7 +1395,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                                stmt *ncnt = right ? right->cnt : NULL;
                                for (en = l->h; en; en = en->next) {
                                        stmt *as = en->data;
-                                       stmt *g = stmt_group(be, as, ngrp, 
next, ncnt, 1);
+                                       stmt *g = stmt_group(be, as, 
right->cand, ngrp, next, ncnt, 1);
                                        ngrp = stmt_result(be, g, 0);
                                        next = stmt_result(be, g, 1);
                                        ncnt = stmt_result(be, g, 2);
@@ -1426,9 +1429,9 @@ exp_bin(backend *be, sql_exp *e, rel_bin
                        }
                }
                if (right)
-                       s = stmt_aggr(be, as, 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, 
right->ext, a, 1, need_no_nil(e) /* ignore nil*/, !zero_if_empty(e));
                else
-                       s = stmt_aggr(be, as, NULL, NULL, a, 1, need_no_nil(e) 
/* ignore nil*/, !zero_if_empty(e));
+                       s = stmt_aggr(be, as, left->cand, 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 */
                        s->flag |= OUTER_ZERO;
        }       break;
@@ -3077,7 +3080,7 @@ rel2bin_distinct(backend *be, rel_bin_st
        for (node *n = s->cols->h; n; n = n->next) {
                stmt *t = n->data;
 
-               g = stmt_group(be, column(be, t), grp, ext, cnt, !n->next);
+               g = stmt_group(be, column(be, t), NULL, grp, ext, cnt, 
!n->next);
                grp = stmt_result(be, g, 0);
                ext = stmt_result(be, g, 1);
                cnt = stmt_result(be, g, 2);
@@ -3116,7 +3119,7 @@ rel2bin_single(backend *be, rel_bin_stmt
                const char *nme = column_name(sql->sa, t);
                sql_subfunc *zero_or_one = sql_bind_func(sql, "sys", 
"zero_or_one", tail_type(t), NULL, F_AGGR);
 
-               t = stmt_aggr(be, t, NULL, NULL, zero_or_one, 1, 0, 1);
+               t = stmt_aggr(be, t, NULL, NULL, NULL, zero_or_one, 1, 0, 1);
                t = stmt_alias(be, t, rnme, nme);
                list_append(rl, t);
        }
@@ -3220,13 +3223,13 @@ rel2bin_except(backend *be, sql_rel *rel
         * number of rows.
         */
        for (n = left->cols->h; n; n = n->next) {
-               lg = stmt_group(be, column(be, n->data), lgrp, lext, lcnt, 
!n->next);
+               lg = stmt_group(be, column(be, n->data), NULL, lgrp, lext, 
lcnt, !n->next);
                lgrp = stmt_result(be, lg, 0);
                lext = stmt_result(be, lg, 1);
                lcnt = stmt_result(be, lg, 2);
        }
        for (n = right->cols->h; n; n = n->next) {
-               rg = stmt_group(be, column(be, n->data), rgrp, rext, rcnt, 
!n->next);
+               rg = stmt_group(be, column(be, n->data), NULL, rgrp, rext, 
rcnt, !n->next);
                rgrp = stmt_result(be, rg, 0);
                rext = stmt_result(be, rg, 1);
                rcnt = stmt_result(be, rg, 2);
@@ -3330,13 +3333,13 @@ rel2bin_inter(backend *be, sql_rel *rel,
         * number of rows.
         */
        for (n = left->cols->h; n; n = n->next) {
-               lg = stmt_group(be, column(be, n->data), lgrp, lext, lcnt, 
!n->next);
+               lg = stmt_group(be, column(be, n->data), NULL, lgrp, lext, 
lcnt, !n->next);
                lgrp = stmt_result(be, lg, 0);
                lext = stmt_result(be, lg, 1);
                lcnt = stmt_result(be, lg, 2);
        }
        for (n = right->cols->h; n; n = n->next) {
-               rg = stmt_group(be, column(be, n->data), rgrp, rext, rcnt, 
!n->next);
+               rg = stmt_group(be, column(be, n->data), NULL, rgrp, rext, 
rcnt, !n->next);
                rgrp = stmt_result(be, rg, 0);
                rext = stmt_result(be, rg, 1);
                rcnt = stmt_result(be, rg, 2);
@@ -3508,10 +3511,8 @@ rel2bin_project(backend *be, sql_rel *re
        }
        if (sub && sub->cand && used < list_length(rel->exps)) {
                psub->cand = sub->cand;
-               if (used > 0) {
+               if (used > 0)
                        psub = subrel_project(be, psub, refs, rel, true);
-                       psub->pushed = true;
-               }
        } else if (sub && sub->cand && used == list_length(rel->exps)) {
                sub = used_cands(sub);
                psub = used_cands(psub);
@@ -3694,7 +3695,7 @@ rel2bin_groupby(backend *be, sql_rel *re
 
        assert(rel->l); /* first construct the sub relation */
        sub = subrel_bin(be, rel->l, refs);
-       sub = subrel_project(be, sub, refs, rel->l, false);
+//     sub = subrel_project(be, sub, refs, rel->l, false);
        if (!sub)
                return NULL;
 
@@ -3728,8 +3729,8 @@ rel2bin_groupby(backend *be, sql_rel *re
                                return NULL;
                        }
                        if (!gbcol->nrcols)
-                               gbcol = stmt_const(be, 
bin_find_smallest_column(be, sub), NULL, gbcol);
-                       groupby = stmt_group(be, gbcol, grp, ext, cnt, 
!en->next);
+                               gbcol = stmt_const(be, 
bin_find_smallest_column(be, sub), sub->cand, gbcol);
+                       groupby = stmt_group(be, gbcol, sub->cand, grp, ext, 
cnt, !en->next);
                        grp = stmt_result(be, groupby, 0);
                        ext = stmt_result(be, groupby, 1);
                        cnt = stmt_result(be, groupby, 2);
@@ -3960,7 +3961,7 @@ insert_check_ukey(backend *be, list *ins
                        s = releqjoin(be, lje, rje, NULL, 1 /* hash used */, 0, 
0);
                        s = stmt_result(be, s, 0);
                }
-               s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1), 
stmt_atom_lng(be, 0), NULL, ne);
+               s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL, NULL, cnt, 1, 
0, 1), stmt_atom_lng(be, 0), NULL, ne);
 
                /* 2nd stage: find out if inserted are unique */
                if ((!idx_inserts && ins->nrcols) || (idx_inserts && 
idx_inserts->nrcols)) {    /* insert columns not atoms */
@@ -3998,7 +3999,7 @@ insert_check_ukey(backend *be, list *ins
                                return NULL;
 
                        sum = sql_bind_func(sql, "sys", "not_unique", 
tail_type(orderby_grp), NULL, F_AGGR);
-                       ssum = stmt_aggr(be, orderby_grp, NULL, NULL, sum, 1, 
0, 1);
+                       ssum = stmt_aggr(be, orderby_grp, NULL, NULL, NULL, 
sum, 1, 0, 1);
                        /* combine results */
                        s = stmt_binop(be, s, ssum, NULL, or);
                }
@@ -4022,11 +4023,11 @@ insert_check_ukey(backend *be, list *ins
                        s = stmt_join(be, s, h, 0, cmp_equal, 0, 0, false);
                        /* s should be empty */
                        s = stmt_result(be, s, 0);
-                       s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
+                       s = stmt_aggr(be, s, NULL, NULL, NULL, cnt, 1, 0, 1);
                } else {
                        s = stmt_uselect(be, s, h, cmp_equal, NULL, 0, 0);
                        /* s should be empty */
-                       s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
+                       s = stmt_aggr(be, s, NULL, NULL, NULL, cnt, 1, 0, 1);
                }
                /* s should be empty */
                s = stmt_binop(be, s, stmt_atom_lng(be, 0), NULL, ne);
@@ -4046,13 +4047,13 @@ insert_check_ukey(backend *be, list *ins
                                ins = stmt_project(be, nn, ins);
                        }
 
-                       g = stmt_group(be, ins, NULL, NULL, NULL, 1);
+                       g = stmt_group(be, ins, NULL, NULL, NULL, NULL, 1);
                        ss = stmt_result(be, g, 2); /* use count */
                        /* (count(ss) <> sum(ss)) */
                        sum = sql_bind_func(sql, "sys", "sum", lng, NULL, 
F_AGGR);
-                       ssum = stmt_aggr(be, ss, NULL, NULL, sum, 1, 0, 1);
+                       ssum = stmt_aggr(be, ss, NULL, NULL, NULL, sum, 1, 0, 
1);
                        ssum = sql_Nop_(be, "ifthenelse", sql_unop_(be, 
"isnull", ssum), stmt_atom_lng(be, 0), ssum, NULL);
-                       count_sum = stmt_binop(be, check_types(be, 
tail_type(ssum), stmt_aggr(be, ss, NULL, NULL, cnt, 1, 0, 1), type_equal), 
ssum, NULL, ne);
+                       count_sum = stmt_binop(be, check_types(be, 
tail_type(ssum), stmt_aggr(be, ss, NULL, NULL, NULL, cnt, 1, 0, 1), 
type_equal), ssum, NULL, ne);
 
                        /* combine results */
                        s = stmt_binop(be, s, count_sum, NULL, or);
@@ -4081,10 +4082,10 @@ insert_check_fkey(backend *be, list *ins
        if (pin && list_length(pin->cols))
                s = pin->cols->h->data;
        if (s->key && s->nrcols == 0) {
-               s = stmt_binop(be, stmt_aggr(be, idx_inserts, NULL, NULL, cnt, 
1, 0, 1), stmt_atom_lng(be, 1), NULL, ne);
+               s = stmt_binop(be, stmt_aggr(be, idx_inserts, NULL, NULL, NULL, 
cnt, 1, 0, 1), stmt_atom_lng(be, 1), NULL, ne);
        } else {
                /* releqjoin.count <> inserts[col1].count */
-               s = stmt_binop(be, stmt_aggr(be, idx_inserts, NULL, NULL, cnt, 
1, 0, 1), stmt_aggr(be, column(be, s), NULL, NULL, cnt, 1, 0, 1), NULL, ne);
+               s = stmt_binop(be, stmt_aggr(be, idx_inserts, NULL, NULL, NULL, 
cnt, 1, 0, 1), stmt_aggr(be, column(be, s), NULL, NULL, NULL, cnt, 1, 0, 1), 
NULL, ne);
        }
 
        /* s should be empty */
@@ -4193,7 +4194,7 @@ sql_insert_check_null(backend *be, sql_t
 
                        if (!(s->key && s->nrcols == 0)) {
                                s = stmt_selectnil(be, column(be, i));
-                               s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
+                               s = stmt_aggr(be, s, NULL, NULL, NULL, cnt, 1, 
0, 1);
                        } else {
                                sql_subfunc *isnil = sql_bind_func(sql, "sys", 
"isnull", &c->type, NULL, F_FUNC);
 
@@ -4270,7 +4271,7 @@ rel2bin_insert(backend *be, sql_rel *rel
        if (ret->nrcols == 0) {
                ret = stmt_atom_lng(be, 1);
        } else {
-               ret = stmt_aggr(be, ret, NULL, NULL, sql_bind_func(sql, "sys", 
"count", sql_bind_localtype("void"), NULL, F_AGGR), 1, 0, 1);
+               ret = stmt_aggr(be, ret, NULL, NULL, NULL, sql_bind_func(sql, 
"sys", "count", sql_bind_localtype("void"), NULL, F_AGGR), 1, 0, 1);
        }
 
        if (t->idxs) {
@@ -4405,7 +4406,7 @@ update_check_ukey(backend *be, stmt **up
                        }
                        s = releqjoin(be, lje, rje, NULL, 1 /* hash used */, 0, 
0);
                        s = stmt_result(be, s, 0);
-                       s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL, cnt, 1, 
0, 1), stmt_atom_lng(be, 0), NULL, ne);
+                       s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL, NULL, 
cnt, 1, 0, 1), stmt_atom_lng(be, 0), NULL, ne);
                }
 
                /* 2e stage: find out if the updated are unique */
@@ -4420,7 +4421,7 @@ update_check_ukey(backend *be, stmt **up
                        /* also take the hopefully unique hash keys, to reduce
                           (re)group costs */
                        if (k->idx && hash_index(k->idx->type)) {
-                               g = stmt_group(be, idx_updates, grp, ext, Cnt, 
0);
+                               g = stmt_group(be, idx_updates, NULL, grp, ext, 
Cnt, 0);
                                grp = stmt_result(be, g, 0);
                                ext = stmt_result(be, g, 1);
                                Cnt = stmt_result(be, g, 2);
@@ -4463,7 +4464,7 @@ update_check_ukey(backend *be, stmt **up
                                }
 
                                /* apply group by on groups with Cnt > 1 */
-                               g = stmt_group(be, upd, grp, ext, Cnt, 
!m->next);
+                               g = stmt_group(be, upd, NULL, grp, ext, Cnt, 
!m->next);
                                grp = stmt_result(be, g, 0);
                                ext = stmt_result(be, g, 1);
                                Cnt = stmt_result(be, g, 2);
@@ -4471,9 +4472,9 @@ update_check_ukey(backend *be, stmt **up
                        ss = Cnt; /* use count */
                        /* (count(ss) <> sum(ss)) */
                        sum = sql_bind_func(sql, "sys", "sum", lng, NULL, 
F_AGGR);
-                       ssum = stmt_aggr(be, ss, NULL, NULL, sum, 1, 0, 1);
+                       ssum = stmt_aggr(be, ss, NULL, NULL, NULL, sum, 1, 0, 
1);
                        ssum = sql_Nop_(be, "ifthenelse", sql_unop_(be, 
"isnull", ssum), stmt_atom_lng(be, 0), ssum, NULL);
-                       count_sum = stmt_binop(be, stmt_aggr(be, ss, NULL, 
NULL, cnt, 1, 0, 1), check_types(be, lng, ssum, type_equal), NULL, ne);
+                       count_sum = stmt_binop(be, stmt_aggr(be, ss, NULL, 
NULL, NULL, cnt, 1, 0, 1), check_types(be, lng, ssum, type_equal), NULL, ne);
 
                        /* combine results */
                        if (s)
@@ -4502,7 +4503,7 @@ update_check_ukey(backend *be, stmt **up
                        o = stmt_col(be, c->c, nu_tids, nu_tids->partition);
                        s = stmt_join(be, o, h, 0, cmp_equal, 0, 0, false);
                        s = stmt_result(be, s, 0);
-                       s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL, cnt, 1, 
0, 1), stmt_atom_lng(be, 0), NULL, ne);
+                       s = stmt_binop(be, stmt_aggr(be, s, NULL, NULL, NULL, 
cnt, 1, 0, 1), stmt_atom_lng(be, 0), NULL, ne);
                }
 
                /* 2e stage: find out if updated are unique */
@@ -4526,14 +4527,14 @@ update_check_ukey(backend *be, stmt **up
                                upd = stmt_project(be, nn, upd);
                        }
 
-                       g = stmt_group(be, upd, NULL, NULL, NULL, 1);
+                       g = stmt_group(be, upd, NULL, NULL, NULL, NULL, 1);
                        ss = stmt_result(be, g, 2); /* use count */
 
                        /* (count(ss) <> sum(ss)) */
                        sum = sql_bind_func(sql, "sys", "sum", lng, NULL, 
F_AGGR);
-                       ssum = stmt_aggr(be, ss, NULL, NULL, sum, 1, 0, 1);
+                       ssum = stmt_aggr(be, ss, NULL, NULL, NULL, sum, 1, 0, 
1);
                        ssum = sql_Nop_(be, "ifthenelse", sql_unop_(be, 
"isnull", ssum), stmt_atom_lng(be, 0), ssum, NULL);
-                       count_sum = stmt_binop(be, check_types(be, 
tail_type(ssum), stmt_aggr(be, ss, NULL, NULL, cnt, 1, 0, 1), type_equal), 
ssum, NULL, ne);
+                       count_sum = stmt_binop(be, check_types(be, 
tail_type(ssum), stmt_aggr(be, ss, NULL, NULL, NULL, cnt, 1, 0, 1), 
type_equal), ssum, NULL, ne);
 
                        /* combine results */
                        if (s)
@@ -4604,7 +4605,7 @@ update_check_fkey(backend *be, stmt **up
                assert(0);
                cur = stmt_col(be, c->c, dels, dels->partition);
        }
-       s = stmt_binop(be, stmt_aggr(be, idx_updates, NULL, NULL, cnt, 1, 0, 
1), stmt_aggr(be, cur, NULL, NULL, cnt, 1, 0, 1), NULL, ne);
+       s = stmt_binop(be, stmt_aggr(be, idx_updates, NULL, NULL, NULL, cnt, 1, 
0, 1), stmt_aggr(be, cur, NULL, NULL, NULL, cnt, 1, 0, 1), NULL, ne);
 
        for (m = k->columns->h; m; m = m->next) {
                sql_kc *c = m->data;
@@ -4627,12 +4628,12 @@ update_check_fkey(backend *be, stmt **up
                }
        }
        if (null) {
-               cntnulls = stmt_aggr(be, null, NULL, NULL, cnt, 1, 0, 1);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to