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