Changeset: 3d7c888f47da for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3d7c888f47da Modified Files: sql/backends/monet5/sql_statement.c Branch: pushcands Log Message:
Cleanup. Don't generate statements within other statements diffs (123 lines): diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -1349,6 +1349,21 @@ stmt_genselect(backend *be, stmt *lops, if (backend_create_subfunc(be, f, NULL) < 0) return NULL; + if (!push_cands && sel) { + for (node *n = lops->op4.lval->h; n; n = n->next) { + stmt *op = n->data; + + if (op->nrcols > 0 && !op->cand) /* don't push cands twice */ + n->data = stmt_project_column_on_cand(be, sel, op); + } + for (node *n = rops->op4.lval->h; n; n = n->next) { + stmt *op = n->data; + + if (op->nrcols > 0 && !op->cand) /* don't push cands twice */ + n->data = stmt_project_column_on_cand(be, sel, op); + } + } + if (rops->nrcols >= 1) { bit need_not = FALSE; int narg = 3 + list_length(lops->op4.lval) + list_length(rops->op4.lval); @@ -1367,15 +1382,11 @@ stmt_genselect(backend *be, stmt *lops, for (node *n = lops->op4.lval->h; n; n = n->next) { stmt *op = n->data; - if (!push_cands && sel && op->nrcols > 0 && !op->cand) /* don't push cands twice */ - op = stmt_project_column_on_cand(be, sel, op); q = pushArgument(mb, q, op->nr); } for (node *n = rops->op4.lval->h; n; n = n->next) { stmt *op = n->data; - if (!push_cands && sel && op->nrcols > 0 && !op->cand) /* don't push cands twice */ - op = stmt_project_column_on_cand(be, sel, op); q = pushArgument(mb, q, op->nr); } if (push_cands) { @@ -1424,11 +1435,13 @@ stmt_genselect(backend *be, stmt *lops, for (node *n = lops->op4.lval->h; n; n = n->next) { stmt *op = n->data; - if (!push_cands && sel && op->nrcols > 0 && !op->cand) /* don't push cands twice */ - op = stmt_project_column_on_cand(be, sel, op); q = pushArgument(mb, q, op->nr); - - if (push_cands) { + } + + if (push_cands) { + for (node *n = lops->op4.lval->h; n; n = n->next) { + stmt *op = n->data; + if (!op->cand && op->nrcols && sel) /* don't push cands again */ q = pushArgument(mb, q, sel->nr); else { @@ -1465,7 +1478,7 @@ stmt_genselect(backend *be, stmt *lops, s->op3 = sel; s->key = lops->nrcols == 0 && rops->nrcols == 0; s->flag = cmp_filter; - s->nrcols = lops->nrcols; + s->nrcols = MAX(lops->nrcols, rops->nrcols); s->nr = getDestVar(q); s->q = q; s->cand = sel; @@ -3417,6 +3430,7 @@ stmt_func(backend *be, stmt *ops, stmt * prop *p = NULL; sql_allocator *sa = be->mvc->sa; stmt *o = NULL, *s = NULL; + int pushed = 0, nrcols = 0; /* dump args */ if (ops && ops->nr < 0) @@ -3434,6 +3448,22 @@ stmt_func(backend *be, stmt *ops, stmt * if (monet5_create_relational_function(be->mvc, mod, name, rel, ops, NULL, 1) < 0) return NULL; + if (ops && list_length(ops->op4.lval)) { + o = ops->op4.lval->h->data; + for (node *n = ops->op4.lval->h; n; n = n->next) { + stmt *op = n->data; + + if (sel && op->nrcols > 0 && !op->cand) {/* don't push cands twice */ + n->data = op = stmt_project_column_on_cand(be, sel, op); + pushed = 1; + } + if (o->nrcols < op->nrcols) + o = op; + if (op->nrcols) + nrcols++; + } + } + if (f_union) q = newStmt(mb, batmalRef, multiplexRef); else @@ -3444,14 +3474,9 @@ stmt_func(backend *be, stmt *ops, stmt * q = pushStr(mb, q, name); } if (ops && list_length(ops->op4.lval)) { - o = ops->op4.lval->h->data; for (node *n = ops->op4.lval->h; n; n = n->next) { stmt *op = n->data; - if (sel && op->nrcols > 0 && !op->cand) /* don't push cands twice */ - op = stmt_project_column_on_cand(be, sel, op); - if (o->nrcols < op->nrcols) - o = op; q = pushArgument(mb, q, op->nr); } } @@ -3476,7 +3501,7 @@ stmt_func(backend *be, stmt *ops, stmt * } s->nr = getDestVar(q); s->q = q; - s->cand = sel; + s->cand = (pushed || (sel && nrcols))?sel:NULL; return s; } return NULL; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list