Changeset: 1dd5b7a992e7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1dd5b7a992e7
Added Files:
        sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.py
        sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.err
        sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.out
Modified Files:
        sql/backends/monet5/sql.c
        sql/test/BugTracker-2019/Tests/All
Branch: Apr2019
Log Message:

Added test and fix for bug 6759, (i.e. when creating a string column from the 
loader, use clob type instead of char)


diffs (truncated from 332 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -458,8 +458,7 @@ create_table_from_emit(Client cntxt, cha
                return msg;
 
        /* for some reason we don't have an allocator here, so make one */
-       sql->sa = sa_create();
-       if (!sql->sa) {
+       if (!(sql->sa = sa_create())) {
                msg = sql_error(sql, 02, SQLSTATE(HY001) "CREATE TABLE: %s", 
MAL_MALLOC_FAIL);
                goto cleanup;
        }
@@ -467,52 +466,52 @@ create_table_from_emit(Client cntxt, cha
        if (!sname)
                sname = "sys";
        if (!(s = mvc_bind_schema(sql, sname))) {
-               msg = sql_error(sql, 02, "3F000!CREATE TABLE: no such schema 
'%s'", sname);
+               msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: no such 
schema '%s'", sname);
                goto cleanup;
        }
        if (!(t = mvc_create_table(sql, s, tname, tt_table, 0, 
SQL_DECLARED_TABLE, CA_COMMIT, -1, 0))) {
-               msg = sql_error(sql, 02, "3F000!CREATE TABLE: could not create 
table '%s'", tname);
+               msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: could 
not create table '%s'", tname);
                goto cleanup;
        }
 
-       for(i = 0; i < ncols; i++) {
+       for (i = 0; i < ncols; i++) {
                BAT *b = columns[i].b;
-               sql_subtype *tpe = sql_bind_localtype(ATOMname(b->ttype));
+               str atoname = ATOMname(b->ttype);
+               sql_subtype tpe;
                sql_column *col = NULL;
 
-               if (!tpe) {
-                       msg = sql_error(sql, 02, "3F000!CREATE TABLE: could not 
find type for column");
-                       goto cleanup;
+               if (!strcmp(atoname, "str"))
+                       sql_find_subtype(&tpe, "clob", 0, 0);
+               else {
+                       sql_subtype *t = sql_bind_localtype(atoname);
+                       if (!t) {
+                               msg = sql_error(sql, 02, SQLSTATE(3F000) 
"CREATE TABLE: could not find type for column");
+                               goto cleanup;
+                       }
+                       tpe = *t;
                }
 
-               col = mvc_create_column(sql, t, columns[i].name, tpe);
-               if (!col) {
-                       msg = sql_error(sql, 02, "3F000!CREATE TABLE: could not 
create column %s", columns[i].name);
+               if (!(col = mvc_create_column(sql, t, columns[i].name, &tpe))) {
+                       msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: 
could not create column %s", columns[i].name);
                        goto cleanup;
                }
        }
-       msg = create_table_or_view(sql, sname, t->base.name, t, 0);
-       if (msg != MAL_SUCCEED) {
+       if ((msg = create_table_or_view(sql, sname, t->base.name, t, 0)) != 
MAL_SUCCEED)
                goto cleanup;
-       }
-       t = mvc_bind_table(sql, s, tname);
-       if (!t) {
-               msg = sql_error(sql, 02, "3F000!CREATE TABLE: could not bind 
table %s", tname);
+       if (!(t = mvc_bind_table(sql, s, tname))) {
+               msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: could 
not bind table %s", tname);
                goto cleanup;
        }
-       for(i = 0; i < ncols; i++) {
+       for (i = 0; i < ncols; i++) {
                BAT *b = columns[i].b;
                sql_column *col = NULL;
 
-               col = mvc_bind_column(sql,t, columns[i].name);
-               if (!col) {
-                       msg = sql_error(sql, 02, "3F000!CREATE TABLE: could not 
bind column %s", columns[i].name);
+               if (!(col = mvc_bind_column(sql,t, columns[i].name))) {
+                       msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: 
could not bind column %s", columns[i].name);
                        goto cleanup;
                }
-               msg = mvc_append_column(sql->session->tr, col, b);
-               if (msg != MAL_SUCCEED) {
+               if ((msg = mvc_append_column(sql->session->tr, col, b)) != 
MAL_SUCCEED)
                        goto cleanup;
-               }
        }
 
 cleanup:
@@ -538,8 +537,7 @@ append_to_table_from_emit(Client cntxt, 
                return msg;
 
        /* for some reason we don't have an allocator here, so make one */
-       sql->sa = sa_create();
-       if (!sql->sa) {
+       if (!(sql->sa = sa_create())) {
                msg = sql_error(sql, 02, SQLSTATE(HY001) "CREATE TABLE: %s", 
MAL_MALLOC_FAIL);
                goto cleanup;
        }
@@ -547,27 +545,23 @@ append_to_table_from_emit(Client cntxt, 
        if (!sname)
                sname = "sys";
        if (!(s = mvc_bind_schema(sql, sname))) {
-               msg = sql_error(sql, 02, "3F000!CREATE TABLE: no such schema 
'%s'", sname);
+               msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: no such 
schema '%s'", sname);
                goto cleanup;
        }
-       t = mvc_bind_table(sql, s, tname);
-       if (!t) {
-               msg = sql_error(sql, 02, "3F000!CREATE TABLE: could not bind 
table %s", tname);
+       if (!(t = mvc_bind_table(sql, s, tname))) {
+               msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: could 
not bind table %s", tname);
                goto cleanup;
        }
-       for(i = 0; i < ncols; i++) {
+       for (i = 0; i < ncols; i++) {
                BAT *b = columns[i].b;
                sql_column *col = NULL;
 
-               col = mvc_bind_column(sql,t, columns[i].name);
-               if (!col) {
-                       msg = sql_error(sql, 02, "3F000!CREATE TABLE: could not 
bind column %s", columns[i].name);
+               if (!(col = mvc_bind_column(sql,t, columns[i].name))) {
+                       msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: 
could not bind column %s", columns[i].name);
                        goto cleanup;
                }
-               msg = mvc_append_column(sql->session->tr, col, b);
-               if (msg != MAL_SUCCEED) {
+               if ((msg = mvc_append_column(sql->session->tr, col, b)) != 
MAL_SUCCEED)
                        goto cleanup;
-               }
        }
 
 cleanup:
diff --git a/sql/test/BugTracker-2019/Tests/All 
b/sql/test/BugTracker-2019/Tests/All
--- a/sql/test/BugTracker-2019/Tests/All
+++ b/sql/test/BugTracker-2019/Tests/All
@@ -33,3 +33,4 @@ alter_table_drop_column.Bug-6749
 HAVE_PYMONETDB?remote-table-non-existent-column.Bug-6750
 cte-union.Bug-6755
 merge-table-limit.Bug-6756
+HAVE_LIBPY3?python-loader-string.Bug-6759
diff --git a/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.py 
b/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.py
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.py
@@ -0,0 +1,38 @@
+import sys
+
+try:
+    from MonetDBtesting import process
+except ImportError:
+    import process
+
+
+s = process.server(args = ['--set', 'embedded_py=3'], stdin = process.PIPE, 
stdout = process.PIPE, stderr = process.PIPE)
+
+c = process.client(lang = 'sql', stdin = process.PIPE, stdout = process.PIPE, 
stderr = process.PIPE)
+out, err = c.communicate('''\
+CREATE LOADER json_loader() LANGUAGE PYTHON {\n\
+    import json\n\
+    _emit.emit(json.loads('{"col1": ["apple", "peer"], "col2": ["orange", 
"banana nananana"]}'))\n\
+};\
+CREATE TABLE tbl FROM LOADER json_loader();\
+SELECT * FROM tbl;
+''')
+sys.stdout.write(out)
+sys.stderr.write(err)
+
+c = process.client(lang = 'sqldump', stdin = process.PIPE, stdout = 
process.PIPE, stderr = process.PIPE)
+out, err = c.communicate()
+sys.stdout.write(out)
+sys.stderr.write(err)
+
+c = process.client(lang = 'sql', stdin = process.PIPE, stdout = process.PIPE, 
stderr = process.PIPE)
+out, err = c.communicate('''\
+DROP TABLE tbl;\
+DROP LOADER json_loader;
+''')
+sys.stdout.write(out)
+sys.stderr.write(err)
+
+out, err = s.communicate()
+sys.stdout.write(out)
+sys.stderr.write(err)
diff --git 
a/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.err 
b/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.err
@@ -0,0 +1,37 @@
+stderr of test 'python-loader-string.Bug-6759` in directory 
'sql/test/BugTracker-2019` itself:
+
+
+# 10:43:16 >  
+# 10:43:16 >  "/usr/bin/python2" "python-loader-string.Bug-6759.py" 
"python-loader-string.Bug-6759"
+# 10:43:16 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 34149
+# cmdline opt  mapi_usock = /var/tmp/mtest-6899/.s.monetdb.34149
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_BugTracker-2019
+# cmdline opt  embedded_py = 2
+#WARNING To speedup sql.get_value a bulk operator implementation is needed
+#    X_282:bat[:lng] := mal.multiplex("sql":str, "get_value":str, 
X_247:bat[:str], X_257:bat[:str]);
+#WARNING To speedup sql.get_value a bulk operator implementation is needed
+#    X_283:bat[:lng] := mal.multiplex("sql":str, "get_value":str, 
X_248:bat[:str], X_258:bat[:str]);
+#WARNING To speedup sql.get_value a bulk operator implementation is needed
+#    X_284:bat[:lng] := mal.multiplex("sql":str, "get_value":str, 
X_249:bat[:str], X_259:bat[:str]);
+#WARNING To speedup sql.get_value a bulk operator implementation is needed
+#    X_285:bat[:lng] := mal.multiplex("sql":str, "get_value":str, 
X_250:bat[:str], X_260:bat[:str]);
+#WARNING To speedup sql.get_value a bulk operator implementation is needed
+#    X_286:bat[:lng] := mal.multiplex("sql":str, "get_value":str, 
X_251:bat[:str], X_261:bat[:str]);
+
+# 10:43:17 >  
+# 10:43:17 >  "Done."
+# 10:43:17 >  
+
diff --git 
a/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.out 
b/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.out
@@ -0,0 +1,100 @@
+stdout of test 'python-loader-string.Bug-6759` in directory 
'sql/test/BugTracker-2019` itself:
+
+
+# 10:43:16 >  
+# 10:43:16 >  "/usr/bin/python2" "python-loader-string.Bug-6759.py" 
"python-loader-string.Bug-6759"
+# 10:43:16 >  
+
+#CREATE LOADER json_loader() LANGUAGE PYTHON {
+#      import json
+#      _emit.emit(json.loads('{"col1": ["apple", "peer"], "col2": ["orange", 
"banana nananana"]}'))
+#};CREATE TABLE tbl FROM LOADER json_loader();SELECT * FROM tbl;
+#CREATE LOADER json_loader() LANGUAGE PYTHON {
+#      import json
+#      _emit.emit(json.loads('{"col1": ["apple", "peer"], "col2": ["orange", 
"banana nananana"]}'))
+#};CREATE TABLE tbl FROM LOADER json_loader();SELECT * FROM tbl;
+#CREATE LOADER json_loader() LANGUAGE PYTHON {
+#      import json
+#      _emit.emit(json.loads('{"col1": ["apple", "peer"], "col2": ["orange", 
"banana nananana"]}'))
+#};CREATE TABLE tbl FROM LOADER json_loader();SELECT * FROM tbl;
+% sys.tbl,     sys.tbl # table_name
+% col1,        col2 # name
+% clob,        clob # type
+% 5,   15 # length
+[ "apple",     "orange"        ]
+[ "peer",      "banana nananana"       ]
+START TRANSACTION;
+SET SCHEMA "sys";
+CREATE LOADER "sys"."json_loader"() LANGUAGE PYTHON
+{
+       import json
+       _emit.emit(json.loads('{"col1": ["apple", "peer"], "col2": ["orange", 
"banana nananana"]}'))
+};
+CREATE TABLE "sys"."tbl" (
+       "col1" CHARACTER LARGE OBJECT,
+       "col2" CHARACTER LARGE OBJECT
+);
+COPY 2 RECORDS INTO "sys"."tbl" FROM stdin USING DELIMITERS E'\t',E'\n','"';
+"apple"        "orange"
+"peer" "banana nananana"
+COMMIT;
+#DROP TABLE tbl;DROP LOADER json_loader;
+#DROP TABLE tbl;DROP LOADER json_loader;
+# MonetDB 5 server v11.33.12 (hg id: d4694fed4f7e)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_BugTracker-2019', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.527 GiB available main-memory.
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2019 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on 
mapi:monetdb://localhost.localdomain:34149/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-6899/.s.monetdb.34149
+# MonetDB/GIS module loaded
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 11_times.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to