Changeset: ada63614471c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ada63614471c
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_basetable.c
        sql/server/rel_optimize_others.c
        sql/server/rel_partition.c
Branch: nested
Log Message:

fix handling deep nested objects


diffs (133 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
@@ -2641,6 +2641,14 @@ rel2bin_subtable(backend *be, sql_table 
                                if (s && s->type == st_list && 
c->type.multiset) { /* keep rowid at the end */
                                        stmt *ns = stmt_col(be, c, dels, 
dels->partition);
                                        list_append(s->op4.lval, ns);
+                                       s->nr = ns->nr;
+                                       s->multiset = c->type.multiset;
+                               } else if (s && s->type == st_list && 
c->type.type->composite) {
+                                       stmt *ns = stmt_none(be);
+                                       ns->type = st_alias;
+                                       ns->subtype = *exp_subtype(exp);
+                                       ns->virt = true;
+                                       list_append(s->op4.lval, ns);
                                }
                        } else {
                                s = stmt_col(be, c, dels, dels->partition);
diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c
--- a/sql/server/rel_basetable.c
+++ b/sql/server/rel_basetable.c
@@ -175,29 +175,28 @@ rel_nested_basetable_add_cols(mvc *sql, 
        atname->parent = ba->name;
        int i = 0;
        prop *p = NULL;
-       sql_exp *e = NULL;
+       sql_exp *e = NULL, *ce = NULL;
+       int composite = 0;
        for (node *cn = ol_first_node(t->columns); cn; cn = cn->next, i++) {
                sql_column *c = cn->data;
                if (!column_privs(sql, c, PRIV_SELECT))
                        continue;
                if (c->type.multiset) {
                        e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 1);
-                       if (e) {
-                               e->nid = -(ba->basenr + i);
-                               e->alias.label = e->nid;
-                               set_intern(e);
-                               set_basecol(e);
-                               append(exps, e);
+                       if (e)
                                e->f = sa_list(sql->sa);
-                       }
-
                        if (!e || !e->f)
                                return NULL;
                        sql_table *t = mvc_bind_table(sql, c->t->s, 
c->storage_type);
                        if (rel_nested_basetable_add_cols(sql, pba, 
c->base.name, t, e->f) == NULL)
                                e = NULL;
-                       else
-                               continue;
+               } else if (c->type.type->composite) {
+                       composite = list_length(c->type.type->d.fields);
+                       ce = e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
+                       if (e)
+                               e->f = sa_list(sql->sa);
+                       if (!e || !e->f)
+                               return NULL;
                } else {
                        e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 1);
                }
@@ -215,17 +214,15 @@ rel_nested_basetable_add_cols(mvc *sql, 
                set_intern(e);
                set_basecol(e);
                sql_column_get_statistics(sql, c, e);
-               append(exps, e);
+               if (ce && ce != e) {
+                       append(ce->f, e);
+                       composite--;
+                       if (!composite)
+                               ce = NULL;
+               } else {
+                       append(exps, e);
+               }
        }
-/*
-       e = exp_alias(sql, atname, TID, atname, TID, sql_bind_localtype("oid"), 
CARD_MULTI, 0, 1, 1);
-       if (e == NULL)
-               return NULL;
-       e->nid = -(ba->basenr + i);
-       e->alias.label = e->nid;
-       append(exps, e);
-       i++;
-*/
        return ba;
 }
 
@@ -266,20 +263,13 @@ rel_nested_basetable(mvc *sql, sql_table
                        continue;
                if (c->type.multiset) {
                        e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
-                       if (e) {
-                               e->nid = -(ba->basenr + i);
-                               e->alias.label = e->nid;
-                               set_basecol(e);
-                               append(rel->exps, e);
+                       if (e)
                                e->f = sa_list(sql->sa);
-                       }
                        if (!e || !e->f)
                                return NULL;
                        sql_table *t = mvc_bind_table(sql, c->t->s, 
c->storage_type);
                        if (rel_nested_basetable_add_cols(sql, ba, 
c->base.name, t, e->f) == NULL)
                                e = NULL;
-                       else
-                               continue;
                } else if (c->type.type->composite) {
                        composite = list_length(c->type.type->d.fields);
                        ce = e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
diff --git a/sql/server/rel_optimize_others.c b/sql/server/rel_optimize_others.c
--- a/sql/server/rel_optimize_others.c
+++ b/sql/server/rel_optimize_others.c
@@ -1144,7 +1144,6 @@ rel_dce(visitor *v, global_props *gp, sq
 sql_rel *
 rel_deadcode_elimination(mvc *sql, sql_rel *rel)
 {
-       return rel;
        return rel_dce_(sql, rel);
 }
 
diff --git a/sql/server/rel_partition.c b/sql/server/rel_partition.c
--- a/sql/server/rel_partition.c
+++ b/sql/server/rel_partition.c
@@ -31,7 +31,8 @@ rel_getcount(mvc *sql, sql_rel *rel)
 
                if (t && isTable(t)) {
                        sqlstore *store = sql->session->tr->store;
-                       return 
(lng)store->storage_api.count_col(sql->session->tr, 
ol_first_node(t->columns)->data, 0);
+                       node *fn = t->columns->l->t;//ol_first_node(t->columns);
+                       return 
(lng)store->storage_api.count_col(sql->session->tr, fn->data, 0);
                }
                return 0;
        }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to