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