Changeset: 413a6264f93a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/413a6264f93a
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/rel_tvtree.c
sql/backends/monet5/rel_tvtree.h
Branch: tvtree
Log Message:
tv_tree now supports multiset/arrayof for composite types
diffs (183 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
@@ -828,6 +828,8 @@ tuple_result(backend *be, list *cols)
static stmt *
value_list(backend *be, sql_exp *vals_exp, stmt *left, stmt *sel)
{
+ if (!be) return NULL;
+
assert(is_values(vals_exp));
list *vals = exp_get_values(vals_exp);
sql_subtype *type = exp_subtype(vals_exp);
@@ -877,6 +879,8 @@ value_list(backend *be, sql_exp *vals_ex
static stmt *
value_tvtree(backend *be, sql_exp *vals_exp, stmt *left, stmt *sel)
{
+ if (!be) return NULL;
+
assert(is_values(vals_exp));
list *vals = exp_get_values(vals_exp);
sql_subtype *st = exp_subtype(vals_exp);
@@ -1866,8 +1870,9 @@ exp_bin(backend *be, sql_exp *e, stmt *l
assert(vname->name);
s = stmt_var(be, vname->sname ? a_create(sql->sa,
sa_strdup(sql->sa, vname->sname)) : NULL, sa_strdup(sql->sa, vname->name),
e->tpe.type?&e->tpe:NULL, 0, e->flag);
} else if (e->f) { /* values */
- s = value_list(be, e, left, sel);
- /*s = value_tvtree(be, e, left, sel);*/
+ // TODO: >>>>>>>>>>>>>>>>>>>> remove value_list and
friends
+ value_list(NULL, e, left, sel);
+ s = value_tvtree(be, e, left, sel);
} else { /* arguments */
sql_subtype *t = e->tpe.type?&e->tpe:NULL;
if (!t && 0) {
diff --git a/sql/backends/monet5/rel_tvtree.c b/sql/backends/monet5/rel_tvtree.c
--- a/sql/backends/monet5/rel_tvtree.c
+++ b/sql/backends/monet5/rel_tvtree.c
@@ -42,6 +42,7 @@ tv_node(allocator *sa, sql_subtype *st)
n->st = st;
n->tvt = tv_get_type(st);
+ n->rid_idx = 0;
n->cf = n->rid = n->msid = n->msnr = n->vals = NULL;
/* allocate only the lists that we need based on tv-tree type */
@@ -113,12 +114,48 @@ tv_tuple_value(backend *be, tv_tree *t,
assert(!tuple->f);
stmt *i = exp_bin(be, tuple, left, NULL, NULL, NULL,
NULL, sel, 0, 0, 0);
if (!i)
- return NULL;
+ return false;
+ assert(t->vals);
list_append(t->vals, i);
break;
case TV_MS_COMP:
case TV_SO_COMP:
- // TODO
+ assert(tuple->f);
+
+ /* add the rowid to the mset "origin" table */
+ stmt *rid = stmt_atom_int(be, t->rid_idx);
+ if (!rid)
+ return false;
+ assert(t->rid);
+ list_append(t->rid, rid);
+
+ /* per tuple insert actual data, msid(=rowid), msnr(for
MS only) */
+ list *ms_vals = tuple->f;
+ for (node *n = ms_vals->h; n; n = n->next) {
+
+ int msnr_idx = 1; /* NOTE: in mset-value
values are 1-offset indexed */
+ list *cvals = ((sql_exp*)n->data)->f;
+ for (node *m = cvals->h; m; m = m->next,
msnr_idx++)
+ if (false == tv_tuple_value(be,
list_fetch(t->cf, msnr_idx - 1), m->data, left, sel))
+ return false;
+
+ stmt *msid = stmt_atom_int(be, t->rid_idx);
+ if (!msid)
+ return false;
+ list_append(t->msid, msid);
+
+ if (t->tvt == TV_MS_COMP) {
+ stmt *msnr = stmt_atom_int(be,
msnr_idx);
+ if (!msnr)
+ return false;
+ list_append(t->msnr, msnr);
+ }
+ }
+
+ /* we inserted all the mset values for a tuple for a
given
+ * row so now increment this tv_tree node's (mset)
rowid */
+ t->rid_idx++;
+
break;
case TV_COMP:
assert(tuple->f);
@@ -148,30 +185,59 @@ tv_parse_values(backend *be, tv_tree *t,
return true;
}
-stmt *
-tv_generate_stmts(backend *be, tv_tree *t)
+static void
+tv_generate_stmts_(backend *be, tv_tree *t, list *stmts_list)
{
+ stmt *ap;
+
switch (t->tvt) {
case TV_MS_BSC:
case TV_SO_BSC:
// TODO
break;
case TV_BASIC:
- return stmt_append_bulk(be, stmt_temp(be, t->st),
t->vals);
+ ap = stmt_append_bulk(be, stmt_temp(be, t->st),
t->vals);
+ list_append(stmts_list, ap);
+ break;
case TV_MS_COMP:
case TV_SO_COMP:
- // TODO
+ stmt *tmp;
+
+ tmp = stmt_temp(be, tail_type(t->rid->h->data));
+ ap = stmt_append_bulk(be, tmp, t->rid);
+ append(stmts_list, ap);
+
+ for (node *n = t->cf->h; n; n = n->next)
+ tv_generate_stmts_(be, n->data, stmts_list);
+
+ tmp = stmt_temp(be, tail_type(t->msid->h->data));
+ ap = stmt_append_bulk(be, tmp, t->msid);
+ append(stmts_list, ap);
+
+ if (t->tvt == TV_MS_COMP) {
+ tmp = stmt_temp(be,
tail_type(t->msnr->h->data));
+ ap = stmt_append_bulk(be, tmp, t->msnr);
+ append(stmts_list, ap);
+ }
break;
case TV_COMP:
/* gather all the composite (sub)field's statements */
- list *fsts = sa_list(be->mvc->sa);
for (node *n = t->cf->h; n; n = n->next)
- append(fsts, tv_generate_stmts(be, n->data));
- return stmt_list(be, fsts);
+ tv_generate_stmts_(be, n->data, stmts_list);
+ break;
default:
assert(0);
break;
}
+}
- return NULL;
+stmt *
+tv_generate_stmts(backend *be, tv_tree *t)
+{
+ list *stmts_list = sa_list(be->mvc->sa);
+ tv_generate_stmts_(be, t, stmts_list);
+ if (t->tvt == TV_BASIC)
+ return stmts_list->h->data;
+ else
+ return stmt_list(be, stmts_list);
}
diff --git a/sql/backends/monet5/rel_tvtree.h b/sql/backends/monet5/rel_tvtree.h
--- a/sql/backends/monet5/rel_tvtree.h
+++ b/sql/backends/monet5/rel_tvtree.h
@@ -44,11 +44,12 @@ typedef enum tv_type {
typedef struct type_values_tree {
tv_type tvt;
sql_subtype *st;
- list *cf; // list of composite type (sub)fields
+ int rid_idx; // mset values needs to know to which row they correspond
to
+ list *cf; // list of composite type (sub)fields
/* next members are lists of stmts IF they are instantiated */
- list *rid;
- list *msid;
- list *msnr;
+ list *rid; // row id for multisets
+ list *msid; // multiset id (always refers to a row id)
+ list *msnr; // multiset number is the index inside a multiset entry
list *vals;
} tv_tree;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]