Changeset: dadad2546c2f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dadad2546c2f
Modified Files:
        sql/server/rel_basetable.c
        sql/server/rel_updates.c
        sql/storage/store.c
        sql/test/Dependencies/Tests/dependency_owner_schema_3.test
        sql/test/nested/Tests/array.test
Branch: nested
Log Message:

properly flag all columns of an composite and/of multisets properly as 
column_intern, except for the elements column which for that internal column is 
a column_plain
use the column_intern to mark (or skip) columns when we don't want the internal 
once (ie when projecting)


diffs (160 lines):

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
@@ -604,8 +604,13 @@ rel_base_projection( mvc *sql, sql_rel *
 
        for (node *cn = ol_first_node(t->columns); cn; cn = cn->next, i++) {
                if (rel_base_is_used(ba, i)) {
-                       sql_exp *e = bind_col_exp(sql, ba, name, cn->data);
-                       append(exps, e);
+                       sql_column *c = cn->data;
+                       if (intern || c->column_type == column_plain) {
+                               sql_exp *e = bind_col_exp(sql, ba, name, c);
+                               if (intern && c->column_type != column_plain)
+                                       set_intern(e);
+                               append(exps, e);
+                       }
                }
        }
        if ((intern && rel_base_is_used(ba, i)) || list_empty(exps)) { /* Add 
TID column if no column is used */
@@ -666,8 +671,11 @@ rel_base_project_all( mvc *sql, sql_rel 
        if (!exps || !a_cmp_obj_name(name, tname))
                return NULL;
 
-       for (node *cn = ol_first_node(t->columns); cn; cn = cn->next)
-               append(exps, bind_col( sql, rel, name, cn->data));
+       for (node *cn = ol_first_node(t->columns); cn; cn = cn->next) {
+                       sql_column *c = cn->data;
+                       if (c->column_type == column_plain)
+                               append(exps, bind_col( sql, rel, name, c));
+       }
        return exps;
 }
 
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -367,6 +367,21 @@ check_table_columns(mvc *sql, sql_table 
        return collist;
 }
 
+static node *
+insert_complex(sql_subtype *t, node *m)
+{
+       if (t->type->composite && !t->multiset) {
+               for(node *f = t->type->d.fields->h; f; f = f->next) {
+                       sql_arg *ft = f->data;
+                       if (ft->type.type->composite && !ft->type.multiset)
+                               m = insert_complex(&ft->type, m->next);
+                       else
+                               m = m->next;
+               }
+       }
+       return m;
+}
+
 static list *
 rel_inserts(mvc *sql, sql_table *t, sql_rel *r, list *collist, size_t 
rowcount, int copy, const char* action)
 {
@@ -406,11 +421,14 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                        }
                }
        }
-       for (m = ol_first_node(t->columns); m; m = m->next) {
+       for (m = ol_first_node(t->columns); m; ) {
                sql_column *c = m->data;
                sql_exp *exps = NULL;
 
-               if (c->column_type == column_plain && !inserts[c->colnr]) {
+               if (c->type.type->composite && !c->type.multiset) {
+                       m = insert_complex(&c->type, m->next);
+                       continue;
+               } else if (c->column_type == column_plain && 
!inserts[c->colnr]) {
                        for (size_t j = 0; j < rowcount; j++) {
                                sql_exp *e = NULL;
 
@@ -440,6 +458,7 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                        inserts[c->colnr] = exps;
                        assert(inserts[c->colnr]);
                }
+               m = m->next;
        }
        /* rewrite into unions */
        if (has_rel && rowcount && all_values) {
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4075,7 +4075,7 @@ sql_trans_create_column_intern(sql_colum
                        for (node *n = col->type.type->d.fields->h; n; n = 
n->next) {
                                sql_arg *f = n->data;
                                sql_column *ic = NULL;
-                               if (sql_trans_create_column_intern( &ic, tr, 
tt, f->name, &f->type, column_intern) < 0)
+                               if (sql_trans_create_column_intern( &ic, tr, 
tt, f->name, &f->type, column_plain) < 0)
                                        return -2;
                        }
                } else {
@@ -4202,14 +4202,14 @@ sql_trans_copy_column( sql_trans *tr, sq
                        for (node *n = col->type.type->d.fields->h; n; n = 
n->next) {
                                sql_arg *f = n->data;
                                sql_column *ic = NULL;
-                               if (sql_trans_create_column_intern( &ic, tr, 
tt, f->name, &f->type, column_intern) < 0)
+                               if (sql_trans_create_column_intern( &ic, tr, 
tt, f->name, &f->type, column_plain) < 0)
                                        return -2;
                        }
                } else {
                        sql_column *ic = NULL;
                        sql_subtype lt = c->type;
                        lt.multiset = MS_VALUE;
-                       if (sql_trans_create_column_intern( &ic, tr, tt, 
MSEL_NAME, &lt, column_intern) < 0)
+                       if (sql_trans_create_column_intern( &ic, tr, tt, 
MSEL_NAME, &lt, column_plain) < 0)
                                return -2;
                }
                if (c->type.multiset > MS_VALUE) { /* sets, arrays, vectors 
need oid col */
diff --git a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test 
b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test
--- a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test
+++ b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test
@@ -883,7 +883,7 @@ DEP_FUNC
 query TTT nosort
 SELECT distinct c.name, v.name, 'DEP_VIEW' from sys.columns as c, sys.tables 
as v, sys.dependencies as dep where c.id = dep.id AND v.id = dep.depend_id AND 
dep.depend_type = 5 AND v.type in (1, 11, 21, 31) order by c.name, v.name
 ----
-1773 values hashing to f976ca5f8d89a24a8e824db233ce9c07
+1779 values hashing to e9a294a8326b52a7a6d4f3f6d6f5e0eb
 
 query TTT nosort
 SELECT c.name, k.name, 'DEP_KEY' from sys.columns as c,  sys.objects as kc, 
sys.keys as k where kc."name" = c.name AND kc.id = k.id AND k.table_id = 
c.table_id AND k.rkey = -1 order by c.name, k.name
diff --git a/sql/test/nested/Tests/array.test b/sql/test/nested/Tests/array.test
--- a/sql/test/nested/Tests/array.test
+++ b/sql/test/nested/Tests/array.test
@@ -110,7 +110,7 @@ select u.*, fa.* from flt_arr fa, unnest
 11
 {10,11}
 
-query TIII nosort unnest_all
+query TI nosort unnest_all
 select fa.*, u.* from flt_arr fa, unnest(fa.n) u
 ----
 {10,11}
@@ -175,16 +175,19 @@ select * from flt_arr
 {60}
 {70,71}
 
-## ambiguous col elements (table vs unnest())
-
 statement ok
 create table amb (elements int[])
 
 statement ok
 insert into amb values (array[10, 11]), (array[20, 21])
 
-statement error SELECT: identifier 'elements' ambiguous
-select elements from amb, unnest(elements)
+query T nosort 
+select elements from amb, unnest(elements) elements
+----
+{10,11}
+{10,11}
+{20,21}
+{20,21}
 
 query T nosort 
 select elements from amb, unnest(elements) u
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to