Changeset: 4e003583f1d7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4e003583f1d7
Added Files:
        sql/backends/monet5/Tests/pyapi32.sql
Modified Files:
        sql/server/rel_psm.c
        sql/server/sql_parser.y
Branch: pythonloader
Log Message:

Add support for varres functions on parser level (todo: actually make it work).


diffs (76 lines):

diff --git a/sql/backends/monet5/Tests/pyapi32.sql 
b/sql/backends/monet5/Tests/pyapi32.sql
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/Tests/pyapi32.sql
@@ -0,0 +1,14 @@
+
+
+START TRANSACTION;
+
+
+CREATE FUNCTION varres_test() RETURNS TABLE(*) LANGUAGE PYTHON {
+    return {'i': 5, 'j': 10};  
+};
+
+explain SELECT * FROM varres_test();
+SELECT * FROM varres_test();
+
+
+ROLLBACK;
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -694,7 +694,7 @@ rel_create_func(mvc *sql, dlist *qname, 
        int instantiate = (sql->emode == m_instantiate);
        int deps = (sql->emode == m_deps);
        int create = (!instantiate && !deps);
-       bit vararg = FALSE;
+       bit vararg = FALSE, varres = FALSE;
 
        char is_table = (res && res->token == SQL_TABLE);
        char is_aggr = (type == F_AGGR);
@@ -771,10 +771,15 @@ rel_create_func(mvc *sql, dlist *qname, 
                        if (!l)
                                l = sa_list(sql->sa);
                        if (res) {
-                               restype = result_type(sql, res);
-                               if (!restype)
-                                       return sql_error(sql, 01,
-                                                       "CREATE %s%s: failed to 
get restype", KF, F);
+                               if (strcmp(res->data.lval->h->data.sval, "*") 
== 0) {
+                                       varres = TRUE;
+                                       restype = NULL;
+                               } else {
+                                       restype = result_type(sql, res);
+                                       if (!restype)
+                                               return sql_error(sql, 01,
+                                                               "CREATE %s%s: 
failed to get restype", KF, F);
+                               }
                        }
                        if (body && lang > FUNC_LANG_SQL) {
                                char *lang_body = body->h->data.sval;
@@ -786,7 +791,7 @@ rel_create_func(mvc *sql, dlist *qname, 
                                        (lang == 
FUNC_LANG_MAP_PY)?"pyapimap":"unknown";
                                sql->params = NULL;
                                if (create) {
-                                       f = mvc_create_func(sql, sql->sa, s, 
fname, l, restype, type, lang,  mod, fname, lang_body, (type == 
F_LOADER)?TRUE:FALSE, vararg);
+                                       f = mvc_create_func(sql, sql->sa, s, 
fname, l, restype, type, lang,  mod, fname, lang_body, (type == 
F_LOADER)?TRUE:varres, vararg);
                                } else if (!sf) {
                                        return sql_error(sql, 01, "CREATE %s%s: 
R function %s.%s not bound", KF, F, s->base.name, fname );
                                } /*else {
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -2165,6 +2165,12 @@ table_function_column_list:
                                  append_string($$, $3);
                                  append_type($$, &$4);
                                }
+  | '*'
+  {
+       $$ = L();
+       append_string($$, "*");
+       append_type($$, NULL);
+  }
   ;
 
 func_data_type:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to