Changeset: 85b7e25ec442 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/85b7e25ec442 Branch: default Log Message:
Merged branch recursive_cte into default. diffs (truncated from 3286 to 300 lines): diff --git a/monetdb5/optimizer/opt_commonTerms.c b/monetdb5/optimizer/opt_commonTerms.c --- a/monetdb5/optimizer/opt_commonTerms.c +++ b/monetdb5/optimizer/opt_commonTerms.c @@ -120,7 +120,7 @@ OPTcommonTermsImplementation(Client cntx p->retc == p->argc); pushInstruction(mb, p); old[i] = NULL; - continue; + break; } /* when we enter a barrier block, we should ditch all previous instructions from consideration */ diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c --- a/monetdb5/optimizer/opt_pipes.c +++ b/monetdb5/optimizer/opt_pipes.c @@ -203,6 +203,37 @@ static struct pipeline { }, true, }, + {"recursive_pipe", + (char *[]) { + "inline", + "remap", + "costModel", + "coercions", + "aliases", + "evaluate", + "deadcode", + "pushselect", + "aliases", + "for", + "dict", + "mergetable", + "aliases", + "constants", + "projectionpath", + "deadcode", + "matpack", + "querylog", + "multiplex", + "generator", + "candidates", + "deadcode", + "postfix", + "profiler", + "garbageCollector", + NULL, + }, + true, + }, /* Experimental pipelines stressing various components under * development. Do not use any of these pipelines in production * settings! 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 @@ -114,9 +114,7 @@ sql_unop_(backend *be, const char *fname static stmt * refs_find_rel(list *refs, sql_rel *rel) { - node *n; - - for (n=refs->h; n; n = n->next->next) { + for (node *n = refs->h; n; n = n->next->next) { sql_rel *ref = n->data; stmt *s = n->next->data; @@ -129,9 +127,7 @@ refs_find_rel(list *refs, sql_rel *rel) static void refs_update_stmt(list *refs, sql_rel *rel, stmt *s) { - node *n; - - for (n=refs->h; n; n = n->next->next) { + for (node *n = refs->h; n; n = n->next->next) { sql_rel *ref = n->data; if (rel == ref) { @@ -192,7 +188,7 @@ list_find_column(backend *be, list *l, c const char *nme = column_name(be->mvc->sa, s); if (rnme && strcmp(rnme, rname) == 0 && - strcmp(nme, name) == 0) { + strcmp(nme, name) == 0) { res = s; break; } @@ -219,7 +215,7 @@ list_find_column(backend *be, list *l, c const char *nme = column_name(be->mvc->sa, n->data); if (rnme && strcmp(rnme, rname) == 0 && - strcmp(nme, name) == 0) { + strcmp(nme, name) == 0) { res = n->data; break; } @@ -449,7 +445,7 @@ subrel_project(backend *be, stmt *s, lis stmt *c = n->data; assert(c->type == st_alias || (c->type == st_join && c->flag == cmp_project) || c->type == st_bat || c->type == st_idxbat || c->type == st_single); - if (c->type != st_alias) { + if (c->type != st_alias || c->flag) { c = stmt_project(be, cand, c); } else if (c->op1->type == st_mirror && is_tid_chain(cand)) { /* alias with mirror (ie full row ids) */ //c = stmt_alias(be, cand, 0, c->tname, c->cname); @@ -547,7 +543,7 @@ handle_in_exps(backend *be, sql_exp *ce, ?sql_bind_func(sql, "sys", "=", tail_type(c), tail_type(c), F_FUNC, true, true) :sql_bind_func(sql, "sys", "<>", tail_type(c), tail_type(c), F_FUNC, true, true); sql_subfunc *a = (in)?sql_bind_func(sql, "sys", "or", bt, bt, F_FUNC, true, true) - :sql_bind_func(sql, "sys", "and", bt, bt, F_FUNC, true, true); + :sql_bind_func(sql, "sys", "and", bt, bt, F_FUNC, true, true); for (n = nl->h; n; n = n->next) { sql_exp *e = n->data; @@ -952,19 +948,19 @@ exp2bin_named_placeholders(backend *be, InstrPtr q = newAssignment(be->mb); if (!q || !t || !s) { - sql_error(be->mvc, 10, SQLSTATE(42000) MAL_MALLOC_FAIL); + sql_error(be->mvc, 10, SQLSTATE(42000) MAL_MALLOC_FAIL); return NULL; } - int type = t->type->localtype, varid = 0; - - snprintf(arg, IDLENGTH, "A%d", argc); - if ((varid = newVariable(be->mb, arg, strlen(arg), type)) < 0) { - sql_error(be->mvc, 10, SQLSTATE(42000) "Internal error while compiling statement: variable id too long"); + int type = t->type->localtype, varid = 0; + + snprintf(arg, IDLENGTH, "A%d", argc); + if ((varid = newVariable(be->mb, arg, strlen(arg), type)) < 0) { + sql_error(be->mvc, 10, SQLSTATE(42000) "Internal error while compiling statement: variable id too long"); return NULL; - } + } if (q) getDestVar(q) = varid; - q = pushArgument(be->mb, q, s->nr); + q = pushArgument(be->mb, q, s->nr); pushInstruction(be->mb, q); } return NULL; @@ -1420,7 +1416,7 @@ is_const_func(sql_subfunc *f, list *attr if (list_length(attr) != 2) return false; if (strcmp(f->func->base.name, "quantile") == 0 || - strcmp(f->func->base.name, "quantile_avg") == 0) + strcmp(f->func->base.name, "quantile_avg") == 0) return true; return false; } @@ -2691,7 +2687,6 @@ rel2bin_table(backend *be, sql_rel *rel, for (en = rel->exps->h; en; en = en->next) { sql_exp *exp = en->data; const char *rnme = exp_relname(exp)?exp_relname(exp):exp->l; - //stmt *s = bin_find_column(be, sub, exp->l, exp->r); stmt *s = bin_find_column_nid(be, sub, exp->nid); if (!s) { @@ -2886,7 +2881,7 @@ can_join_exp(sql_rel *rel, sql_exp *e, b if ((ll && !rl && ((rr && !lr) || (nrcr1 = r->card == CARD_ATOM && exp_is_atom(r))) && ((rf && !lf) || (nrcr2 = f->card == CARD_ATOM && exp_is_atom(f))) && (nrcr1+nrcr2) <= 1) || - (rl && !ll && + (rl && !ll && ((lr && !rr) || (nrcl1 = r->card == CARD_ATOM && exp_is_atom(r))) && ((lf && !rf) || (nrcl2 = f->card == CARD_ATOM && exp_is_atom(f))) && (nrcl1+nrcl2) <= 1)) { can_join = 1; @@ -3944,7 +3939,7 @@ rel2bin_distinct(backend *be, stmt *s, s static stmt * rel2bin_single(backend *be, stmt *s) { - if (s->key && s->nrcols == 0) + if (!s || (s->key && s->nrcols == 0)) return s; mvc *sql = be->mvc; @@ -3969,9 +3964,6 @@ rel2bin_single(backend *be, stmt *s) static stmt * rel_rename(backend *be, sql_rel *rel, stmt *sub) { - mvc *sql = be->mvc; - - (void) sql; if (rel->exps) { node *en, *n; list *l = sa_list(be->mvc->sa); @@ -3981,7 +3973,7 @@ rel_rename(backend *be, sql_rel *rel, st stmt *s = n->data; if (!s) { - assert(sql->session->status == -10); /* Stack overflow errors shouldn't terminate the server */ + assert(be->mvc->session->status == -10); /* Stack overflow errors shouldn't terminate the server */ return NULL; } s = stmt_rename(be, exp, s); @@ -3992,9 +3984,276 @@ rel_rename(backend *be, sql_rel *rel, st return sub; } +static stmt* +subres_assign_newresultvars(backend *be, stmt *rel_stmt) +{ + list *stmts = rel_stmt->op4.lval; + list *nstmt = sa_list(be->mvc->sa); + for (node *n = stmts->h; n; n = n->next) { + stmt *r = n->data; + InstrPtr a = newAssignment(be->mb); + stmt *ns = NULL; + const char *rnme = table_name(be->mvc->sa, r); + const char *nme = column_name(be->mvc->sa, r); + int label = r->label; + + if (r->nrcols == 0) + r = const_column(be, r); + ns = stmt_alias(be, r, label, rnme, nme); + ns->flag = cmp_project; /* mark as special */ + a = pushArgument(be->mb, a, ns->nr); + pushInstruction(be->mb, a); + ns->q = a; + ns->nr = a->argv[0]; + append(nstmt, ns); + } + return stmt_list(be, nstmt); +} + +static stmt* +subres_assign_resultvars(backend *be, stmt *rel_stmt, list *vars) +{ + list *stmts = rel_stmt->op4.lval; + list *nstmt = sa_list(be->mvc->sa); + for (node *n = stmts->h, *m = vars->h; n && m; n = n->next, m = m->next) { + stmt *r = n->data; + stmt *v = m->data; + InstrPtr a = newAssignment(be->mb); + stmt *ns = NULL; + const char *rnme = table_name(be->mvc->sa, r); + const char *nme = column_name(be->mvc->sa, r); + int label = r->label; + + if (r->nrcols == 0) + r = const_column(be, r); + ns = stmt_alias(be, r, label, rnme, nme); + a->argv[0] = v->nr; + a = pushArgument(be->mb, a, ns->nr); + pushInstruction(be->mb, a); + ns->q = a; + ns->nr = a->argv[0]; + append(nstmt, ns); + } + return stmt_list(be, nstmt); +} + +static sql_exp* +topn_limit(sql_rel *rel) +{ + if (rel->exps) { + sql_exp *limit = rel->exps->h->data; + if (exp_is_null(limit)) /* If the limit is NULL, ignore the value */ + return NULL; + return limit; + } + return NULL; +} + +static sql_exp* +topn_offset(sql_rel *rel) +{ + if (rel->exps && list_length(rel->exps) > 1) { + sql_exp *offset = rel->exps->h->next->data; + + return offset; + } + return NULL; +} + +static stmt * +stmt_limit_value(backend *be, sql_rel *topn) +{ + stmt *l = NULL; + + if (topn) { + sql_exp *le = topn_limit(topn); + sql_exp *oe = topn_offset(topn); + + if (le) { + l = exp_bin(be, le, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0); + if(!l) + return NULL; + if (oe) { + sql_subtype *lng = sql_bind_localtype("lng"); + sql_subfunc *add = sql_bind_func_result(be->mvc, "sys", "sql_add", F_FUNC, true, lng, 2, lng, lng); + stmt *o = exp_bin(be, oe, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0); + if(!o) + return NULL; + l = stmt_binop(be, l, o, NULL, add); + } + } + } + return l; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org