Changeset: 46cd9a4bdae3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/46cd9a4bdae3
Added Files:
        sql/test/bincopy/Tests/bincopy_default_values.SQL.py
Modified Files:
        sql/server/rel_updates.c
        sql/test/bincopy/Tests/All
        sql/test/bincopy/Tests/bincopy_support.py
Branch: copyintobinary
Log Message:

COPY BINARY INTO should also apply default values


diffs (109 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
@@ -1746,7 +1746,6 @@ bincopyfrom(sql_query *query, dlist *qna
        sql_exp *import;
        sql_subfunc *f = sql_find_func(sql, "sys", "copyfrom", 3, F_UNION, 
true, NULL);
        list *collist;
-       int i;
 
        assert(f);
        if (!copy_allowed(sql, 1))
@@ -1773,35 +1772,25 @@ bincopyfrom(sql_query *query, dlist *qna
                exp_atom_int(sql->sa, onclient)),
                exp_atom_bool(sql->sa, do_byteswap));
 
-       // create the list of files that is passed to the function as parameter
-       for (i = 0; i < ol_length(t->columns); i++) {
-               // we have one file per column, however, because we have column 
selection that file might be NULL
-               // first, check if this column number is present in the passed 
in the parameters
-               int found = 0;
-               dn = files->h;
-               for (n = collist->h; n && dn; n = n->next, dn = dn->next) {
-                       sql_column *c = n->data;
-                       if (i == c->colnr) {
-                               // this column number was present in the input 
arguments; pass in the file name
-                               append(args, exp_atom_str(sql->sa, 
dn->data.sval, &strtpe));
-                               found = 1;
-                               break;
-                       }
-               }
-               if (!found) {
-                       // this column was not present in the input arguments; 
pass in NULL
-                       append(args, exp_atom_str(sql->sa, NULL, &strtpe));
-               }
+       for (dn = files->h; dn; dn = dn->next) {
+               char *filename = dn->data.sval;
+               append(args, exp_atom_str(sql->sa, filename, &strtpe));
        }
 
        import = exp_op(sql->sa,  args, f);
 
        exps = new_exp_list(sql->sa);
-       for (n = ol_first_node(t->columns); n; n = n->next) {
+       for (n = collist->h; n; n = n->next) {
                sql_column *c = n->data;
                append(exps, exp_column(sql->sa, t->base.name, c->base.name, 
&c->type, CARD_MULTI, c->null, is_column_unique(c), 0));
        }
        res = rel_table_func(sql->sa, NULL, import, exps, TABLE_PROD_FUNC);
+
+       exps = rel_inserts(sql, t, res, collist, 1, 1, "COPY BINARY INTO");
+       if(!exps)
+               return NULL;
+       res = rel_project(sql->sa, res, exps);
+
        res = rel_insert_table(query, t, t->base.name, res);
        return res;
 }
diff --git a/sql/test/bincopy/Tests/All b/sql/test/bincopy/Tests/All
--- a/sql/test/bincopy/Tests/All
+++ b/sql/test/bincopy/Tests/All
@@ -42,6 +42,7 @@ bincopy_uuids_on_client
 bincopy_uuids_on_server
 
 bincopy_invalid_json
+bincopy_default_values
 
 bincopy_little_endians_on_client
 bincopy_little_endians_on_server
diff --git a/sql/test/bincopy/Tests/bincopy_default_values.SQL.py 
b/sql/test/bincopy/Tests/bincopy_default_values.SQL.py
new file mode 100644
--- /dev/null
+++ b/sql/test/bincopy/Tests/bincopy_default_values.SQL.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python3
+
+import sys
+import os
+sys.path.append(os.getenv('TSTSRCDIR'))
+from bincopy_support import run_test
+from bincopy_support import DEFAULT_VALUES as testcode
+
+run_test('client', testcode)
diff --git a/sql/test/bincopy/Tests/bincopy_support.py 
b/sql/test/bincopy/Tests/bincopy_support.py
--- a/sql/test/bincopy/Tests/bincopy_support.py
+++ b/sql/test/bincopy/Tests/bincopy_support.py
@@ -647,3 +647,23 @@ ORDER BY t_s, s_i, i_b, f_d
 LIMIT 4;
 ;
 """, [f"true,true,true,true,{NRECS}"])
+
+
+DEFAULT_VALUES = ("""
+CREATE SEQUENCE seq START WITH 10;
+CREATE TABLE foo(
+    s SERIAL,
+    d INT DEFAULT 42,
+    n INT DEFAULT NEXT VALUE FOR seq,
+    i INT
+);
+
+COPY BINARY INTO foo(i)
+FROM @ints@ @ON@;
+
+SELECT
+    COUNT(DISTINCT s) AS distinct_s,
+    SUM(d) AS sum_d,
+    SUM(n) AS sum_n
+FROM foo;
+""", [f"{NRECS},{42*NRECS},{8 * NRECS + NRECS * (NRECS + 1) // 2 }"])
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to