Changeset: 69d6f049b9da for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=69d6f049b9da
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_optimizer.c
Branch: graph0
Log Message:

QRW: avoid to remove the `weights' columns in the DCE pass


diffs (95 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
@@ -16,6 +16,7 @@
 #include "rel_select.h"
 #include "rel_updates.h"
 #include "rel_optimizer.h"
+#include "rel_dump.h" // debug only
 #include "sql_env.h"
 
 #define OUTER_ZERO 64
@@ -4721,6 +4722,9 @@ rel2bin_graph(backend *be, sql_rel* rel,
        // for more extreme cases
 #define void2oid(statement) stmt_gr8_void2oid(be, statement)
 
+       // debugging
+       printf("[rel2bin_graph] input: %s\n", dump_rel(sql, rel));
+
        // first construct the depending relations
        left = subrel_bin(be, rel->l, refs);
        if(!left) return NULL; // error
@@ -4814,7 +4818,7 @@ rel2bin_graph(backend *be, sql_rel* rel,
        for(node *n = graph_ptr->spfw->h; n; n = n->next){
                sql_exp* e = n->data;
                stmt* s = exp_bin(be, e, edges, NULL, NULL, NULL, NULL, NULL);
-               assert(s != NULL);
+               assert(s != NULL && "Weight expression is NULL");
                if(!s) return NULL;
 
                list_append(lst1, s);
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
@@ -3671,6 +3671,7 @@ stmt_gr8_spfw(backend *be, stmt *query, 
        stmt *s = NULL;
        int dest = -1;
        int i = -1;
+       int num_output_cols = 2; // number of output columns from the operator
        stream *stream = buffer_wastream(buffer_create(1024), 
"spfw_codegen_query");
 
        // Validate the input parameters
@@ -3700,7 +3701,8 @@ stmt_gr8_spfw(backend *be, stmt *query, 
        q = pushReturn(be->mb, q, newTmpVariable(be->mb, TYPE_bat)); // right 
candidate list
        // add the shortest paths
        for(node *n = weights->op4.lval->h; n; n = n->next){
-               q = pushReturn(be->mb, q, newTmpVariable(be->mb, TYPE_any));
+               q = pushReturn(be->mb, q, newTmpVariable(be->mb, TYPE_bat));
+               num_output_cols++;
        }
 
        // the first argument should be the query description
@@ -3778,7 +3780,7 @@ stmt_gr8_spfw(backend *be, stmt *query, 
        dest = getDestVar(q); // jl
        renameVariable(be->mb, getArg(q, 1), "r1_%d", dest); // jr
        i = 2;
-       for(node *n = weights->op4.lval->h; n; n = n->next){ // shortest paths
+       for(node *n = weights->op4.lval->h; n; n = n->next, i++){ // shortest 
paths
                snprintf(be->mb->var[getArg(q, i)]->id, IDLENGTH, "r%d_%d", i, 
dest);
        }
 
@@ -3790,6 +3792,9 @@ stmt_gr8_spfw(backend *be, stmt *query, 
        s->op1 = query;
        s->op2 = stmt_list(be, append(append(sa_list(be->mvc->sa), edge_from), 
edge_to));
        s->op3 = weights;
+       // just required >= 1 to avoid projecting a column out of a constant 
when looking
+       // for the shortest paths
+       s->nrcols = num_output_cols; /* = i*/
 
        return s;
 }
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
@@ -6295,6 +6295,8 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
                // edges
                exps_mark_used_(sql->sa, rel, graph_ptr->edges, 
graph_ptr->efrom);
                exps_mark_used_(sql->sa, rel, graph_ptr->edges, graph_ptr->eto);
+               exps_mark_used_(sql->sa, rel, graph_ptr->edges, 
graph_ptr->spfw);
+
                rel_mark_used(sql, graph_ptr->edges, 0);
        } break;
        }
@@ -9529,8 +9531,11 @@ static sql_rel *
                rel = rewrite_topdown(sql, rel, &rel_push_project_down_union, 
&changes);
 
        /* Remove unused expressions */
-       if (level <= 0)
+       if (level <= 0) {
+               printf("[Optimizer] dce before: %s\n", dump_rel(sql, rel));
                rel = rel_dce(sql, rel);
+               printf("[Optimizer] dce after: %s\n", dump_rel(sql, rel));
+       }
 
        if (gp.cnt[op_join] || gp.cnt[op_left] || gp.cnt[op_right] || 
gp.cnt[op_full] || 
            gp.cnt[op_semi] || gp.cnt[op_anti] || gp.cnt[op_select] || 
graph_operators) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to