Changeset: 4963edf7babf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4963edf7babf
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/backends/monet5/vaults/json/json.c
        sql/server/rel_exp.c
        sql/test/nested/Tests/simple.test
Branch: nested
Log Message:

handle direct format string into nested output string


diffs (truncated from 386 to 300 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
@@ -1749,29 +1749,38 @@ exp2bin_proto_loader(backend *be, sql_ex
 }
 
 static stmt *
-nested_stmts(backend *be, list *exps, node **M)
-{
+nested_stmts(backend *be, sql_exp *e, node **M)
+{
+       assert(is_nested(e));
        node *m = *M;
        list *r = sa_list(be->mvc->sa);
+       list *exps = e->f;
 
        if (!list_empty(exps)) {
                for (node *n = exps->h; n && m; n = n->next) {
                        sql_exp *e = n->data;
                        if (e->type == e_column && e->f) {
-                               stmt *s = nested_stmts(be, e->f, &m);
-                               s->label = e->alias.label;
+                               stmt *s = nested_stmts(be, e, &m);
+                               s = stmt_alias(be, s, e->alias.label, 
exp_relname(e), exp_name(e));
+                               s->subtype = *exp_subtype(e);
+                               //s->label = e->alias.label;
                                s->nested = true;
                                append(r, s);
                        } else {
                                stmt *s = m->data;
-                               s->label = e->alias.label;
+                               s = stmt_alias(be, s, e->alias.label, 
exp_relname(e), exp_name(e));
+                               //s->label = e->alias.label;
                                m = m->next;
                                append(r, s);
                        }
                }
        }
        *M = m;
-       return stmt_list(be, r);
+       stmt *s = stmt_list(be, r);
+       s->nested = true;
+       s->subtype = *exp_subtype(e);
+       s->multiset = s->subtype.multiset;
+       return s;
 }
 
 stmt *
@@ -1930,8 +1939,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        s = stmt_convert(be, l, (!push&&l->nrcols==0)?NULL:sel, 
from, to);
                }
                if (s && s->type == st_list && e->f) {
-                       s = nested_stmts(be, e->f, &s->op4.lval->h);
-                       s->nested = true;
+                       s = nested_stmts(be, e, &s->op4.lval->h);
                }
        }       break;
        case e_func: {
@@ -2386,7 +2394,7 @@ stmt_set_type_param(mvc *sql, sql_subtyp
                return -1;
 
        if (set_type_param(sql, type, param->flag) == 0) {
-               param->op4.typeval = *type;
+               param->subtype = *type;
                return 0;
        }
        return -1;
@@ -2685,7 +2693,7 @@ rel2bin_basetable(backend *be, sql_rel *
                                } else if (s && s->type == st_list && 
c->type.type->composite) {
                                        stmt *ns = stmt_none(be);
                                        ns->type = st_alias;
-                                       ns->op4.typeval = *exp_subtype(exp);
+                                       ns->subtype = *exp_subtype(exp);
                                        ns->virt = true;
                                        list_append(s->op4.lval, ns);
                                }
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
@@ -324,7 +324,7 @@ stmt_bat_new(backend *be, sql_subtype *t
        pushInstruction(be->mb, q);
 
        stmt *s = stmt_create(be->mvc->sa, st_alias);
-       s->op4.typeval = *tpe;
+       s->subtype = *tpe;
        s->q = q;
        s->nr = q->argv[0];
        s->nrcols = 2;
@@ -415,9 +415,9 @@ stmt_var(backend *be, sql_alias *sname, 
        }
 
        if (t)
-               s->op4.typeval = *t;
+               s->subtype = *t;
        else
-               s->op4.typeval.type = NULL;
+               s->subtype.type = NULL;
        s->flag = declare + (level << 1);
        s->key = 1;
        s->q = q;
@@ -485,9 +485,9 @@ stmt_varnr(backend *be, int nr, sql_subt
 
        s->op1 = NULL;
        if (t)
-               s->op4.typeval = *t;
+               s->subtype = *t;
        else
-               s->op4.typeval.type = NULL;
+               s->subtype.type = NULL;
        s->flag = nr;
        s->key = 1;
        s->q = q;
@@ -557,7 +557,7 @@ stmt_temp(backend *be, sql_subtype *t)
                freeInstruction(q);
                goto bailout;
        }
-       s->op4.typeval = *t;
+       s->subtype = *t;
        s->nrcols = 1;
        s->q = q;
        s->nr = getDestVar(q);
@@ -578,7 +578,7 @@ stmt_blackbox_result(backend *be, InstrP
        stmt *s = stmt_create(be->mvc->sa, st_result);
        if (s == NULL)
                return NULL;
-       s->op4.typeval = *t;
+       s->subtype = *t;
        s->nrcols = 2;
        s->q = q;
        s->nr = getArg(q, retnr);
@@ -1217,11 +1217,11 @@ stmt_result(backend *be, stmt *s, int nr
        }
        ns->op1 = s;
        if (!nr && (s->type == st_order || s->type == st_reorder))
-               ns->op4.typeval = *tail_type(s->op1);
+               ns->subtype = *tail_type(s->op1);
        else if (nr && ((s->type == st_join && s->flag == MARKJOIN) || (s->type 
== st_uselect2 && s->flag == MARKJOIN)))
-               ns->op4.typeval = *sql_bind_localtype("bit");
+               ns->subtype = *sql_bind_localtype("bit");
        else
-               ns->op4.typeval = *sql_bind_localtype("oid");
+               ns->subtype = *sql_bind_localtype("oid");
        ns->flag = nr;
        ns->nrcols = s->nrcols;
        ns->key = s->key;
@@ -2926,7 +2926,7 @@ stmt_rs_column(backend *be, stmt *rs, in
                }
 
                s->op1 = rs;
-               s->op4.typeval = *tpe;
+               s->subtype = *tpe;
                s->flag = i;
                s->nrcols = 1;
                s->key = 0;
@@ -3881,11 +3881,11 @@ tail_set_type(mvc *m, stmt *st, sql_subt
                case st_convert:
                case st_temp:
                case st_single:
-                       st->op4.typeval = *t;
+                       st->subtype = *t;
                        return;
                case st_var:
-                       if (st->op4.typeval.type)
-                               st->op4.typeval = *t;
+                       if (st->subtype.type)
+                               st->subtype = *t;
                        return;
                default:
                        return;
@@ -4002,7 +4002,7 @@ temporal_convert(backend *be, stmt *v, s
        s->key = v->key;
        s->nrcols = v->nrcols;
        s->aggr = v->aggr;
-       s->op4.typeval = *t;
+       s->subtype = *t;
        s->nr = getDestVar(q);
        s->q = q;
        s->cand = pushed ? sel : NULL;
@@ -4037,6 +4037,7 @@ typedef struct result_subtype {
        sql_subtype st;
        bool multiset; /* multiset id */
 } result_subtype;
+
 /* mark multiset rowid and msid as multiset, for later id correction */
 static int
 composite_type_result(backend *be, InstrPtr q, sql_subtype *t, result_subtype 
*tps)
@@ -4126,12 +4127,16 @@ stmt_from_json(backend *be, stmt *v, stm
        s->nrcols = 2;
        s->key = v->key;
        s->aggr = v->aggr;
-       s->op4.typeval = *t;
+       s->subtype = *t;
        s->nr = getDestVar(q);
        s->q = q;
        //s->cand = pushed ? sel : NULL;
        pushInstruction(be->mb, q);
-       return result_list(be, s->q, 0, tps, nrcols);
+       s = result_list(be, s->q, 0, tps, nrcols);
+       s->subtype = *t;
+       s->nested = true;
+       s->multiset = t->multiset;
+       return s;
 bailout:
        if (be->mvc->sa->eb.enabled)
                eb_error(&be->mvc->sa->eb, be->mvc->errstr[0] ? be->mvc->errstr 
: be->mb->errors ? be->mb->errors : *GDKerrbuf ? GDKerrbuf : "out of memory", 
1000);
@@ -4170,12 +4175,16 @@ stmt_from_varchar(backend *be, stmt *v, 
        s->nrcols = 2;
        s->key = v->key;
        s->aggr = v->aggr;
-       s->op4.typeval = *t;
+       s->subtype = *t;
        s->nr = getDestVar(q);
        s->q = q;
        //s->cand = pushed ? sel : NULL;
        pushInstruction(be->mb, q);
-       return result_list(be, s->q, 0, tps, nrcols);
+       s = result_list(be, s->q, 0, tps, nrcols);
+       s->subtype = *t;
+       s->nested = true;
+       s->multiset = t->multiset;
+       return s;
 bailout:
        if (be->mvc->sa->eb.enabled)
                eb_error(&be->mvc->sa->eb, be->mvc->errstr[0] ? be->mvc->errstr 
: be->mb->errors ? be->mb->errors : *GDKerrbuf ? GDKerrbuf : "out of memory", 
1000);
@@ -4334,7 +4343,7 @@ stmt_convert(backend *be, stmt *v, stmt 
        s->key = v->key;
        s->nrcols = v->nrcols;
        s->aggr = v->aggr;
-       s->op4.typeval = *t;
+       s->subtype = *t;
        s->nr = getDestVar(q);
        s->q = q;
        s->cand = pushed ? sel : NULL;
@@ -4815,6 +4824,7 @@ stmt_alias_(backend *be, stmt *op1, int 
        s->multiset = op1->multiset;
        s->nested = op1->nested;
        s->virt = op1->virt;
+       s->subtype = op1->subtype;
 
        s->tname = tname;
        s->cname = alias;
@@ -4845,6 +4855,8 @@ stmt_as(backend *be, stmt *s, stmt *org)
 sql_subtype *
 tail_type(stmt *st)
 {
+       if (st->subtype.type)
+               return &st->subtype;
        for (;;) {
                switch (st->type) {
                case st_const:
@@ -4865,7 +4877,7 @@ tail_type(stmt *st)
                        return sql_bind_localtype("oid");
                case st_alias:
                        if (!st->op1)
-                               return &st->op4.typeval;
+                               return &st->subtype;
                        /* fall through */
                case st_append:
                case st_append_bulk:
@@ -4900,7 +4912,7 @@ tail_type(stmt *st)
                case st_mirror:
                        return sql_bind_localtype("oid");
                case st_result:
-                       return &st->op4.typeval;
+                       return &st->subtype;
                case st_table_clear:
                        return sql_bind_localtype("lng");
                case st_aggr:
@@ -4918,10 +4930,10 @@ tail_type(stmt *st)
                case st_temp:
                case st_single:
                case st_rs_column:
-                       return &st->op4.typeval;
+                       return &st->subtype;
                case st_var:
-                       if (st->op4.typeval.type)
-                               return &st->op4.typeval;
+                       if (st->subtype.type)
+                               return &st->subtype;
                        /* fall through */
                case st_exception:
                        return NULL;
@@ -5336,7 +5348,7 @@ const_column(backend *be, stmt *val)
                goto bailout;
        }
        s->op1 = val;
-       s->op4.typeval = *ct;
+       s->subtype = *ct;
        s->nrcols = 1;
 
        s->tname = val->tname;
@@ -5387,7 +5399,7 @@ stmt_fetch(backend *be, stmt *val)
                goto bailout;
        }
        s->op1 = val;
-       s->op4.typeval = *ct;
+       s->subtype = *ct;
        s->nrcols = 0;
 
        s->tname = val->tname;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to