Changeset: 8c587ec63f6d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c587ec63f6d Added Files: sql/backends/monet5/Tests/pyloader08.sql sql/backends/monet5/Tests/pyloader08.stable.err sql/backends/monet5/Tests/pyloader08.stable.out Modified Files: sql/backends/monet5/Tests/pyloader01.stable.out sql/backends/monet5/Tests/pyloader02.stable.out sql/backends/monet5/Tests/pyloader03.stable.out sql/backends/monet5/Tests/pyloader04.stable.out sql/backends/monet5/Tests/pyloader05.stable.out sql/server/rel_select.c Branch: default Log Message:
Properly resolve types of loader functions. diffs (truncated from 367 to 300 lines): diff --git a/sql/backends/monet5/Tests/pyloader01.stable.out b/sql/backends/monet5/Tests/pyloader01.stable.out --- a/sql/backends/monet5/Tests/pyloader01.stable.out +++ b/sql/backends/monet5/Tests/pyloader01.stable.out @@ -44,14 +44,10 @@ Ready. % varchar, varchar, varchar, int, int, boolean, boolean, boolean # type % 6, 32, 5, 1, 1, 5, 5, 5 # length [ "myfunc", "{\n\t_emit.emit({'a':42,'d':1})\n};", "pyapi", 6, 7, true, true, false ] -#COPY INTO mytable FROM LOADER myfunc3(46, 'asdf', 3.2); -[ 1 ] -#COPY INTO mytable FROM LOADER myfunc2(45, 'asdf'); -[ 1 ] -#COPY INTO mytable FROM LOADER myfunc1(44); -[ 1 ] -#COPY INTO mytable FROM LOADER myfunc(); -[ 1 ] +#COPY LOADER INTO mytable FROM myfunc3(46, 'asdf', 3.2); +#COPY LOADER INTO mytable FROM myfunc2(45, 'asdf'); +#COPY LOADER INTO mytable FROM myfunc1(44); +#COPY LOADER INTO mytable FROM myfunc(); #SELECT * FROM mytable; % sys.mytable, sys.mytable, sys.mytable # table_name % a, d, s # name diff --git a/sql/backends/monet5/Tests/pyloader02.stable.out b/sql/backends/monet5/Tests/pyloader02.stable.out --- a/sql/backends/monet5/Tests/pyloader02.stable.out +++ b/sql/backends/monet5/Tests/pyloader02.stable.out @@ -35,12 +35,9 @@ Ready. # res['a'+str(j+1)] = (i+1)*(j+1) # _emit.emit(res) #}; -#COPY INTO mytable3 FROM LOADER myfunc(10, 3); -[ 10 ] -#COPY INTO mytable4 FROM LOADER myfunc(10, 3); -[ 10 ] -#COPY INTO mytable2 FROM LOADER myfunc(20, 2); -[ 20 ] +#COPY LOADER INTO mytable3 FROM myfunc(10, 3); +#COPY LOADER INTO mytable4 FROM myfunc(10, 3); +#COPY LOADER INTO mytable2 FROM myfunc(20, 2); #SELECT * FROM mytable4; % sys.mytable4, sys.mytable4, sys.mytable4, sys.mytable4 # table_name % a1, a2, a3, a4 # name diff --git a/sql/backends/monet5/Tests/pyloader03.stable.out b/sql/backends/monet5/Tests/pyloader03.stable.out --- a/sql/backends/monet5/Tests/pyloader03.stable.out +++ b/sql/backends/monet5/Tests/pyloader03.stable.out @@ -33,8 +33,7 @@ Ready. # a4 = ((a3 - a2) * 3).astype(numpy.int64) # _emit.emit({'a1': a1, 'a2': a2, 'a3': a3, 'a4': a4}) #}; -#COPY INTO restable FROM LOADER myloader(10); -[ 10 ] +#COPY LOADER INTO restable FROM myloader(10); #SELECT * FROM restable; % sys.restable, sys.restable, sys.restable, sys.restable # table_name % a1, a2, a3, a4 # name @@ -60,8 +59,7 @@ Ready. # a4 = ["33", "44", "55", "66", "77"] # _emit.emit({'a1': a1, 'a2': a2, 'a3': a3, 'a4': a4}) #}; -#COPY INTO restable FROM LOADER myloader(); -[ 5 ] +#COPY LOADER INTO restable FROM myloader(); #SELECT * FROM restable; % sys.restable, sys.restable, sys.restable, sys.restable # table_name % a1, a2, a3, a4 # name @@ -93,8 +91,7 @@ Ready. # a4 = [None] * nvalues # _emit.emit({'a1': a1, 'a2': a2, 'a3': a3, 'a4': a4}) #}; -#COPY INTO restable FROM LOADER myloader(50); -[ 50 ] +#COPY LOADER INTO restable FROM myloader(50); #SELECT * FROM restable; % sys.restable, sys.restable, sys.restable, sys.restable # table_name % a1, a2, a3, a4 # name @@ -169,8 +166,7 @@ Ready. # a2 = (a1 * 2).astype(numpy.float64) # a3 = (a1 * 4 + 20).astype(numpy.float32) # a4 = ((a3 - a2) * 3).astype(numpy.int64) -#COPY INTO restable FROM LOADER myloader(); -[ 216 ] +#COPY LOADER INTO restable FROM myloader(); #SELECT * FROM restable; % sys.restable, sys.restable, sys.restable, sys.restable # table_name % a1, a2, a3, a4 # name diff --git a/sql/backends/monet5/Tests/pyloader04.stable.out b/sql/backends/monet5/Tests/pyloader04.stable.out --- a/sql/backends/monet5/Tests/pyloader04.stable.out +++ b/sql/backends/monet5/Tests/pyloader04.stable.out @@ -103,8 +103,7 @@ Ready. #CREATE LOADER pyloader04() LANGUAGE PYTHON { # _emit.emit({'select': 3, 'from': 4}) #}; -#COPY INTO pyloader04table FROM LOADER pyloader04(); -[ 1 ] +#COPY LOADER INTO pyloader04table FROM pyloader04(); #SELECT * FROM pyloader04table; % sys.pyloader04table, sys.pyloader04table # table_name % select, from # name diff --git a/sql/backends/monet5/Tests/pyloader05.stable.out b/sql/backends/monet5/Tests/pyloader05.stable.out --- a/sql/backends/monet5/Tests/pyloader05.stable.out +++ b/sql/backends/monet5/Tests/pyloader05.stable.out @@ -73,8 +73,7 @@ Ready. # _emit.emit({'s': numpy.array([u'\u00D6', 'hello', 33])}); # _emit.emit({'s': numpy.arange(3).astype(numpy.float32)}); # _emit.emit({'s': numpy.arange(3).astype(numpy.float64)}); -#COPY INTO pyloader05table FROM LOADER pyloader05(); -[ 35 ] +#COPY LOADER INTO pyloader05table FROM pyloader05(); #SELECT * FROM pyloader05table; % sys.pyloader05table # table_name % s # name diff --git a/sql/backends/monet5/Tests/pyloader08.sql b/sql/backends/monet5/Tests/pyloader08.sql new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/pyloader08.sql @@ -0,0 +1,29 @@ + +# python loader function with multiple column inputs + +START TRANSACTION; + +CREATE TABLE integers(i INTEGER); +INSERT INTO integers VALUES (3), (4), (5); + +CREATE LOADER pyloader08(i INTEGER, j INTEGER) LANGUAGE PYTHON { + _emit.emit({'s': i, 't': j}); +}; + +CREATE FUNCTION pyfunction(i INTEGER, j INTEGER) RETURNS TABLE(i INTEGER, j INTEGER) LANGUAGE PYTHON { + return {'i': i, 'j': j}; +}; + +CREATE TABLE pyloader08table FROM LOADER pyloader08( (SELECT i, i FROM integers) ); + +SELECT * FROM pyloader08table; + +#CREATE TABLE pyloader08table(s INTEGER, t INTEGER); +COPY LOADER INTO pyloader08table FROM pyloader08( (SELECT i, i*2 FROM integers) ); + +SELECT * FROM pyloader08table; +DROP TABLE pyloader08table; +DROP LOADER pyloader08; + + +ROLLBACK; \ No newline at end of file diff --git a/sql/backends/monet5/Tests/pyloader08.stable.err b/sql/backends/monet5/Tests/pyloader08.stable.err new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/pyloader08.stable.err @@ -0,0 +1,35 @@ +stderr of test 'pyloader08` in directory 'sql/backends/monet5` itself: + + +# 11:17:54 > +# 11:17:54 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=34915" "--set" "mapi_usock=/var/tmp/mtest-11175/.s.monetdb.34915" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/PHolanda/Desktop/MonetDB/install/var/MonetDB/mTests_sql_backends_monet5" "--set" "embedded_py=true" +# 11:17:54 > + +# builtin opt gdk_dbpath = /Users/PHolanda/Desktop/MonetDB/install/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 = 34915 +# cmdline opt mapi_usock = /var/tmp/mtest-11175/.s.monetdb.34915 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /Users/PHolanda/Desktop/MonetDB/install/var/MonetDB/mTests_sql_backends_monet5 +# cmdline opt embedded_py = true +# cmdline opt gdk_debug = 536870922 + +# 11:17:54 > +# 11:17:54 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-11175" "--port=34915" +# 11:17:54 > + + +# 11:17:54 > +# 11:17:54 > "Done." +# 11:17:54 > + diff --git a/sql/backends/monet5/Tests/pyloader08.stable.out b/sql/backends/monet5/Tests/pyloader08.stable.out new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/pyloader08.stable.out @@ -0,0 +1,66 @@ +stdout of test 'pyloader08` in directory 'sql/backends/monet5` itself: + + +# 11:17:54 > +# 11:17:54 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=34915" "--set" "mapi_usock=/var/tmp/mtest-11175/.s.monetdb.34915" "--set" "monet_prompt=" "--forcemito" "--dbpath=/Users/PHolanda/Desktop/MonetDB/install/var/MonetDB/mTests_sql_backends_monet5" "--set" "embedded_py=true" +# 11:17:54 > + +# MonetDB 5 server v11.28.0 +# This is an unreleased version +# Serving database 'mTests_sql_backends_monet5', using 8 threads +# Compiled for x86_64-apple-darwin16.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-47.eduroam.cwi.nl:34915/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-11175/.s.monetdb.34915 +# MonetDB/GIS module loaded +# MonetDB/SQL module loaded +# MonetDB/Python2 module loaded + +Ready. + +# 11:17:54 > +# 11:17:54 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-11175" "--port=34915" +# 11:17:54 > + +#START TRANSACTION; +#CREATE TABLE integers(i INTEGER); +#INSERT INTO integers VALUES (3), (4), (5); +[ 3 ] +#CREATE LOADER pyloader08(i INTEGER, j INTEGER) LANGUAGE PYTHON { +# _emit.emit({'s': i, 't': j}); +#}; +#CREATE FUNCTION pyfunction(i INTEGER, j INTEGER) RETURNS TABLE(i INTEGER, j INTEGER) LANGUAGE PYTHON { +# return {'i': i, 'j': j}; +#}; +#CREATE TABLE pyloader08table FROM LOADER pyloader08( (SELECT i, i FROM integers) ); +#SELECT * FROM pyloader08table; +% sys.pyloader08table, sys.pyloader08table # table_name +% s, t # name +% int, int # type +% 1, 1 # length +[ 3, 3 ] +[ 4, 4 ] +[ 5, 5 ] +#COPY LOADER INTO pyloader08table FROM pyloader08( (SELECT i, i*2 FROM integers) ); +#SELECT * FROM pyloader08table; +% sys.pyloader08table, sys.pyloader08table # table_name +% s, t # name +% int, int # type +% 1, 2 # length +[ 3, 3 ] +[ 4, 4 ] +[ 5, 5 ] +[ 3, 6 ] +[ 4, 8 ] +[ 5, 10 ] +#DROP TABLE pyloader08table; +#DROP LOADER pyloader08; +#ROLLBACK; + +# 11:17:54 > +# 11:17:54 > "Done." +# 11:17:54 > + diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -430,26 +430,26 @@ find_func(mvc *sql, sql_schema *s, char } static sql_exp * -find_table_function(mvc *sql, sql_schema *s, char *fname, list *exps, list *tl) +find_table_function_type(mvc *sql, sql_schema *s, char *fname, list *exps, list *tl, int type, sql_subfunc **sf) { sql_exp *e = NULL; - sql_subfunc * sf = bind_func_(sql, s, fname, tl, F_UNION); - - if (sf) { - e = exp_op(sql->sa, exps, sf); + *sf = bind_func_(sql, s, fname, tl, type); + + if (*sf) { + e = exp_op(sql->sa, exps, *sf); } else if (list_length(tl)) { sql_subfunc * prev = NULL; - while(!e && (sf = bind_member_func(sql, s, fname, tl->h->data, list_length(tl), prev)) != NULL) { + while(!e && (*sf = bind_member_func(sql, s, fname, tl->h->data, list_length(tl), prev)) != NULL) { node *n, *m; list *nexps; - prev = sf; - if (sf->func->vararg) { - e = exp_op(sql->sa, exps, sf); + prev = *sf; + if ((*sf)->func->vararg) { + e = exp_op(sql->sa, exps, *sf); } else { nexps = new_exp_list(sql->sa); - for (n = exps->h, m = sf->func->ops->h; n && m; n = n->next, m = m->next) { + for (n = exps->h, m = (*sf)->func->ops->h; n && m; n = n->next, m = m->next) { sql_arg *a = m->data; sql_exp *e = n->data; @@ -471,20 +471,20 @@ find_table_function(mvc *sql, sql_schema } e = NULL; if (nexps) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list