Changeset: 90181b320f0a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=90181b320f0a
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_gencode.c
        sql/server/rel_select.c
Branch: arrays
Log Message:

handling queries with tunion (e.g. select * from a where v=0 OR v=2)


diffs (72 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
@@ -58,6 +58,7 @@ static stmt* find_e_column_uselect(sql_a
        switch(joins->type) {
                case st_mbrselect:
                        return find_e_column_uselect(sa, joins->op3, col);
+               case st_tunion:
                case st_uselect:
                        //only the cells that qualify for the uselect shoudl 
have values
 //                     if(joins->op1->type == st_bat) {
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
@@ -755,7 +755,7 @@ pushSchema(MalBlkPtr mb, InstrPtr q, sql
 static int find_uselect(stmt *s){
        if(!s)
                return -1;
-       if(s->type == st_uselect)
+       if(s->type == st_uselect || s->type == st_tunion)
                return s->nr;
        return find_uselect(s->op3);
 }
@@ -1217,7 +1217,7 @@ static int
 
                        q = newStmt2(mb, "algebra", "mbrsubselect");
                        q = pushArgument(mb, q, l);
-                       if(s->op3->type == st_uselect)
+                       if(s->op3->type == st_uselect || s->op3->type == 
st_tunion)
                                q = pushArgument(mb, q, sub);
                        else {
                                int cand = find_uselect(s->op3);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5331,6 +5331,14 @@ rel_remove_internal_exp(sql_rel *rel)
        }
 }
 
+static bool isColumn(sql_exp* exp) {
+       if(exp->type == e_cmp && ((sql_exp*)exp->l)->type == e_column)
+               return true;
+       if(exp->f)
+               return isColumn(exp->f);
+       return false;
+}
+
 static sql_rel *
 rel_select_exp(mvc *sql, sql_rel *rel, SelectNode *sn, exp_kind ek)
 {
@@ -5362,9 +5370,9 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
                                list *newFilters = new_exp_list(sql->sa);
                                for(whereExpNode=r->exps->h; whereExpNode; 
whereExpNode=whereExpNode->next) {
                                        sql_exp *whereExp = whereExpNode->data;
-                                       if(whereExp->type == e_cmp) {
-                                               sql_exp *innerExp = whereExp->l;
-                                               if(innerExp->type == e_column) {
+                                       if(isColumn(whereExp)) {
+//                                             sql_exp *innerExp = whereExp->l;
+//                                             if(innerExp->type == e_column) {
                                                        if(!newFilters->cnt) {
                                                                //found a 
filter on a non-dimensinal column     
                                                                /*Assuming a 
single array add all dimensions of it to the filtering condition*/
@@ -5376,7 +5384,7 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
                                                                        }
                                                                }
                                                        }
-                                               }
+//                                             }
                                        } else {
                                                fprintf(stderr, "Unrecognised 
exp->type\n");
                                                return NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to