Changeset: 742eac419235 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=742eac419235
Removed Files:
sql/backends/monet5/Tests/pyapi18.sql
sql/backends/monet5/Tests/pyapi18.stable.err
sql/backends/monet5/Tests/pyapi18.stable.out
sql/backends/monet5/Tests/pyapi19.sql
sql/backends/monet5/Tests/pyapi19.stable.err
sql/backends/monet5/Tests/pyapi19.stable.out
sql/backends/monet5/Tests/pyapi22.sql
sql/backends/monet5/Tests/pyapi22.stable.err
sql/backends/monet5/Tests/pyapi22.stable.out
Modified Files:
monetdb5/extras/pyapi/Tests/pyapi_modify_input.stable.err
monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.err
monetdb5/extras/pyapi/formatinput.c
monetdb5/extras/pyapi/pyapi.c
sql/backends/monet5/Tests/All
sql/backends/monet5/Tests/pyapi09.stable.err
sql/backends/monet5/Tests/pyapi10.stable.err
Branch: pyapi
Log Message:
Remove _values dictionary.
diffs (truncated from 909 to 300 lines):
diff --git a/monetdb5/extras/pyapi/Tests/pyapi_modify_input.stable.err
b/monetdb5/extras/pyapi/Tests/pyapi_modify_input.stable.err
--- a/monetdb5/extras/pyapi/Tests/pyapi_modify_input.stable.err
+++ b/monetdb5/extras/pyapi/Tests/pyapi_modify_input.stable.err
@@ -31,45 +31,45 @@ stderr of test 'pyapi_modify_input` in d
# 12:27:29 > "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-30203" "--port=31030"
# 12:27:29 >
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = rstr:bat[:oid,:str] :=
pyapi.eval(nil:ptr,"arg1[0].__setitem__(0,'a')\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- ! 1. def pyfun(arg1,_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(arg1,_columns,_column_types,_conn):
!> 2. arg1[0].__setitem__(0,'a')
! 3. return(arg1)
!'numpy.string_' object has no attribute '__setitem__'
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = rstr:bat[:oid,:str] :=
pyapi.eval(nil:ptr,"arg1[0][0]='d'\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- ! 1. def pyfun(arg1,_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(arg1,_columns,_column_types,_conn):
!> 2. arg1[0][0]='d'
! 3. return(arg1)
!'numpy.string_' object does not support item assignment
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = rstr:bat[:oid,:str] :=
pyapi.eval(nil:ptr,"arg1[0].reverse()\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- ! 1. def pyfun(arg1,_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(arg1,_columns,_column_types,_conn):
!> 2. arg1[0].reverse()
! 3. return(arg1)
!'numpy.string_' object has no attribute 'reverse'
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = rstr:bat[:oid,:str] := pyapi.eval(nil:ptr,"a =
arg1[0].remove('a')\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- ! 1. def pyfun(arg1,_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(arg1,_columns,_column_types,_conn):
!> 2. a = arg1[0].remove('a')
! 3. return(arg1)
!'numpy.string_' object has no attribute 'remove'
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = rstr:bat[:oid,:str] := pyapi.eval(nil:ptr,"a =
arg1[0].pop()\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- ! 1. def pyfun(arg1,_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(arg1,_columns,_column_types,_conn):
!> 2. a = arg1[0].pop()
! 3. return(arg1)
!'numpy.string_' object has no attribute 'pop'
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = result:bat[:oid,:int] := pyapi.eval(nil:ptr,
"arg1[0]=4\nreturn(arg1)", a);
ERROR = !MALException:pyapi.eval:Python exception
- ! 1. def pyfun(arg1,_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(arg1,_columns,_column_types,_conn):
!> 2. arg1[0]=4
! 3. return(arg1)
!assignment destination is read-only
diff --git a/monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.err
b/monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.err
--- a/monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.err
+++ b/monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.err
@@ -31,45 +31,45 @@ stderr of test 'pyapi_returntypes` in di
# 23:33:07 > "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-20340" "--port=36739"
# 23:33:07 >
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = r:bat[:oid,:int] := pyapi.eval(nil:ptr,"return(\"Test\")");
ERROR = !MALException:pyapi.eval:Could not convert from type STRING to type int
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = (r:bat[:oid,:int], s:bat[:oid,:int]) := pyapi.eval(nil:ptr,"class
NewClass:\n x = 5\n\nreturn(NewClass())");
ERROR = !MALException:pyapi.eval: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 "<type 'instance'>"
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = (r:bat[:oid,:int], s:bat[:oid,:int]) :=
pyapi.eval(nil:ptr,"return(12)");
ERROR = !MALException:pyapi.eval:A single scalar was returned, yet we expect a
list of 2 columns. We can only convert a single scalar into a single column,
thus the result is invalid.
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = (r:bat[:oid,:int], s:bat[:oid,:int]) :=
pyapi.eval(nil:ptr,"return(numpy.array([12]))");
ERROR = !MALException:pyapi.eval:A single array was returned, yet we expect a
list of 2 columns. The result is invalid.
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = (r:bat[:oid,:int], s:bat[:oid,:int]) :=
pyapi.eval(nil:ptr,"return([12])");
ERROR = !MALException:pyapi.eval:A single array was returned, yet we expect a
list of 2 columns. The result is invalid.
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = r:bat[:oid,:int] := pyapi.eval(nil:ptr,"return([[33,24,55],
[44,66,345]])");
ERROR = !MALException:pyapi.eval:An array of size 2 was returned, yet we
expect a list of 1 columns. The result is invalid.
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = a:bat[:oid,:str] := pyapi.eval(nil:ptr,"x =
unicode(\"hello\")\nreturn(x.encode(\"utf32\"))");
ERROR = !MALException:pyapi.eval:Invalid string encoding used. Please return a
regular ASCII string, or a Numpy_Unicode object.
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = bb:bat[:oid,:int] := pyapi.eval(nil:ptr,"return (1");
ERROR = !MALException:pyapi.eval:Could not parse Python code
- ! 1. def pyfun(_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(_columns,_column_types,_conn):
!> 2. return (1
!invalid syntax (<string>, line 2)
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = cc:bat[:oid,:int] := pyapi.eval(nil:ptr,"x = 4\n x++\n\treturn (x)");
ERROR = !MALException:pyapi.eval:Could not parse Python code
- ! 1. def pyfun(_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(_columns,_column_types,_conn):
! 2. x = 4
!> 3. x++
! 4. return (x)
!unexpected indent (<string>, line 3)
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = (str1:bat[:oid,:str], str2:bat[:oid,:str]) := pyapi.eval(nil:ptr,"x =
unicode(\"hello\")\nreturn(numpy.array([[x.encode(\"utf32\")],
[x.encode(\"utf32\")]]))");
ERROR = !MALException:pyapi.eval:Invalid string encoding used. Please return a
regular ASCII string, or a Numpy_Unicode object.
-MAPI = (monetdb) /var/tmp/mtest-26471/.s.monetdb.31185
+MAPI = (monetdb) /var/tmp/mtest-30397/.s.monetdb.34935
QUERY = (str1:bat[:oid,:str], str2:bat[:oid,:str]) :=
pyapi.eval(nil:ptr,"return(numpy.array([[\"Hëllo\", \"Hello Again\"], [\"Hello
Again Again\",\"That's quite enough.\"]]))");
ERROR = !MALException:pyapi.eval:Invalid string encoding used. Please return a
regular ASCII string, or a Numpy_Unicode object.
diff --git a/monetdb5/extras/pyapi/formatinput.c
b/monetdb5/extras/pyapi/formatinput.c
--- a/monetdb5/extras/pyapi/formatinput.c
+++ b/monetdb5/extras/pyapi/formatinput.c
@@ -10,8 +10,8 @@
#include "gdk.h"
#include "mal_exception.h"
-const size_t additional_argcount = 4;
-const char * additional_args[] = {"_columns", "_column_types", "_values",
"_conn"};
+const size_t additional_argcount = 3;
+const char * additional_args[] = {"_columns", "_column_types", "_conn"};
//! Parse a PyCodeObject from a string, the string is expected to be in the
format {@<encoded_function>};, where <encoded_function> is all the PyCodeObject
properties in order
PyObject *PyCodeObject_ParseString(char *string, char **msg);
diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c
--- a/monetdb5/extras/pyapi/pyapi.c
+++ b/monetdb5/extras/pyapi/pyapi.c
@@ -91,36 +91,6 @@ static int pyapiInitialized = FALSE;
static bool python_call_active = false;
-static PyObject **dictionaries = NULL;
-static Client *clients = NULL;
-static int dictionary_count = 0, max_dictionaries = 0;
-
-static PyObject *GetDictionary(Client c)
-{
- int i = 0;
- for(i = 0; i < dictionary_count; i++) {
- if (clients[i] == c) {
- return dictionaries[i];
- }
- }
-
- if (dictionary_count >= max_dictionaries) {
- PyObject **new_dictionaries = GDKzalloc((max_dictionaries + 2) *
sizeof(PyObject*));
- Client *new_clients = GDKzalloc((max_dictionaries + 2) *
sizeof(Client));
- for(i = 0; i < dictionary_count; i++) {
- new_dictionaries[i] = dictionaries[i];
- new_clients[i] = clients[i];
- }
- if (clients != NULL) { GDKfree(clients); GDKfree(dictionaries); }
- dictionaries = new_dictionaries; clients = new_clients;
- }
-
- clients[dictionary_count] = c;
- dictionaries[dictionary_count] = PyDict_New();
- dictionary_count++;
- return dictionaries[dictionary_count - 1];
-}
-
#ifdef _PYAPI_TESTING_
// This #define converts a BAT 'bat' of BAT type 'TYPE_mtpe' to a Numpy array
of type 'nptpe'
// This only works with numeric types (bit, byte, int, long, float, double),
strings are handled separately
@@ -361,28 +331,24 @@ PyAPIeval(Client cntxt, MalBlkPtr mb, Ma
str
PyAPIevalStd(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- (void) cntxt;
return PyAPIeval(cntxt, mb, stk, pci, 0, 0);
}
str
PyAPIevalStdMap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- (void) cntxt;
return PyAPIeval(cntxt, mb, stk, pci, 0, 1);
}
str
PyAPIevalAggr(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- (void) cntxt;
return PyAPIeval(cntxt, mb, stk, pci, 1, 0);
}
str
PyAPIevalAggrMap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- (void) cntxt;
return PyAPIeval(cntxt, mb, stk, pci, 1, 1);
}
@@ -407,7 +373,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
BAT *b = NULL;
node * argnode;
int seengrp = FALSE;
- PyObject *pArgs = NULL, *pColumns = NULL, *pColumnTypes = NULL,
*pConnection, *pDict = NULL, *pResult = NULL; // this is going to be the
parameter tuple
+ PyObject *pArgs = NULL, *pColumns = NULL, *pColumnTypes = NULL,
*pConnection, *pResult = NULL; // this is going to be the parameter tuple
PyObject *code_object = NULL;
PyReturn *pyreturn_values = NULL;
PyInput *pyinput_values = NULL;
@@ -711,11 +677,10 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
// Now we will do the input handling (aka converting the input BATs to
numpy arrays)
// We will put the python arrays in a PyTuple object, we will use this
PyTuple object as the set of arguments to call the Python function
- pArgs = PyTuple_New(pci->argc - (pci->retc + 2) + (code_object == NULL ? 4
: 0));
+ pArgs = PyTuple_New(pci->argc - (pci->retc + 2) + (code_object == NULL ? 3
: 0));
pColumns = PyDict_New();
pColumnTypes = PyDict_New();
pConnection = Py_Connection_Create(cntxt);
- pDict = GetDictionary(cntxt);
// Now we will loop over the input BATs and convert them to python objects
for (i = pci->retc + 2; i < pci->argc; i++) {
@@ -755,9 +720,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
if (code_object == NULL) {
PyTuple_SetItem(pArgs, ai++, pColumns);
PyTuple_SetItem(pArgs, ai++, pColumnTypes);
- PyTuple_SetItem(pArgs, ai++, pDict);
PyTuple_SetItem(pArgs, ai++, pConnection);
- Py_INCREF(pDict);
}
/*[EXECUTE_CODE]*/
@@ -802,21 +765,6 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
// The function has been successfully created/compiled, all that
remains is to actually call the function
pResult = PyObject_CallObject(pFunc, pArgs);
- {
- //check the _values dictionary to see if any of the stored values
are input values
- PyObject *key, *value;
- Py_ssize_t pos = 0;
- while (PyDict_Next(pDict, &pos, &key, &value)) {
- for(i = 0; i < pci->argc - (pci->retc + 2); i ++) {
- PyObject *arg = PyTuple_GetItem(pArgs, i);
- if (arg == value) {
- msg = createException(MAL, "pyapi.eval", "You cannot
directly store input arguments in the _values dictionary, instead use
_values[key] = numpy.copy(input).");
- goto wrapup;
- }
- }
- }
- }
-
Py_DECREF(pFunc);
Py_DECREF(pArgs);
Py_DECREF(pColumns);
diff --git a/sql/backends/monet5/Tests/All b/sql/backends/monet5/Tests/All
--- a/sql/backends/monet5/Tests/All
+++ b/sql/backends/monet5/Tests/All
@@ -17,11 +17,8 @@ HAVE_LIBPY?pyapi13
HAVE_LIBPY?pyapi14
HAVE_LIBPY?pyapi16
HAVE_LIBPY?pyapi17
-HAVE_LIBPY?pyapi18
-HAVE_LIBPY?pyapi19
HAVE_LIBPY?pyapi20
HAVE_LIBPY?pyapi21
-HAVE_LIBPY?pyapi22
HAVE_LIBPY?pyapi23
HAVE_LIBPY?pyapi24
HAVE_LIBPY?pyapi25
diff --git a/sql/backends/monet5/Tests/pyapi09.stable.err
b/sql/backends/monet5/Tests/pyapi09.stable.err
--- a/sql/backends/monet5/Tests/pyapi09.stable.err
+++ b/sql/backends/monet5/Tests/pyapi09.stable.err
@@ -31,20 +31,20 @@ stderr of test 'pyapi09` in directory 's
# 14:42:12 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-30058" "--port=35977"
# 14:42:12 >
-MAPI = (monetdb) /var/tmp/mtest-25654/.s.monetdb.32235
+MAPI = (monetdb) /var/tmp/mtest-28978/.s.monetdb.30135
QUERY = SELECT * FROM pyapi09();
ERROR = !SELECT: no such table 'unknown_table'
!Python exception
!
- ! 1. def pyfun(_columns,_column_types,_values,_conn):
+ ! 1. def pyfun(_columns,_column_types,_conn):
!> 2. res = _conn.execute('SELECT * FROM unknown_table;')
! 3. return numpy.arange(10)
! 4.
!SQL Query Failed: ParseException:SQLparser:42S02!SELECT: no such
table 'unknown_table'
-MAPI = (monetdb) /var/tmp/mtest-25654/.s.monetdb.32235
+MAPI = (monetdb) /var/tmp/mtest-28978/.s.monetdb.30135
QUERY = SELECT * FROM pyapi09();
ERROR = !SELECT: no such table 'unknown_table'
-MAPI = (monetdb) /var/tmp/mtest-25654/.s.monetdb.32235
+MAPI = (monetdb) /var/tmp/mtest-28978/.s.monetdb.30135
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list