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