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

Reply via email to