Changeset: c6afd756dab7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c6afd756dab7
Modified Files:
sql/server/rel_optimize_others.c
sql/server/rel_unnest.c
Branch: unnest2
Log Message:
some more improvements in rewrite_columns for djoin elim
keep proper grouping expressions (inside djoin elim)
diffs (70 lines):
diff --git a/sql/server/rel_optimize_others.c b/sql/server/rel_optimize_others.c
--- a/sql/server/rel_optimize_others.c
+++ b/sql/server/rel_optimize_others.c
@@ -415,7 +415,8 @@ rel_exps_mark_used(allocator *sa, sql_re
sql_exp *e = n->data;
e->used = 1;
- exp_mark_used(rel->l, e, -1);
+ if (!exp_mark_used(rel->l, e, -1))
+ exp_mark_used(rel, e, -1);
}
}
if (rel->attr) {
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
@@ -967,6 +967,8 @@ exp_rewrite(mvc *sql, sql_rel *rel, sql_
df = sql_bind_func(sql, NULL, "diff",
exp_subtype(de), NULL, F_ANALYTIC, true, true);
}
assert(df);
+ de = exp_copy(sql, de);
+ set_freevar(de, 1);
append(args, de);
pe = exp_op(sql->sa, args, df);
}
@@ -5384,7 +5386,7 @@ rewrite_column(visitor *v, sql_exp *e, s
{
sql_exp *ne = repr_find(v, info->repr, e);
if (ne && ne != e && ne->alias.label < 0) {
- if (0 && e->alias.label == e->nid)
+ if (e->freevar && e->alias.label == e->nid)
e->alias.label = ne->alias.label;
e->nid = ne->alias.label;
if (e->freevar)
@@ -5428,6 +5430,22 @@ rewrite_columns_for_join(visitor *v, lis
return rewrite_columns(v, exps, rinfo);
}
+static void
+rewrite_columns_groupings(visitor *v, sql_rel *rel, struct unnesting *info)
+{
+ prop *found;
+
+ if ((found = find_prop(rel->p, PROP_GROUPINGS))) {
+ list *sets = (list*) found->value.pval;
+ for(node *n = sets->h; n; n = n->next) {
+ list *l = n->data;
+ for (node *m = l->h; m; m = m ->next) {
+ m->data = rewrite_columns(v, m->data, info);
+ }
+ }
+ }
+}
+
static bool rel_djoin_elim(visitor *v, sql_rel *prel, sql_rel *rel, struct
unnesting *parent, list *parent_accessing, list *refs);
static bool
@@ -5642,10 +5660,11 @@ unnest(visitor *v, sql_rel *parent, sql_
rel->exps = add_outers(v, rel->exps, info, false);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
+ if (rel->p)
+ rewrite_columns_groupings(v, rel, info);
if (no_groups) {
/* change info->D left-outer-(group)join rel (on
outerRefs) */
/* for now first create left-outer-join(d,rel) */
- //assert(!info->parent);
sql_rel *d = rel_project(v->sql->sa,
rel_dup(info->info->d), rel_projections(v->sql, info->info->d, NULL, 1, 1));
sql_rel *nrel = rel_crossproduct(v->sql->sa, d, rel,
op_left);
rel_update_subrel(parent, rel, nrel);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]