Changeset: ba3f44a6e50b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ba3f44a6e50b
Modified Files:
sql/server/rel_optimizer.c
Branch: sequences_7184
Log Message:
More progress/fixes.
diffs (103 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
@@ -9066,51 +9066,59 @@ merge_table_prune_and_unionize(visitor *
}
static bool
-_rel_flag_independent_projections(sql_exp* e, list* projected_from)
-{
- // I.e. f() or f(arg) or f(arg1, ..., argn)
- if (e -> type == e_func) {
+_rel_flag_independent_projections(mvc *sql, sql_exp* e, list* projected_from)
+{
+ bool is_independent = false;
+
+ switch(e->type) {
+ case e_func: // I.e. f() or f(arg) or f(arg1, ..., argn)
+ {
list* args = e->l;// The list of actual arguments which can be
empty
- bool is_independent = true;
+ is_independent = true;
if (args)
for (node *en = args->h; en; en = en->next) {
sql_exp* arg = en->data;
- if (!_rel_flag_independent_projections(arg,
projected_from))
+ if (!_rel_flag_independent_projections(sql,
arg, projected_from)) {
is_independent = false;
- }
- if (is_independent) {
- /*
- * This function's arguments are independent
- * of the available column expression from the project's
inner relation.
- * We have to flag the function with the projectional
independence.
- */
+ }
+ }
+ }
+ /* If this function's arguments are independent
+ * of the available column expression from the project's inner
relation,
+ * we have to flag the function with the projectional
independence.
+ * Else if this expression has an alias we add it to the
projected_from list
+ * since it might be consumed by a following expression. */
+ if (is_independent)
e->argument_independence = 1;
- }
- return is_independent;
- }
- // E.g. CAST (i AS BIGINT)
- if (e -> type == e_convert)
- return (_rel_flag_independent_projections(e->l,
projected_from));
- // Any atom potentially aliased, e.g. 2 as i
- if (e->type == e_atom) {
- return true;
- }
- if (e->type == e_column) {
- if (!exps_find_exp(projected_from, e)) {
- return true;
- }
- }
- return false;
+ break;
+ case e_atom: // Any atom potentially aliased, e.g. 2 as i
+ is_independent = true;
+ break;
+ case e_convert: // E.g. CAST (i AS BIGINT)
+ is_independent = _rel_flag_independent_projections(sql, e->l,
projected_from);
+ break;
+ case e_column:
+ is_independent = !exps_find_exp(projected_from, e);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+
+ if (!is_independent && e->alias.name)
+ list_append(projected_from, exp_copy(sql, e));
+
+ return is_independent;
}
static bool
-rel_flag_independent_projections(list* projected_to, list* projected_from)
+rel_flag_independent_projections(mvc *sql, list* projected_to, list*
projected_from)
{
// TODO: signal changes
for (node *en = projected_to->h; en; en = en->next) {
sql_exp* e = en->data;
- (void) _rel_flag_independent_projections(e, projected_from);
+ (void) _rel_flag_independent_projections(sql, e,
projected_from);
}
return true;
}
@@ -9120,7 +9128,7 @@ rel_optimize_function_calls(visitor *v,
{
if (rel->op == op_project) {
list *i = _rel_projections(v->sql, rel->l, NULL, 1, 1, 0);
- rel_flag_independent_projections(rel->exps, i);
+ rel_flag_independent_projections(v->sql, rel->exps, i);
list_destroy(i);
}
return rel;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list