Changeset: 73fa640cdf6a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/73fa640cdf6a
Modified Files:
sql/backends/monet5/UDF/pyapi3/connection3.c
sql/backends/monet5/UDF/pyapi3/conversion3.c
sql/backends/monet5/UDF/pyapi3/convert_loops.h
sql/backends/monet5/UDF/pyapi3/pyapi3.c
Branch: default
Log Message:
fixing leaks in the python sieve
diffs (truncated from 401 to 300 lines):
diff --git a/sql/backends/monet5/UDF/pyapi3/connection3.c
b/sql/backends/monet5/UDF/pyapi3/connection3.c
--- a/sql/backends/monet5/UDF/pyapi3/connection3.c
+++ b/sql/backends/monet5/UDF/pyapi3/connection3.c
@@ -15,7 +15,8 @@
#include "type_conversion.h"
#include "gdk_interprocess.h"
-static PyObject *_connection_execute(Py_ConnectionObject *self, PyObject *args)
+static PyObject *
+_connection_execute(Py_ConnectionObject *self, PyObject *args)
{
char *query = NULL;
if (PyUnicode_CheckExact(args)) {
@@ -67,8 +68,7 @@ static PyObject *_connection_execute(Py_
input.scalar = false;
input.sql_subtype = &col.type;
- numpy_array =
- PyMaskedArray_FromBAT(&input, 0,
input.count, &res, true);
+ numpy_array = PyMaskedArray_FromBAT(&input, 0,
input.count, &res, true);
if (!numpy_array) {
_connection_cleanup_result(output);
BBPunfix(b->batCacheid);
@@ -76,9 +76,9 @@ static PyObject *_connection_execute(Py_
(res ?
getExceptionMessage(res) : ""));
return NULL;
}
- PyDict_SetItem(result,
-
PyUnicode_FromString(output->cols[i].name),
- numpy_array);
+ PyObject *nme =
PyUnicode_FromString(output->cols[i].name);
+ PyDict_SetItem(result, nme, numpy_array);
+ Py_DECREF(nme);
Py_DECREF(numpy_array);
BBPunfix(input.bat->batCacheid);
}
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
@@ -114,14 +114,13 @@ wrapup:
return vararray;
}
-PyObject *PyMaskedArray_FromBAT(PyInput *inp, size_t t_start, size_t t_end,
- char
**return_message, bool copy)
+PyObject *
+PyMaskedArray_FromBAT(PyInput *inp, size_t t_start, size_t t_end, char
**return_message, bool copy)
{
BAT *b;
char *msg;
- PyObject *vararray;
+ PyObject *vararray = PyArrayObject_FromBAT(inp, t_start, t_end,
return_message, copy);
- vararray = PyArrayObject_FromBAT(inp, t_start, t_end, return_message,
copy);
if (vararray == NULL) {
return NULL;
}
@@ -137,12 +136,15 @@ PyObject *PyMaskedArray_FromBAT(PyInput
bool bnonil = b->tnonil;
MT_lock_unset(&b->theaplock);
if (!bnonil) {
- PyObject *mask;
- PyObject *mafunc = PyObject_GetAttrString(
- PyImport_Import(PyUnicode_FromString("numpy.ma")),
"masked_array");
+ PyObject *nme = PyUnicode_FromString("numpy.ma");
+ PyObject *mod = PyImport_Import(nme);
+ PyObject *mafunc = PyObject_GetAttrString( mod, "masked_array");
PyObject *nullmask = PyNullMask_FromBAT(b, t_start, t_end);
+ Py_DECREF(nme);
if (!nullmask) {
+ Py_DECREF(mafunc);
+ Py_DECREF(mod);
msg = createException(MAL, "pyapi3.eval", "Failed to
create mask for some reason");
goto wrapup;
} else if (nullmask == Py_None) {
@@ -154,16 +156,18 @@ PyObject *PyMaskedArray_FromBAT(PyInput
// Now we will actually construct the mask by calling
the masked
// array constructor
- mask = PyObject_CallObject(mafunc, maargs);
+ PyObject *mask = PyObject_CallObject(mafunc, maargs);
+ Py_DECREF(maargs);
if (!mask) {
+ Py_DECREF(mafunc);
+ Py_DECREF(mod);
msg = createException(MAL, "pyapi3.eval",
SQLSTATE(PY000) "Failed to create mask");
goto wrapup;
}
-