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

Reply via email to