Changeset: f03023fad02e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f03023fad02e
Added Files:
        sql/test/nested/Tests/jtable-direct-list.test.in
Modified Files:
        sql/server/rel_updates.c
        sql/test/nested/Tests/All
Branch: nested
Log Message:

add support for insert of json into tables (with columns) where the 
automatically create the implicite composite type


diffs (106 lines):

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
@@ -576,6 +576,31 @@ update_allowed(mvc *sql, sql_table *t, c
        return t;
 }
 
+static sql_subtype *
+sql_table_type(mvc *sql, sql_table *t)
+{
+       /* convert t into a type */
+       sql_subtype *tt = NULL;
+       if (t) {
+               node *n;
+               tt = SA_ZNEW(sql->sa, sql_subtype);
+               sql_type *it = SA_ZNEW(sql->sa, sql_type);
+               tt->type = it;
+               it->d.fields = list_create((fdestroy) &arg_destroy);
+               it->base.name = sa_strdup(sql->sa, t->base.name);
+               it->composite = true;
+               if (ol_first_node(t->columns)) for (n = 
ol_first_node(t->columns); n; n = n->next) {
+                       sql_column *c = n->data;
+
+                       sql_arg *a = SA_ZNEW(sql->sa, sql_arg);
+                       a->name = sa_strdup(sql->sa, c->base.name);
+                       a->type = c->type;
+                       append(it->d.fields, a);
+               }
+       }
+       return tt;
+}
+
 static sql_rel *
 insert_generate_inserts(sql_query *query, sql_table *t, dlist *columns, symbol 
*val_or_q, const char* action)
 {
@@ -661,8 +686,25 @@ insert_generate_inserts(sql_query *query
        /* For the subquery case a projection is always needed */
        if (is_subquery)
                r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 
0));
-       if ((r->exps && list_length(r->exps) != list_length(collist)) || 
(!r->exps && collist))
-               return sql_error(sql, 02, SQLSTATE(21S01) "%s: query result 
doesn't match number of columns in table '%s'", action, t->base.name);
+       if ((r->exps && list_length(r->exps) != list_length(collist)) || 
(!r->exps && collist)) {
+               if (list_length(r->exps) == 1 && 
strcmp(exp_subtype(r->exps->h->data)->type->base.name, "json") == 0) {
+                       sql_subtype *tt = sql_table_type(sql, t);
+                       sql_exp *e = exp_check_type(sql, tt, r, 
r->exps->h->data, type_equal);
+                       if (e && e->f) {
+                               r = rel_project(sql->sa, r, 
append(sa_list(sql->sa), e));
+                               assert(list_length(e->f) == 
list_length(collist));
+                               list *exps = sa_list(sql->sa), *iexps = e->f;
+                               for (node *n = iexps->h; n; n = n->next) {
+                                       sql_exp *e = n->data;
+                                       e = exp_ref(sql, e);
+                                       append(exps, e);
+                               }
+                               r = rel_project(sql->sa, r, exps);
+                       }
+               } else {
+                       return sql_error(sql, 02, SQLSTATE(21S01) "%s: query 
result doesn't match number of columns in table '%s'", action, t->base.name);
+               }
+       }
        if (is_subquery && !(r->exps = check_distinct_exp_names(sql, r->exps)))
                return sql_error(sql, 02, SQLSTATE(42000) "%s: duplicate column 
names in subquery column list", action);
 
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
@@ -6,6 +6,7 @@ array
 composite
 jdocs-wrapped-list
 jdocs-direct-list
+jtable-direct-list
 combinations
 array_of_comp_with_array
 comp_with_array_of_comp
diff --git a/sql/test/nested/Tests/jtable-direct-list.test.in 
b/sql/test/nested/Tests/jtable-direct-list.test.in
new file mode 100644
--- /dev/null
+++ b/sql/test/nested/Tests/jtable-direct-list.test.in
@@ -0,0 +1,27 @@
+## in this test the list member of the json document is directly in the 
+## composite type e.g. "actions":[...]
+
+statement ok
+create type elem_t as (key text, val int)
+
+statement ok
+create type list_obj_t as (elem elem_t)
+
+statement ok
+create table jdocs (name text, id int, actions list_obj_t[])
+
+statement ok
+insert into jdocs select json from 
'$TSTSRCDIR/jdocs-direct-list-list-format.json'
+
+query TIT nosort
+select * from jdocs
+----
+test_three
+403
+{(("xy", 30)),(("yz", 31))}
+test_four
+404
+{(("ab", 40)),(("bc", 41))}
+
+#statement ok
+#insert into jdocs select json from 
read_ndjson('$TSTSRCDIR/jdocs-direct-list-newline-format.json')
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to