Changeset: 7a05d785c825 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7a05d785c825 Added Files: sql/backends/monet5/Tests/pyapi34.sql sql/backends/monet5/Tests/pyapi34.stable.err sql/backends/monet5/Tests/pyapi34.stable.out sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.stable.out.int128 sql/test/BugTracker-2017/Tests/crash-select_after_MAL_error.Bug-6332.stable.out.int128 sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.stable.err sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.stable.out Modified Files: sql/backends/monet5/Tests/All sql/backends/monet5/UDF/pyapi/connection.c sql/backends/monet5/UDF/pyapi/conversion.c sql/backends/monet5/sql_execute.c sql/backends/monet5/sql_gencode.c sql/server/rel_dump.c sql/server/rel_schema.c sql/server/sql_parser.y sql/storage/store.c sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128 sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out sql/test/BugTracker-2015/Tests/large_join.Bug-3809.stable.out sql/test/BugTracker-2015/Tests/quantile_function_resolution.Bug-3773.stable.out sql/test/BugTracker-2015/Tests/schema_view.Bug-3708.stable.out sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.stable.out sql/test/BugTracker-2017/Tests/All sql/test/BugTracker-2017/Tests/crash-dce.Bug-6330.stable.out sql/test/BugTracker-2017/Tests/crash-select_after_MAL_error.Bug-6332.stable.out sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out sql/test/Tests/order_by_complex_exp.stable.out sql/test/leaks/Tests/check1.stable.out.int128 sql/test/mergetables/Tests/part-elim.stable.out sql/test/pg_regress/Tests/alter_table.stable.err sql/test/pg_regress/Tests/alter_table.stable.out sql/test/pg_regress/Tests/insert.stable.err tools/merovingian/client/monetdb.c tools/merovingian/daemon/merovingian.c tools/merovingian/utils/properties.c Branch: default Log Message:
Merge with Jul2017 branch. diffs (truncated from 2988 to 300 lines): diff --git a/sql/backends/monet5/Tests/All b/sql/backends/monet5/Tests/All --- a/sql/backends/monet5/Tests/All +++ b/sql/backends/monet5/Tests/All @@ -53,6 +53,7 @@ HAVE_LIBPY?pyapi29 HAVE_LIBPY?pyapi30 HAVE_LIBPY?pyapi32 HAVE_LIBPY?pyapi33 +HAVE_LIBPY?pyapi34 HAVE_LIBPY?pyloader01 HAVE_LIBPY?pyloader02 diff --git a/sql/backends/monet5/Tests/pyapi34.sql b/sql/backends/monet5/Tests/pyapi34.sql new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/pyapi34.sql @@ -0,0 +1,18 @@ + +START TRANSACTION; + +CREATE TABLE booleans(a BOOLEAN); +INSERT INTO booleans VALUES (1), (0), (1); + +CREATE FUNCTION pyapi34a(inp BOOLEAN) RETURNS BOOLEAN LANGUAGE PYTHON { + results = _conn.execute(u'SELECT * FROM booleans;') + return {'result': numpy.logical_xor(inp, results['a']) }; +}; + +CREATE FUNCTION pyapi34b(inp BOOLEAN) RETURNS BOOLEAN LANGUAGE PYTHON { + return {'result': inp}; +}; + +SELECT a, pyapi34a(a), pyapi34b(a) FROM booleans; + +ROLLBACK; diff --git a/sql/backends/monet5/Tests/pyapi34.stable.err b/sql/backends/monet5/Tests/pyapi34.stable.err new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/pyapi34.stable.err @@ -0,0 +1,35 @@ +stderr of test 'pyapi34` in directory 'sql/backends/monet5` itself: + + +# 11:20:10 > +# 11:20:10 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37278" "--set" "mapi_usock=/var/tmp/mtest-61818/.s.monetdb.37278" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/myth/opt/var/MonetDB/mTests_sql_backends_monet5" "--set" "embedded_py=true" +# 11:20:10 > + +# builtin opt gdk_dbpath = /Users/myth/opt/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# 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 = 37278 +# cmdline opt mapi_usock = /var/tmp/mtest-61818/.s.monetdb.37278 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /Users/myth/opt/var/MonetDB/mTests_sql_backends_monet5 +# cmdline opt embedded_py = true +# cmdline opt gdk_debug = 536870922 + +# 11:20:10 > +# 11:20:10 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-61818" "--port=37278" +# 11:20:10 > + + +# 11:20:10 > +# 11:20:10 > "Done." +# 11:20:10 > + diff --git a/sql/backends/monet5/Tests/pyapi34.stable.out b/sql/backends/monet5/Tests/pyapi34.stable.out new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/pyapi34.stable.out @@ -0,0 +1,86 @@ +stdout of test 'pyapi34` in directory 'sql/backends/monet5` itself: + + +# 11:20:10 > +# 11:20:10 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37278" "--set" "mapi_usock=/var/tmp/mtest-61818/.s.monetdb.37278" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/myth/opt/var/MonetDB/mTests_sql_backends_monet5" "--set" "embedded_py=true" +# 11:20:10 > + +# MonetDB 5 server v11.27.0 +# This is an unreleased version +# Serving database 'mTests_sql_backends_monet5', using 4 threads +# Compiled for x86_64-apple-darwin15.6.0/64bit with 128bit integers +# Found 8.000 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved +# Visit https://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://dhcp-21.eduroam.cwi.nl:37278/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-61818/.s.monetdb.37278 +# MonetDB/SQL module loaded +# MonetDB/Python2 module loaded + +Ready. +# 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_functions.sql +# loading sql script: 22_clients.sql +# loading sql script: 23_skyserver.sql +# loading sql script: 25_debug.sql +# loading sql script: 26_sysmon.sql +# loading sql script: 27_rejects.sql +# loading sql script: 39_analytics.sql +# loading sql script: 39_analytics_hge.sql +# loading sql script: 40_json.sql +# loading sql script: 40_json_hge.sql +# loading sql script: 41_md5sum.sql +# loading sql script: 45_uuid.sql +# loading sql script: 46_profiler.sql +# loading sql script: 51_sys_schema_extension.sql +# loading sql script: 72_fits.sql +# loading sql script: 74_netcdf.sql +# loading sql script: 75_storagemodel.sql +# loading sql script: 80_statistics.sql +# loading sql script: 80_udf.sql +# loading sql script: 80_udf_hge.sql +# loading sql script: 90_generator.sql +# loading sql script: 90_generator_hge.sql +# loading sql script: 99_system.sql + +# 11:20:10 > +# 11:20:10 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-61818" "--port=37278" +# 11:20:10 > + +#START TRANSACTION; +#CREATE TABLE booleans(a BOOLEAN); +#INSERT INTO booleans VALUES (1), (0), (1); +[ 3 ] +#CREATE FUNCTION pyapi34a(inp BOOLEAN) RETURNS BOOLEAN LANGUAGE PYTHON { +# results = _conn.execute('SELECT * FROM booleans;') +# return {'result': numpy.logical_xor(inp, results['a']) }; +#}; +#CREATE FUNCTION pyapi34b(inp BOOLEAN) RETURNS BOOLEAN LANGUAGE PYTHON { +# return {'result': inp}; +#}; +#SELECT a, pyapi34a(a), pyapi34b(a) FROM booleans; +% sys.booleans, sys.L3, sys.L5 # table_name +% a, L3, L5 # name +% boolean, boolean, boolean # type +% 5, 5, 5 # length +[ true, false, true ] +[ false, false, false ] +[ true, false, true ] +#ROLLBACK; + +# 11:20:10 > +# 11:20:10 > "Done." +# 11:20:10 > + diff --git a/sql/backends/monet5/UDF/pyapi/connection.c b/sql/backends/monet5/UDF/pyapi/connection.c --- a/sql/backends/monet5/UDF/pyapi/connection.c +++ b/sql/backends/monet5/UDF/pyapi/connection.c @@ -19,26 +19,44 @@ CREATE_SQL_FUNCTION_PTR(str, create_tabl static PyObject *_connection_execute(Py_ConnectionObject *self, PyObject *args) { - if (!PyString_CheckExact(args)) { + char *query = NULL; +#ifndef IS_PY3K + if (PyUnicode_CheckExact(args)) { + PyObject* str = PyUnicode_AsUTF8String(args); + if (!str) { + PyErr_Format(PyExc_Exception, "Unicode failure."); + return NULL; + } + query = GDKstrdup(((PyStringObject *)str)->ob_sval); + Py_DECREF(str); + } else +#endif + if (PyString_CheckExact(args)) { +#ifndef IS_PY3K + query = GDKstrdup(((PyStringObject *)args)->ob_sval); +#else + query = GDKstrdup(PyUnicode_AsUTF8(args)); +#endif + } else { PyErr_Format(PyExc_TypeError, "expected a query string, but got an object of type %s", Py_TYPE(args)->tp_name); return NULL; } + if (!query) { + PyErr_Format(PyExc_Exception, "%s", MAL_MALLOC_FAIL); + return NULL; + } if (!self->mapped) { // This is not a mapped process, so we can just directly execute the // query here PyObject *result; res_table *output = NULL; char *res = NULL; - char *query; -#ifndef IS_PY3K - query = ((PyStringObject *)args)->ob_sval; -#else - query = PyUnicode_AsUTF8(args); -#endif - +Py_BEGIN_ALLOW_THREADS; res = _connection_query(self->cntxt, query, &output); +Py_END_ALLOW_THREADS; + GDKfree(query); if (res != MAL_SUCCEED) { PyErr_Format(PyExc_Exception, "SQL Query Failed: %s", (res ? res : "<no error>")); diff --git a/sql/backends/monet5/UDF/pyapi/conversion.c b/sql/backends/monet5/UDF/pyapi/conversion.c --- a/sql/backends/monet5/UDF/pyapi/conversion.c +++ b/sql/backends/monet5/UDF/pyapi/conversion.c @@ -203,6 +203,9 @@ PyObject *PyArrayObject_FromBAT(PyInput } } else { switch (inp->bat_type) { + case TYPE_bit: + BAT_TO_NP(b, bit, NPY_INT8); + break; case TYPE_bte: BAT_TO_NP(b, bte, NPY_INT8); break; diff --git a/sql/backends/monet5/sql_execute.c b/sql/backends/monet5/sql_execute.c --- a/sql/backends/monet5/sql_execute.c +++ b/sql/backends/monet5/sql_execute.c @@ -869,13 +869,9 @@ RAstatement2(Client cntxt, MalBlkPtr mb, } refs = sa_list(m->sa); rel = rel_read(m, *expr, &pos, refs); - if (!rel) + if (!rel || monet5_create_relational_function(m, *mod, *nme, rel, NULL, ops, 0) < 0) throw(SQL, "sql.register", "Cannot register %s", buf); - if (rel) { - monet5_create_relational_function(m, *mod, *nme, rel, NULL, ops, 0); - rel_destroy(rel); - } + rel_destroy(rel); sqlcleanup(m, 0); return msg; } - diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -364,6 +364,8 @@ static int sql_subtype *t = tail_type(op); const char *nme = (op->op3)?op->op3->op4.aval->data.val.sval:op->cname; + if ((nr + 100) > len) + buf = GDKrealloc(buf, len*=2); nr += snprintf(buf+nr, len-nr, "%s %s(%u,%u)%c", nme, t->type->sqlname, t->digits, t->scale, n->next?',':' '); } s = buf; diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -157,8 +157,8 @@ exp_print(mvc *sql, stream *fout, sql_ex } break; case e_column: if (e->l) - mnstr_printf(fout, "%s.", (char*)e->l); - mnstr_printf(fout, "%s", (char*)e->r); + mnstr_printf(fout, "\"%s\".", (char*)e->l); + mnstr_printf(fout, "\"%s\"", (char*)e->r); if (e->rname && e->name && e->l && e->r && strcmp(e->rname, e->l) == 0 && strcmp(e->name, e->r) == 0) @@ -224,8 +224,8 @@ exp_print(mvc *sql, stream *fout, sql_ex if (e->name && alias) { mnstr_printf(fout, " as "); if (e->rname) - mnstr_printf(fout, "%s.", e->rname); - mnstr_printf(fout, "%s", e->name); + mnstr_printf(fout, "\"%s\".", e->rname); + mnstr_printf(fout, "\"%s\"", e->name); } if (comma) mnstr_printf(fout, ", "); @@ -588,20 +588,31 @@ skipWS( char *r, int *pos) static void skipIdent( char *r, int *pos) { - while(r[*pos] && (isalnum(r[*pos]) || r[*pos] == '_' || r[*pos] == '%')) + if (r[*pos] == '"') { (*pos)++; + while(r[*pos] && r[*pos] != '"') + (*pos)++; + (*pos)++; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list