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 -- [email protected]
To unsubscribe send an email to [email protected]