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]