Changeset: f7294db4bd93 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f7294db4bd93
Modified Files:
        monetdb5/modules/atoms/nested_table.c
        monetdb5/modules/atoms/nested_table.mal
        sql/server/rel_dump.c
        sql/server/rel_optimizer.c
Branch: graph0
Log Message:

QRW: push down of selects over the UNNEST operator


diffs (82 lines):

diff --git a/monetdb5/modules/atoms/nested_table.c 
b/monetdb5/modules/atoms/nested_table.c
--- a/monetdb5/modules/atoms/nested_table.c
+++ b/monetdb5/modules/atoms/nested_table.c
@@ -29,6 +29,7 @@
 mal_export str NESTEDTABLEnest1_oid(bat*, const bat*, const bat*);
 mal_export str NESTEDTABLEunnest101_oid(bat*, bat*, const bat*);
 mal_export void NESTEDTABLEheap(Heap*, size_t);
+mal_export void* NESTEDTABLEnull(void);
 mal_export var_t NESTEDTABLEput(Heap *h, var_t *bun, nested_table *val);
 mal_export str NESTEDTABLEprelude(void*);
 
@@ -40,6 +41,12 @@ void NESTEDTABLEheap(Heap* heap, size_t 
        HEAP_initialize(heap, 0, 0, sizeof(oid));
 }
 
+// make GDK happy
+static oid nil_instance = -1;
+void* NESTEDTABLEnull(void){
+       return &nil_instance;
+}
+
 // initializer
 str NESTEDTABLEprelude(void* ret) {
        (void) ret;
diff --git a/monetdb5/modules/atoms/nested_table.mal 
b/monetdb5/modules/atoms/nested_table.mal
--- a/monetdb5/modules/atoms/nested_table.mal
+++ b/monetdb5/modules/atoms/nested_table.mal
@@ -9,6 +9,7 @@ module nestedtable;
 atom nestedtable;
 
 command heap()    address NESTEDTABLEheap;
+command null()    address NESTEDTABLEnull;
 command prelude() address NESTEDTABLEprelude;
 command put()     address NESTEDTABLEput;
 
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -487,12 +487,11 @@ rel_print_(mvc *sql, stream  *fout, sql_
                        mnstr_printf(fout, "& REF %d ", nr);
                } else
                        rel_print_(sql, fout, rel->l, depth+1, refs, decorate);
-               mnstr_printf(fout, ",");
+               print_indent(sql, fout, depth, decorate);
+               mnstr_printf(fout, ")");
 
                // rhs
                exps_print(sql, fout, rel->exps, depth, 1, 0);
-
-               mnstr_printf(fout, ")");
                break;
        }
        case op_insert:
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
@@ -3888,10 +3888,10 @@ rel_push_select_down(int *changes, mvc *
                return rel_merge_projects(changes, sql, rel);
 
        /* push select through join */
-       if (is_select(rel->op) && r && (is_join(r->op) || is_apply(r->op)) && 
!(rel_is_ref(r))) {
+       if (is_select(rel->op) && r && (is_join(r->op) || is_apply(r->op) || 
is_unnest(r->op)) && !(rel_is_ref(r))) {
                sql_rel *jl = r->l;
                sql_rel *jr = r->r;
-               int left = r->op == op_join || r->op == op_left;
+               int left = r->op == op_join || r->op == op_left || r->op == 
op_unnest;
                int right = r->op == op_join || r->op == op_right;
 
                if (is_apply(r->op)) {
@@ -3904,10 +3904,10 @@ rel_push_select_down(int *changes, mvc *
 
                /* introduce selects under the join (if needed) */
                set_processed(jl);
-               set_processed(jr);
+               if(jr) set_processed(jr);
                if (!is_select(jl->op)) 
                        r->l = jl = rel_select(sql->sa, jl, NULL);
-               if (!is_select(jr->op))
+               if (jr && !is_select(jr->op))
                        r->r = jr = rel_select(sql->sa, jr, NULL);
                
                rel->exps = new_exp_list(sql->sa); 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to