Changeset: 108fb2948d1d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/108fb2948d1d
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_basetable.c
        sql/test/nested/Tests/All
Branch: nested
Log Message:

corrected problem with initializing the nested expressions for composites of 
composites


diffs (219 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
@@ -2644,11 +2644,11 @@ rel2bin_subtable(backend *be, sql_table 
                                        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);
+                                       //stmt *ns = stmt_none(be);
+                                       //ns->type = st_alias;
+                                       s->subtype = *exp_subtype(exp);
+                                       //ns->virt = true;
+                                       //list_append(s->op4.lval, ns);
                                }
                        } else {
                                s = stmt_col(be, c, dels, dels->partition);
@@ -2736,11 +2736,11 @@ rel2bin_basetable(backend *be, sql_rel *
                                        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);
+                                       //stmt *ns = stmt_none(be);
+                                       //ns->type = st_alias;
+                                       s->subtype = *exp_subtype(exp);
+                                       //ns->virt = true;
+                                       //list_append(s->op4.lval, ns);
                                }
                        } else {
                                s = (c == fcol) ? col : stmt_col(be, c, 
complex?dels:NULL, 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
@@ -157,6 +157,62 @@ rel_base_use_all( mvc *sql, sql_rel *rel
        }
 }
 
+static rel_base_t* rel_nested_basetable_add_cols(mvc *sql, rel_base_t *pba, 
char *colname, sql_table *t, list *exps);
+
+static node *
+rel_nested_basetable_add_ccols(mvc *sql, rel_base_t *ba, sql_column *c, node 
*cn, list *exps)
+{
+       sql_alias *atname = a_create(sql->sa, c->base.name);
+       atname->parent = ba->name;
+       int i = sql->nid;
+       prop *p = NULL;
+       sql_exp *e = NULL;
+
+       sql->nid += list_length(c->type.type->d.fields);
+       for (node *n = c->type.type->d.fields->h; n && cn; n = n->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->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;
+                       cn = cn->next;
+               } else if (c->type.type->composite) {
+                       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;
+                       cn = rel_nested_basetable_add_ccols(sql, ba, c, 
cn->next, e->f);
+               } else {
+                       e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 1);
+                       cn = cn->next;
+               }
+               if (e == NULL)
+                       return NULL;
+               e->nid = -(i);
+               e->alias.label = e->nid;
+               if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c 
== c) {
+                       p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p);
+                       p->value.pval = c->t->pkey;
+               } else if (c->unique == 2) {
+                       p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p);
+                       p->value.pval = NULL;
+               }
+               set_intern(e);
+               set_basecol(e);
+               sql_column_get_statistics(sql, c, e);
+               append(exps, e);
+       }
+       return cn;
+}
+
 static rel_base_t*
 rel_nested_basetable_add_cols(mvc *sql, rel_base_t *pba, char *colname, 
sql_table *t, list *exps)
 {
@@ -175,9 +231,8 @@ rel_nested_basetable_add_cols(mvc *sql, 
        atname->parent = ba->name;
        int i = 0;
        prop *p = NULL;
-       sql_exp *e = NULL, *ce = NULL;
-       int composite = 0;
-       for (node *cn = ol_first_node(t->columns); cn; cn = cn->next, i++) {
+       sql_exp *e = NULL;
+       for (node *cn = ol_first_node(t->columns); cn; i++) {
                sql_column *c = cn->data;
                if (!column_privs(sql, c, PRIV_SELECT))
                        continue;
@@ -190,18 +245,17 @@ rel_nested_basetable_add_cols(mvc *sql, 
                        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;
+                       cn = cn->next;
                } 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);
+                       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;
-                       sql_alias *ta = a_create(sa, c->base.name);
-                       ta->parent = atname;
-                       atname = ta;
+                       cn = rel_nested_basetable_add_ccols(sql, ba, c, 
cn->next, e->f);
                } else {
                        e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 1);
+                       cn = cn->next;
                }
                if (e == NULL)
                        return NULL;
@@ -217,16 +271,7 @@ rel_nested_basetable_add_cols(mvc *sql, 
                set_intern(e);
                set_basecol(e);
                sql_column_get_statistics(sql, c, e);
-               if (ce && ce != e) {
-                       append(ce->f, e);
-                       composite--;
-                       if (!composite) {
-                               ce = NULL;
-                               atname = atname->parent;
-                       }
-               } else {
-                       append(exps, e);
-               }
+               append(exps, e);
        }
        return ba;
 }
@@ -260,9 +305,8 @@ rel_nested_basetable(mvc *sql, sql_table
        int i = 0;
        prop *p = NULL;
        rel->exps = new_exp_list(sa);
-       sql_exp *e = NULL, *ce = NULL;
-       int composite = 0;
-       for (node *cn = ol_first_node(t->columns); cn; cn = cn->next, i++) {
+       sql_exp *e = NULL;
+       for (node *cn = ol_first_node(t->columns); cn; i++) {
                sql_column *c = cn->data;
                if (!column_privs(sql, c, PRIV_SELECT))
                        continue;
@@ -275,18 +319,17 @@ rel_nested_basetable(mvc *sql, sql_table
                        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;
+                       cn = cn->next;
                } 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);
+                       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;
-                       sql_alias *ta = a_create(sa, c->base.name);
-                       ta->parent = atname;
-                       atname = ta;
+                       cn = rel_nested_basetable_add_ccols(sql, ba, c, 
cn->next, e->f);
                } else {
                        e = exp_alias(sql, atname, c->base.name, atname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
+                       cn = cn->next;
                }
                if (e == NULL) {
                        rel_destroy(rel);
@@ -303,16 +346,7 @@ rel_nested_basetable(mvc *sql, sql_table
                }
                set_basecol(e);
                sql_column_get_statistics(sql, c, e);
-               if (ce && ce != e) {
-                       append(ce->f, e);
-                       composite--;
-                       if (!composite) {
-                               ce = NULL;
-                               atname = atname->parent;
-                       }
-               } else {
-                       append(rel->exps, e);
-               }
+               append(rel->exps, e);
        }
        e = exp_alias(sql, atname, TID, atname, TID, sql_bind_localtype("oid"), 
CARD_MULTI, 0, 1, 1);
        if (e == NULL) {
diff --git a/sql/test/nested/Tests/All b/sql/test/nested/Tests/All
--- a/sql/test/nested/Tests/All
+++ b/sql/test/nested/Tests/All
@@ -4,5 +4,5 @@ fileloader
 webclicks
 array
 composite
+jdocs
 inserts
-jdocs
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to