Changeset: c9cf4d6e3fcb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c9cf4d6e3fcb
Modified Files:
        sql/backends/monet5/UDF/capi/capi.c
        sql/backends/monet5/UDF/pyapi3/pyapi3.c
        sql/backends/monet5/sql_statement.c
        sql/test/BugTracker-2022/Tests/All
Branch: default
Log Message:

Merged with Jan2022


diffs (200 lines):

diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c
--- a/monetdb5/extras/rapi/rapi.c
+++ b/monetdb5/extras/rapi/rapi.c
@@ -642,13 +642,7 @@ static str RAPIeval(Client cntxt, MalBlk
                          "Embedded R initialization has failed");
        }
 
-       if (!grouped) {
-               sql_subfunc *sqlmorefun = (*(sql_subfunc**) 
getArgReference(stk, pci, pci->retc+has_card_arg));
-               if (sqlmorefun) sqlfun = sqlmorefun->func;
-       } else {
-               sqlfun = *(sql_func**) getArgReference(stk, pci, 
pci->retc+has_card_arg);
-       }
-
+       sqlfun = *(sql_func**) getArgReference(stk, pci, 
pci->retc+has_card_arg);
        args = (str*) GDKzalloc(sizeof(str) * pci->argc);
        if (args == NULL) {
                throw(MAL, "rapi.eval", SQLSTATE(HY013) MAL_MALLOC_FAIL);
diff --git a/sql/backends/monet5/UDF/capi/capi.c 
b/sql/backends/monet5/UDF/capi/capi.c
--- a/sql/backends/monet5/UDF/capi/capi.c
+++ b/sql/backends/monet5/UDF/capi/capi.c
@@ -528,16 +528,7 @@ static str CUDFeval(Client cntxt, MalBlk
                sa = (struct sigaction) {.sa_flags = 0,};
        }
 
-       if (!grouped) {
-               sql_subfunc *sqlmorefun =
-                       (*(sql_subfunc **)getArgReference_ptr(stk, pci, 
pci->retc));
-               if (sqlmorefun)
-                       sqlfun =
-                               (*(sql_subfunc **)getArgReference_ptr(stk, pci, 
pci->retc))->func;
-       } else {
-               sqlfun = *(sql_func **)getArgReference_ptr(stk, pci, pci->retc);
-       }
-
+       sqlfun = *(sql_func **)getArgReference_ptr(stk, pci, pci->retc);
        funcname = sqlfun ? sqlfun->base.name : "yet_another_c_function";
 
        args = (str *)GDKzalloc(sizeof(str) * pci->argc);
diff --git a/sql/backends/monet5/UDF/pyapi3/pyapi3.c 
b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyapi3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
@@ -213,15 +213,7 @@ static str PyAPIeval(Client cntxt, MalBl
                card = 1;
        }
 
-       if (!grouped) {
-               sql_subfunc *sqlmorefun =
-                       (*(sql_subfunc **)getArgReference(stk, pci, pci->retc + 
has_card_arg));
-               if (sqlmorefun) {
-                       sqlfun = sqlmorefun->func;
-               }
-       } else {
-               sqlfun = *(sql_func **)getArgReference(stk, pci, pci->retc + 
has_card_arg);
-       }
+       sqlfun = *(sql_func **)getArgReference(stk, pci, pci->retc + 
has_card_arg);
        exprStr = *getArgReference_str(stk, pci, pci->retc + 1 + has_card_arg);
        varres = sqlfun ? sqlfun->varres : 0;
        retcols = !varres ? pci->retc : -1;
diff --git a/sql/backends/monet5/UDF/pyapi3/pyloader3.c 
b/sql/backends/monet5/UDF/pyapi3/pyloader3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyloader3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyloader3.c
@@ -68,13 +68,13 @@ PYAPI3PyAPIevalLoader(Client cntxt, MalB
 
        char *loader_additional_args[] = {"_emit", "_conn"};
 
-    if (!PYAPI3PyAPIInitialized()) {
-        throw(MAL, "pyapi3.eval",
-              SQLSTATE(PY000) "Embedded Python is enabled but an error was 
thrown during initialization.");
-    }
-    sqlmorefun = *(sql_subfunc**) getArgReference(stk, pci, pci->retc);
-    sqlfun = sqlmorefun->func;
-    exprStr = *getArgReference_str(stk, pci, pci->retc + 1);
+       if (!PYAPI3PyAPIInitialized()) {
+               throw(MAL, "pyapi3.eval",
+                               SQLSTATE(PY000) "Embedded Python is enabled but 
an error was thrown during initialization.");
+       }
+       sqlmorefun = *(sql_subfunc**) getArgReference(stk, pci, pci->retc);
+       sqlfun = sqlmorefun->func;
+       exprStr = *getArgReference_str(stk, pci, pci->retc + 1);
 
        args = (str *)GDKzalloc(pci->argc * sizeof(str));
        if (!args) {
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1381,7 +1381,7 @@ stmt_genselect(backend *be, stmt *lops, 
                // push pointer to the SQL structure into the MAL call
                // allows getting argument names for example
                if (LANG_EXT(f->func->lang))
-                       q = pushPtr(mb, q, f); // nothing to see here, please 
move along
+                       q = pushPtr(mb, q, f->func); // nothing to see here, 
please move along
                // f->query contains the R code to be run
                if (f->func->lang == FUNC_LANG_R || f->func->lang >= 
FUNC_LANG_PY)
                        q = pushStr(mb, q, f->func->query);
@@ -3446,8 +3446,15 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
                                setVarType(mb, getArg(q, 0), 
res->type->localtype);
                        }
                }
-               if (LANG_EXT(f->func->lang))
-                       q = pushPtr(mb, q, f);
+               if (LANG_EXT(f->func->lang)) {
+                       /* TODO LOADER functions still use information in 
sql_subfunc struct
+                          that won't be visible to other sessions if another 
function uses them.
+                          It has to be cleaned up */
+                       if (f->func->type == F_LOADER)
+                               q = pushPtr(mb, q, f);
+                       else
+                               q = pushPtr(mb, q, f->func);
+               }
                if (f->func->lang == FUNC_LANG_C) {
                        q = pushBit(mb, q, 0);
                } else if (f->func->lang == FUNC_LANG_CPP) {
diff --git a/sql/test/BugTracker-2022/Tests/All 
b/sql/test/BugTracker-2022/Tests/All
--- a/sql/test/BugTracker-2022/Tests/All
+++ b/sql/test/BugTracker-2022/Tests/All
@@ -2,3 +2,4 @@ date-calculations.Bug-7227
 transaction-conflict.Bug-7228
 insert-not-null.Bug-7232
 recreate-view.Bug-7241
+HAVE_LIBPY3?python-udf-inside-udf.Bug-7252
diff --git a/sql/test/BugTracker-2022/Tests/SingleServer 
b/sql/test/BugTracker-2022/Tests/SingleServer
--- a/sql/test/BugTracker-2022/Tests/SingleServer
+++ b/sql/test/BugTracker-2022/Tests/SingleServer
@@ -0,0 +1,1 @@
+--set embedded_py=3
diff --git a/sql/test/BugTracker-2022/Tests/insert-not-null.Bug-7232.test 
b/sql/test/BugTracker-2022/Tests/insert-not-null.Bug-7232.test
--- a/sql/test/BugTracker-2022/Tests/insert-not-null.Bug-7232.test
+++ b/sql/test/BugTracker-2022/Tests/insert-not-null.Bug-7232.test
@@ -27,14 +27,14 @@ statement ok
 COMMIT
 
 @connection(id=1)
-query T
+query I rowsort
 SELECT k FROM test
 ----
 1
 2
 
 @connection(id=2)
-query T
+query I rowsort
 SELECT k FROM test
 ----
 1
diff --git a/sql/test/BugTracker-2022/Tests/python-udf-inside-udf.Bug-7252.test 
b/sql/test/BugTracker-2022/Tests/python-udf-inside-udf.Bug-7252.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2022/Tests/python-udf-inside-udf.Bug-7252.test
@@ -0,0 +1,49 @@
+@connection(id=1, username=monetdb, password=monetdb)
+statement ok
+START TRANSACTION
+
+@connection(id=1)
+statement ok
+CREATE FUNCTION pyfunc(i integer) returns table (pyi integer)
+language P
+{
+       x = range(1, i + 1)
+       return([x])
+}
+
+@connection(id=1)
+statement ok
+CREATE FUNCTION ups(i integer) returns table (i integer)
+BEGIN
+       RETURN SELECT pyi FROM pyfunc(i);
+END
+
+@connection(id=1)
+statement ok
+COMMIT
+
+@connection(id=1)
+query I nosort
+select i from ups(1)
+----
+1
+
+@connection(id=2, username=monetdb, password=monetdb)
+query I nosort
+select i from ups(1)
+----
+1
+
+@connection(id=3, username=monetdb, password=monetdb)
+query I nosort
+select i from ups(1)
+----
+1
+
+@connection(id=2)
+statement ok
+DROP FUNCTION ups
+
+@connection(id=2)
+statement ok
+DROP FUNCTION pyfunc
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to