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