Changeset: cb6ff16d1ca1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cb6ff16d1ca1
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/server/rel_distribute.c
Branch: default
Log Message:

fixes replica tables
all 22 tpch queries now work
problems 1) intermediates should be of type project
         2) references to the same table needed more carefull handling


diffs (106 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -48,6 +48,7 @@
 #include "mal_builder.h"
 
 #include <sql_rel2bin.h>
+#include <rel_select.h>
 #include <rel_optimizer.h>
 #include <rel_subquery.h>
 #include <rel_prop.h>
@@ -240,14 +241,16 @@ table_func_create_result( MalBlkPtr mb, 
 }
 
 static InstrPtr
-relational_func_create_result( MalBlkPtr mb, InstrPtr q, sql_rel *f)
+relational_func_create_result( mvc *sql, MalBlkPtr mb, InstrPtr q, sql_rel *f)
 {
        sql_rel *r = f;
        node *n;
        int i;
 
-       if (is_topn(f->op))
-               r = f->l;
+       if (is_topn(r->op))
+               r = r->l;
+       if (!is_project(r->op))
+               r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 
1));
        q->argc = q->retc = 0;
        for (i = 0, n = r->exps->h; n; n = n->next, i++ ) {
                sql_exp *e = n->data;
@@ -294,7 +297,7 @@ _create_relational_function(mvc *m, char
        curBlk = c->curprg->def;
        curInstr = getInstrPtr(curBlk, 0);
 
-       curInstr = relational_func_create_result(curBlk, curInstr, rel);
+       curInstr = relational_func_create_result(m, curBlk, curInstr, r);
        setVarUDFtype(curBlk,0);
 
        /* ops */
@@ -334,13 +337,16 @@ _create_relational_remote(mvc *m, char *
        char *uri = prp->value;
        node *n;
        int i, q, v;
-       int *lret = SA_NEW_ARRAY(m->sa, int, list_length(rel->exps));
-       int *rret = SA_NEW_ARRAY(m->sa, int, list_length(rel->exps));
+       int *lret, *rret;
        char old = name[0];
        sql_rel *r = rel;
 
        if (is_topn(r->op))
-               r = rel->l;
+               r = r->l;
+       if (!is_project(r->op))
+               r = rel_project(m->sa, r, rel_projections(m, r, NULL, 1, 1));
+       lret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps));
+       rret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps));
        /* dirty hack, rename (change first char of name) L->l, local
          * functions name start with 'l'        */ 
        name[0] = 'l';
@@ -354,7 +360,7 @@ _create_relational_remote(mvc *m, char *
        curBlk = c->curprg->def;
        curInstr = getInstrPtr(curBlk, 0);
 
-       curInstr = relational_func_create_result(curBlk, curInstr, rel);
+       curInstr = relational_func_create_result(m, curBlk, curInstr, rel);
        setVarUDFtype(curBlk,0);
 
        /* ops */
@@ -1772,7 +1778,7 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                        monet5_create_relational_function(sql->mvc, fimp, rel, 
s);
 
                        q = newStmt(mb, mod, fimp);
-                       q = relational_func_create_result(mb, q, rel);
+                       q = relational_func_create_result(sql->mvc, mb, q, rel);
                        if (s->op1)
                                for (n = s->op1->op4.lval->h; n; n = n->next) {
                                        stmt *op = n->data;
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -55,6 +55,8 @@ replica(mvc *sql, sql_rel *rel, char *ur
        if (rel_is_ref(rel)) {
                sql_rel *nrel = rel_copy(sql->sa, rel);
 
+               if (nrel && rel->p)
+                       nrel->p = prop_copy(sql->sa, rel->p);
                rel_destroy(rel);
                rel = nrel;
        }
@@ -127,6 +129,15 @@ distribute(mvc *sql, sql_rel *rel)
        if (!rel)
                return rel;
 
+       if (rel_is_ref(rel)) {
+               sql_rel *nrel = rel_copy(sql->sa, rel);
+
+               if (nrel && rel->p)
+                       nrel->p = prop_copy(sql->sa, rel->p);
+               rel_destroy(rel);
+               rel = nrel;
+       }
+
        switch (rel->op) {
        case op_basetable: {
                sql_table *t = rel->l;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to