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

do not put cross product in arrays updated to handle also caseses where the 
basetable is in select


diffs (108 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
@@ -1719,7 +1719,19 @@ rel2bin_qqr(mvc *sql, sql_rel *rel, list
        return stmt_list(sql->sa, l);
 }
 
-
+static bool isArrayBasetable(sql_rel *r) {
+       switch(r->op) {
+               case op_basetable: {
+                       sql_table *t = (sql_table*)r->l;
+                       return isArray(t);
+               } case op_select:
+                       return isArrayBasetable(r->l);
+               default:
+                       return 0;
+       }
+
+       return 0;
+}
 static stmt *
 rel2bin_join( mvc *sql, sql_rel *rel, list *refs)
 {
@@ -1729,29 +1741,15 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
        stmt *ld = NULL, *rd = NULL;
        int need_left = (rel->flag == LEFT_JOIN);
 
-       stmt *leftArray = NULL, *rightArray = NULL;
+       bool leftArray = 0, rightArray = 0;
        if (rel->l) { /* first construct the left sub relation */
-               sql_rel *rtmp;
                left = subrel_bin(sql, rel->l, refs);
-               
-               rtmp = (sql_rel*)rel->l;
-               if(rtmp->op == op_basetable) {
-                       sql_table *t = (sql_table*)rtmp->l;
-                       if(isArray(t))
-                               leftArray = rel2bin_basetable(sql, rel->l);
-               }
+               leftArray = isArrayBasetable((sql_rel*)rel->l);
        }
 
        if (rel->r) {/* first construct the right sub relation */
-               sql_rel *rtmp;
                right = subrel_bin(sql, rel->r, refs);
-               
-               rtmp = (sql_rel*)rel->r;
-               if(rtmp->op == op_basetable) {
-                       sql_table *t = (sql_table*)rtmp->l;
-                       if(isArray(t))
-                               rightArray = rel2bin_basetable(sql, rel->r);
-               }
+               rightArray = isArrayBasetable((sql_rel*)rel->l);
        }
 
        if(leftArray && rightArray) {
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
@@ -5532,47 +5532,6 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
                                return sql_error(sql, 02, "Subquery result 
missing");
                        return NULL;
                }
-#if 0
-               if(rel->op == op_basetable) {
-                       sql_table *t = (sql_table*)rel->l;
-                       if(isArray(t)) {
-                       /* if it is an array we need to add filtering condition 
on the dimensional columns 
-                        * so that we can create a bounding box over the 
qualifying values. We do not need
-                        * to add something in case filter conditions are on 
dimensional columns. */
-                               node *whereExpNode;
-                               list *newFilters = new_exp_list(sql->sa);
-                               for(whereExpNode=r->exps->h; whereExpNode; 
whereExpNode=whereExpNode->next) {
-                                       sql_exp *whereExp = whereExpNode->data;
-                                       if(isColumn(whereExp)) {
-                                                       if(!newFilters->cnt) {
-                                                               /*Assuming a 
single array add all dimensions of it to the filtering condition*/
-                                                               node 
*basetableExps;
-                                                               
for(basetableExps = rel->exps->h ; basetableExps; basetableExps = 
basetableExps->next) {
-                                                                       
sql_exp* dimExp = basetableExps->data;
-                                                                       
if(dimExp->type == e_dimension) {
-                                                                               
append(newFilters, exp_mbr(sql->sa, dimExp));
-                                                                       }
-                                                               }
-                                                       }
-                                       }
-                                       if(newFilters->cnt)
-                                               break;
-                               }
-
-                               //add the newFilters to the where conditions
-                               for(whereExpNode=newFilters->h; whereExpNode; 
whereExpNode=whereExpNode->next) {
-                                       sql_exp *exp = whereExpNode->data;
-                                       append(r->exps, exp);
-                               }
-                       }
-               } else {
-                       sql_table *t = (sql_table*)rel->l;
-                       if(t && isArray(t)) {
-                               fprintf(stderr, "Array but not basetable\n");
-                               return NULL;
-                       }
-               }
-#endif
                rel = r;
        }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to