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