Changeset: 87c0d4b31cc1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/87c0d4b31cc1
Modified Files:
clients/Tests/MAL-signatures-hge.test
clients/Tests/MAL-signatures.test
sql/backends/monet5/UDF/pyapi3/conversion3.c
sql/backends/monet5/UDF/pyapi3/pyapi3.c
sql/backends/monet5/UDF/pyapi3/pyloader3.c
sql/backends/monet5/UDF/pyapi3/pytypes3.c
Branch: default
Log Message:
small leak fixes
diffs (204 lines):
diff --git a/clients/Tests/MAL-signatures-hge.test
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -48819,6 +48819,11 @@ unsafe pattern profiler.stoptrace():void
CMDstopTrace;
Stop collecting trace information
pyapi3
+epilogue
+command pyapi3.epilogue():void
+PyAPI3epilogue;
+(empty)
+pyapi3
eval
unsafe pattern pyapi3.eval(X_0:ptr, X_1:str):any_1
PYAPI3PyAPIevalStd;
@@ -48844,6 +48849,11 @@ unsafe pattern pyapi3.eval_loader(X_0:pt
PYAPI3PyAPIevalLoader;
loader functions through Python
pyapi3
+prelude
+pattern pyapi3.prelude():void
+PyAPI3prelude;
+(empty)
+pyapi3
subeval_aggr
unsafe pattern pyapi3.subeval_aggr(X_0:ptr, X_1:str, X_2:any...):any...
PYAPI3PyAPIevalAggr;
diff --git a/clients/Tests/MAL-signatures.test
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -37249,6 +37249,11 @@ unsafe pattern profiler.stoptrace():void
CMDstopTrace;
Stop collecting trace information
pyapi3
+epilogue
+command pyapi3.epilogue():void
+PyAPI3epilogue;
+(empty)
+pyapi3
eval
unsafe pattern pyapi3.eval(X_0:ptr, X_1:str):any_1
PYAPI3PyAPIevalStd;
@@ -37274,6 +37279,11 @@ unsafe pattern pyapi3.eval_loader(X_0:pt
PYAPI3PyAPIevalLoader;
loader functions through Python
pyapi3
+prelude
+pattern pyapi3.prelude():void
+PyAPI3prelude;
+(empty)
+pyapi3
subeval_aggr
unsafe pattern pyapi3.subeval_aggr(X_0:ptr, X_1:str, X_2:any...):any...
PYAPI3PyAPIevalAggr;
diff --git a/sql/backends/monet5/UDF/pyapi3/conversion3.c
b/sql/backends/monet5/UDF/pyapi3/conversion3.c
--- a/sql/backends/monet5/UDF/pyapi3/conversion3.c
+++ b/sql/backends/monet5/UDF/pyapi3/conversion3.c
@@ -121,9 +121,8 @@ PyMaskedArray_FromBAT(PyInput *inp, size
char *msg;
PyObject *vararray = PyArrayObject_FromBAT(inp, t_start, t_end,
return_message, copy);
- if (vararray == NULL) {
+ if (vararray == NULL)
return NULL;
- }
b = inp->bat;
// To deal with null values, we use the numpy masked array structure
// The masked array structure is an object with two arrays of equal
size, a
@@ -143,6 +142,7 @@ PyMaskedArray_FromBAT(PyInput *inp, size
Py_DECREF(nme);
if (!nullmask) {
+ Py_DECREF(vararray);
Py_DECREF(mafunc);
Py_DECREF(mod);
msg = createException(MAL, "pyapi3.eval", "Failed to
create mask for some reason");
@@ -589,8 +589,7 @@ PyDict_CheckForConversion(PyObject *pRes
for (i = 0; i < expected_columns; i++) {
PyObject *object = PyDict_GetItemString(pResult,
retcol_names[i]);
if (object == NULL) {
- msg =
- createException(MAL, "pyapi3.eval",
+ msg = createException(MAL, "pyapi3.eval",
SQLSTATE(PY000)
"Expected a return value with name \"%s\", but "
"this key was
not present in the dictionary.",
retcol_names[i]);
@@ -722,6 +721,7 @@ PyObject_CheckForConversion(PyObject *pR
SQLSTATE(PY000) "Unsupported result
object. Expected either a list, "
"dictionary, a numpy array, a numpy
masked array or a "
"pandas data frame, but received an
object of type \"%s\"",
+ /* leaks */
PyUnicode_AsUTF8(PyObject_Str(PyObject_Type(data))));
goto wrapup;
}
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
@@ -723,7 +723,7 @@ static str PyAPIeval(Client cntxt, MalBl
// Now we will add the UDF to the main module
d = PyModule_GetDict(pModule);
if (code_object == NULL) {
- v = PyRun_StringFlags(pycall, Py_file_input, d, d,
NULL);
+ v = PyRun_StringFlags(pycall, Py_file_input, d, NULL,
NULL);
if (v == NULL) {
msg = PyError_CreateException("Could not parse
Python code",
pycall);
@@ -1757,6 +1757,30 @@ bailout:
return msg;
}
+static str
+PyAPI3prelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ (void)cntxt; (void)mb; (void)stk; (void)pci;
+ return PYAPI3PyAPIprelude();
+}
+
+static str
+PyAPI3epilogue(void *ret)
+{
+ (void)ret;
+ MT_lock_set(&pyapiLock);
+ if (pyapiInitialized) {
+ PyGILState_STATE gstate;
+ gstate = PyGILState_Ensure();
+
+ /* now exit/cleanup */
+ if (0) Py_FinalizeEx();
+ (void)gstate;
+ }
+ MT_lock_unset(&pyapiLock);
+ return MAL_SUCCEED;
+}
+
#include "mel.h"
static mel_func pyapi3_init_funcs[] = {
pattern("pyapi3", "eval", PYAPI3PyAPIevalStd, true, "Execute a simple Python
script returning a single value", args(1,3,
argany("",1),arg("fptr",ptr),arg("expr",str))),
@@ -1778,6 +1802,8 @@ static mel_func pyapi3_init_funcs[] = {
pattern("batpyapi3map", "eval", PYAPI3PyAPIevalStdMap, false, "Execute a
simple Python script value", args(1,4,
varargany("",0),arg("fptr",ptr),arg("expr",str),varargany("arg",0))),
pattern("batpyapi3map", "subeval_aggr", PYAPI3PyAPIevalAggrMap, false,
"grouped aggregates through Python", args(1,4,
varargany("",0),arg("fptr",ptr),arg("expr",str),varargany("arg",0))),
pattern("batpyapi3map", "eval_aggr", PYAPI3PyAPIevalAggrMap, false, "grouped
aggregates through Python", args(1,4,
varargany("",0),arg("fptr",ptr),arg("expr",str),varargany("arg",0))),
+ pattern("pyapi3", "prelude", PyAPI3prelude, false, "", noargs),
+ command("pyapi3", "epilogue", PyAPI3epilogue, false, "", noargs),
{ .imp=NULL }
};
#include "mal_import.h"
@@ -1786,4 +1812,4 @@ static mel_func pyapi3_init_funcs[] = {
#pragma section(".CRT$XCU",read)
#endif
LIB_STARTUP_FUNC(init_pyapi3_mal)
-{ mal_module2("pyapi3", NULL, pyapi3_init_funcs, PYAPI3PyAPIprelude, NULL); }
+{ mal_module("pyapi3", NULL, pyapi3_init_funcs); }
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
@@ -234,7 +234,7 @@ PYAPI3PyAPIevalLoader(Client cntxt, MalB
// Now we will add the UDF to the main module
d = PyModule_GetDict(pModule);
if (code_object == NULL) {
- v = PyRun_StringFlags(pycall, Py_file_input, d, d,
NULL);
+ v = PyRun_StringFlags(pycall, Py_file_input, d, NULL,
NULL);
if (v == NULL) {
msg = PyError_CreateException("Could not parse
Python code",
pycall);
diff --git a/sql/backends/monet5/UDF/pyapi3/pytypes3.c
b/sql/backends/monet5/UDF/pyapi3/pytypes3.c
--- a/sql/backends/monet5/UDF/pyapi3/pytypes3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pytypes3.c
@@ -228,27 +228,33 @@ int BatType_ToPyType(int type)
bool PyType_IsPandasDataFrame(PyObject *object)
{
- PyObject *str = PyObject_Str(PyObject_Type(object));
+ PyObject *type = PyObject_Type(object);
+ PyObject *str = PyObject_Str(type);
bool ret = strcmp(PyUnicode_AsUTF8(str),
"<class
'pandas.core.frame.DataFrame'>") == 0;
Py_DECREF(str);
+ Py_DECREF(type);
return ret;
}
bool PyType_IsNumpyMaskedArray(PyObject *object)
{
- PyObject *str = PyObject_Str(PyObject_Type(object));
+ PyObject *type = PyObject_Type(object);
+ PyObject *str = PyObject_Str(type);
bool ret = strcmp(PyUnicode_AsUTF8(str),
"<class
'numpy.ma.core.MaskedArray'>") == 0;
Py_DECREF(str);
+ Py_DECREF(type);
return ret;
}
bool PyType_IsLazyArray(PyObject *object)
{
- PyObject *str = PyObject_Str(PyObject_Type(object));
+ PyObject *type = PyObject_Type(object);
+ PyObject *str = PyObject_Str(type);
bool ret = strcmp(PyUnicode_AsUTF8(str), "<class 'lazyarray'>") == 0;
Py_DECREF(str);
+ Py_DECREF(type);
return ret;
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]