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, <, column_intern) < 0)
+ if (sql_trans_create_column_intern( &ic, tr, tt,
MSEL_NAME, <, 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]