Changeset: e4578a201e15 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e4578a201e15
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_psm.c
Branch: Dec2016
Log Message:

fixes for the bugs 6297, 6296, 6294, 6291 and 6291
problems were in various relational optimizers


diffs (101 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1648,8 +1648,9 @@ rel_push_count_down(int *changes, mvc *s
        sql_rel *r = rel->l;
 
        if (is_groupby(rel->op) && !rel_is_ref(rel) &&
-            r && !r->exps && r->op == op_join && !(rel_is_ref(r)) &&
-            ((sql_exp *) rel->exps->h->data)->type == e_aggr &&
+            r && !r->exps && r->op == op_join && !(rel_is_ref(r)) && 
+           /* currently only single count aggregation is handled, no other 
projects or aggregation */
+           list_length(rel->exps) == 1 && ((sql_exp *) 
rel->exps->h->data)->type == e_aggr &&
             strcmp(((sql_subaggr *) ((sql_exp *) 
rel->exps->h->data)->f)->aggr->base.name, "count") == 0) {
                sql_exp *nce, *oce;
                sql_rel *gbl, *gbr;             /* Group By */
@@ -2831,6 +2832,9 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                if (!f->func->s && !strcmp(f->func->base.name, 
"sql_add") && list_length(ll) == 2) {
                                        sql_exp *lle = ll->h->data;
                                        sql_exp *lre = ll->h->next->data;
+
+                                       if (exp_is_atom(lle) && 
exp_is_atom(lre))
+                                               return e;
                                        if (!exp_is_atom(re) && 
exp_is_atom(lre)) {
                                                /* (x+c1)+y -> (x+y) + c1 */
                                                ll->h->next->data = re; 
@@ -2912,6 +2916,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                                (*changes)++;
                                                return lle;
                                        }
+                                       if (exp_is_atom(lle) && 
exp_is_atom(lre))
+                                               return e;
                                        if (!exp_is_atom(re) && 
exp_is_atom(lre)) {
                                                /* (x+c1)-y -> (x-y) + c1 */
                                                ll->h->next->data = re; 
@@ -8448,17 +8454,7 @@ rel_apply_rewrite(int *changes, mvc *sql
                (*changes)++;
                return ns;
        }
-       if (is_semi(r->op)) { /* apply (R, (semi/anti(l,r)) -> semi/anti( 
apply(R,l), apply(R,r)) */
-               sql_rel *nl = rel_apply(sql, rel_dup(rel->l), rel_dup(r->l), 
rel->exps, rel->flag);
-               sql_rel *nr = rel_apply(sql, rel_dup(rel->l), rel_dup(r->r), 
rel->exps, rel->flag);
-
-               l = rel_crossproduct(sql->sa, nl, nr, r->op);
-               l->exps = exps_copy(sql->sa, r->exps);
-               rel_destroy(rel);
-               (*changes)++;
-               return l;
-       }
-       if (is_join(r->op)) {
+       if (is_join(r->op) || is_semi(r->op)) {
                /* if exps do not use the apply variables, push up the join */
                int lused = rel_uses_exps(r->l, rel->exps);
                int rused = rel_uses_exps(r->r, rel->exps);
@@ -8480,10 +8476,21 @@ rel_apply_rewrite(int *changes, mvc *sql
                        rel_destroy(rel);
                        rel = nr; 
                } else if (rused && lused) { /* both used */
-                       assert(0);
+                       /* apply (R, (semi/anti(l,r)) -> semi/anti( apply(R,l), 
apply(R,r)) */
+                       sql_rel *nl = rel_apply(sql, rel_dup(rel->l), 
rel_dup(r->l), rel->exps, rel->flag);
+                       sql_rel *nr = rel_apply(sql, rel_dup(rel->l), 
rel_dup(r->r), rel->exps, rel->flag);
+
+                       assert(is_semi(r->op));
+                       l = rel_crossproduct(sql->sa, nl, nr, r->op);
+                       l->exps = exps_copy(sql->sa, r->exps);
+                       rel_destroy(rel);
+                       (*changes)++;
+                       return l;
                } else { /* both unused */
                        int flag = rel->flag;
                        list *exps = r->exps;
+
+                       assert(is_join(r->op));
                        r = rel_crossproduct(sql->sa, rel_dup(r->l), 
rel_dup(r->r), flag == APPLY_LOJ?op_left:op_join);
                        r->exps = exps_copy(sql->sa, exps);
                        rel_destroy(rel);
@@ -8532,6 +8539,12 @@ rel_apply_rewrite(int *changes, mvc *sql
                                } else if (is_semi(rl->op)) {
                                        sql_rel *l = rl->l;
                                        col = l->exps->t->data;
+                               } else if (is_project(rl->op) && rl->exps) {
+                                       col = rl->exps->t->data;
+                                       col = exp_column(sql->sa, 
exp_relname(col), exp_name(col), exp_subtype(col), col->card, has_nil(col), 
is_intern(col));
+                                       col = exp_unop(sql->sa, col, 
sql_bind_func(sql->sa, NULL, "identity", exp_subtype(col), NULL, F_FUNC));
+                                       exp_label(sql->sa, col, ++sql->label);
+                                       append(rl->exps, col);
                                }
                                assert(col);
 
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
@@ -399,7 +399,7 @@ rel_psm_return( mvc *sql, sql_subtype *r
                list *oexps = rel->exps;
                sql_rel *l = rel->l;
 
-               if (is_topn(rel->op))
+               if (is_topn(rel->op) || is_sample(rel->op))
                        oexps = l->exps;
                for (n = oexps->h, m = restypelist->h; n && m; n = n->next, m = 
m->next) {
                        sql_exp *e = n->data;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to