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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list