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

Reply via email to