Changeset: 0e0b9626c87b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0e0b9626c87b
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
sql/include/sql_relation.h
sql/server/rel_optimizer.c
Branch: sequences_7184
Log Message:
Introduce variable independence.
diffs (134 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
@@ -1291,7 +1291,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
list_append(l, es);
}
}
- if (!(s = stmt_Nop(be, stmt_list(be, l), sel, f)))
+ stmt* args = stmt_list(be, l);
+ args->argument_independence = e->argument_independence;
+ if (!(s = stmt_Nop(be, args, sel, f)))
return NULL;
} break;
case e_aggr: {
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3289,10 +3289,12 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
if (f->func->type == F_UNION)
q = newStmtArgs(mb, batmalRef,
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) +
list_length(ops->op4.lval) + 6);
else
- q = newStmtArgs(mb, malRef,
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) +
list_length(ops->op4.lval) + 6);
+ q = newStmtArgs(mb, malRef,
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) +
list_length(ops->op4.lval) + 6 + ops->argument_independence);
if (q == NULL)
return NULL;
setVarType(mb, getArg(q, 0),
newBatType(res->type->localtype));
+ if (ops->argument_independence)
+ q = pushLng(mb, q, 0); // Represents
input cardinality which signals the multiplex optimizer to use a manifold
implementation or bulkoperator which is only dependent of the input cardinality.
q = pushStr(mb, q, mod);
q = pushStr(mb, q, fimp);
} else {
diff --git a/sql/backends/monet5/sql_statement.h
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -120,7 +120,8 @@ typedef struct stmt {
aggr:1, /* aggregated */
partition:1, /* selected as mitosis candidate */
reduce:1, /* used to reduce number of rows (also for
joins) */
- loop:1; /* cond statement is looping */
+ loop:1, /* cond statement is looping */
+ argument_independence:1; /*list statement represents a list of
function call arguments which are independent of the inner project relation. */
struct stmt *cand; /* optional candidate list */
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -52,6 +52,7 @@ typedef struct expression {
nulls_last:1, /* return null after all other rows */
zero_if_empty:1, /* in case of partial aggregator computation,
some aggregators need to return 0 instead of NULL */
distinct:1,
+ argument_independence:1, /* compare between symmetric */
semantics:1, /* is vs = semantics (nil = nil vs unknown != unknown),
ranges with or without nil, aggregation with or without nil */
need_no_nil:1,
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
@@ -9065,6 +9065,66 @@ merge_table_prune_and_unionize(visitor *
return nrel;
}
+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) {
+ list* args = e->l;// The list of actual arguments which can be
empty
+ bool is_independent = true;
+ for (node *en = args->h; en; en = en->next) {
+ sql_exp* arg = en->data;
+ if (!_rel_flag_independent_projections(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.
+ */
+ 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;
+}
+
+
+static bool
+rel_flag_independent_projections(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);
+ }
+ return true;
+}
+
+static sql_rel *
+rel_optimize_function_calls(visitor *v, sql_rel *rel)
+{
+ if (rel->op == op_project) {
+ list *i = _rel_projections(v->sql, rel->l, NULL, 1, 1, 0);
+ rel_flag_independent_projections(rel->exps, i);
+ list_destroy(i);
+ }
+ return rel;
+}
+
/* rewrite merge tables into union of base tables */
static sql_rel *
rel_merge_table_rewrite(visitor *v, sql_rel *rel)
@@ -9764,6 +9824,8 @@ optimize_rel(visitor *v, sql_rel *rel, g
if (gp->needs_mergetable_rewrite)
rel = rel_visitor_topdown(v, rel, &rel_merge_table_rewrite);
+ rel = rel_visitor_topdown(v, rel, &rel_optimize_function_calls);
+
return rel;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list