Changeset: a7ee39e0c5c5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a7ee39e0c5c5
Modified Files:
monetdb5/extras/pyapi/Benchmarks/monetdb_testing.py
monetdb5/extras/pyapi/Tests/pyapi_modify_input.stable.err
monetdb5/extras/pyapi/Tests/pyapi_returntypes.malC
monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.err
monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.out
monetdb5/extras/pyapi/pyapi.c
sql/backends/monet5/Tests/pyapi02.sql
sql/backends/monet5/Tests/pyapi02.stable.out
sql/backends/monet5/Tests/pyapi06.sql
sql/backends/monet5/Tests/pyapi06.stable.out
sql/backends/monet5/Tests/pyapi10.stable.err
sql/backends/monet5/Tests/pyapi17.stable.err
Branch: pyapi
Log Message:
Approved new output of a few tests.
diffs (truncated from 405 to 300 lines):
diff --git a/monetdb5/extras/pyapi/Benchmarks/monetdb_testing.py
b/monetdb5/extras/pyapi/Benchmarks/monetdb_testing.py
--- a/monetdb5/extras/pyapi/Benchmarks/monetdb_testing.py
+++ b/monetdb5/extras/pyapi/Benchmarks/monetdb_testing.py
@@ -158,6 +158,7 @@ if str(args_input_database).lower() == "
def run_test(testcommand, testcommand_nomem, *measurements):
if hot_test: cursor.execute(testcommand_nomem) #run the test once to
warm up
+ memory = 0
if testcommand != None:
# clear the result file
result_file = open(temp_file, 'w+')
@@ -170,7 +171,7 @@ if str(args_input_database).lower() == "
result_file.close()
memory = float(pyapi_results[0]) / 1000**2
for i in range(0,test_count):
- total_time, memory, pyapi_time = 0, 0, 0
+ total_time, pyapi_time = 0, 0
# now run the normal test (with malloc tracking disabled)
result_file = open(temp_file, 'w+')
result_file.close()
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,25 +31,47 @@ 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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14033/.s.monetdb.39892
+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):
+ !> 2. arg1[0].__setitem__(0,'a')
+ ! 3. return(arg1)
+ !'numpy.string_' object has no attribute '__setitem__'
+MAPI = (monetdb) /var/tmp/mtest-14033/.s.monetdb.39892
QUERY = rstr:bat[:oid,:str] :=
pyapi.eval(nil:ptr,"arg1[0][0]='d'\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- !This ByteArray references to a BAT in the database, you may not
assign to it.
-MAPI = (monetdb) /var/tmp/mtest-10930/.s.monetdb.36894
+ ! 1. def pyfun(arg1,_columns,_column_types,_values):
+ !> 2. arg1[0][0]='d'
+ ! 3. return(arg1)
+ !'numpy.string_' object does not support item assignment
+MAPI = (monetdb) /var/tmp/mtest-14033/.s.monetdb.39892
QUERY = rstr:bat[:oid,:str] :=
pyapi.eval(nil:ptr,"arg1[0].reverse()\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- !This ByteArray references to a BAT in the database, you may not
reverse it.
-MAPI = (monetdb) /var/tmp/mtest-10930/.s.monetdb.36894
+ ! 1. def pyfun(arg1,_columns,_column_types,_values):
+ !> 2. arg1[0].reverse()
+ ! 3. return(arg1)
+ !'numpy.string_' object has no attribute 'reverse'
+MAPI = (monetdb) /var/tmp/mtest-14033/.s.monetdb.39892
QUERY = rstr:bat[:oid,:str] := pyapi.eval(nil:ptr,"a =
arg1[0].remove('a')\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- !This ByteArray references to a BAT in the database, you may not
remove anything from it.
-MAPI = (monetdb) /var/tmp/mtest-10930/.s.monetdb.36894
+ ! 1. def pyfun(arg1,_columns,_column_types,_values):
+ !> 2. a = arg1[0].remove('a')
+ ! 3. return(arg1)
+ !'numpy.string_' object has no attribute 'remove'
+MAPI = (monetdb) /var/tmp/mtest-14033/.s.monetdb.39892
QUERY = rstr:bat[:oid,:str] := pyapi.eval(nil:ptr,"a =
arg1[0].pop()\nreturn(arg1)",bstr);
ERROR = !MALException:pyapi.eval:Python exception
- !This ByteArray references to a BAT in the database, you may not
remove anything from it.
-MAPI = (monetdb) /var/tmp/mtest-10930/.s.monetdb.36894
+ ! 1. def pyfun(arg1,_columns,_column_types,_values):
+ !> 2. a = arg1[0].pop()
+ ! 3. return(arg1)
+ !'numpy.string_' object has no attribute 'pop'
+MAPI = (monetdb) /var/tmp/mtest-14033/.s.monetdb.39892
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):
+ !> 2. arg1[0]=4
+ ! 3. return(arg1)
!assignment destination is read-only
# 12:27:29 >
diff --git a/monetdb5/extras/pyapi/Tests/pyapi_returntypes.malC
b/monetdb5/extras/pyapi/Tests/pyapi_returntypes.malC
--- a/monetdb5/extras/pyapi/Tests/pyapi_returntypes.malC
+++ b/monetdb5/extras/pyapi/Tests/pyapi_returntypes.malC
@@ -116,11 +116,13 @@ io.print(r,s);
# return a multi-dimensional masked array with uneven dimensions
(r:bat[:oid,:int], s:bat[:oid,:int]) :=
pyapi.eval(nil:ptr,"return(numpy.ma.masked_array([[1, 2, 3], [1,2,3,4]], 0))");
-io.print(r,s);
+io.print(r);
+io.print(s);
# return a masked array, holding multiple masked arrays of uneven length (if
they had even length, the test would be identical to the one above because
numpy would automatically convert the object to one big masked array)
(r:bat[:oid,:int], s:bat[:oid,:int]) :=
pyapi.eval(nil:ptr,"return(numpy.ma.masked_array([numpy.ma.masked_array([17,2,28],
[0,1,0]), numpy.ma.masked_array([1,2,3,4], [1,0,0,0])], 0))");
-io.print(r,s);
+io.print(r);
+io.print(s);
#######################
#######################
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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 an
array, 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-10930/.s.monetdb.36894
+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-14418/.s.monetdb.33668
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
QUERY = bb:bat[:oid,:int] := pyapi.eval(nil:ptr,"return (1");
ERROR = !MALException:pyapi.eval:Could not parse Python code
- ! 1. def pyfun():
+ ! 1. def pyfun(_columns,_column_types,_values):
!> 2. return (1
!invalid syntax (<string>, line 2)
-MAPI = (monetdb) /var/tmp/mtest-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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():
+ ! 1. def pyfun(_columns,_column_types,_values):
! 2. x = 4
!> 3. x++
! 4. return (x)
!unexpected indent (<string>, line 3)
-MAPI = (monetdb) /var/tmp/mtest-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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-10930/.s.monetdb.36894
+MAPI = (monetdb) /var/tmp/mtest-14418/.s.monetdb.33668
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/Tests/pyapi_returntypes.stable.out
b/monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.out
--- a/monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.out
+++ b/monetdb5/extras/pyapi/Tests/pyapi_returntypes.stable.out
@@ -203,17 +203,35 @@ Ready.
# h t t # name
# void int int # type
#--------------------------#
-[ 0@0, 1, 1 ]
-[ 1@0, 2, 2 ]
-[ 2@0, 3, 3 ]
-#io.print(r,s);
+[ 0@0, 1 ]
+[ 1@0, 2 ]
+[ 2@0, 3 ]
+#io.print(s);
#--------------------------#
# h t t # name
# void int int # type
#--------------------------#
-[ 0@0, 17, nil ]
-[ 1@0, nil, 2 ]
-[ 2@0, 28, 3 ]
+[ 0@0, 1 ]
+[ 1@0, 2 ]
+[ 2@0, 3 ]
+[ 3@0, 4 ]
+#io.print(r);
+#--------------------------#
+# h t # name
+# void int # type
+#--------------------------#
+[ 0@0, 17 ]
+[ 1@0, nil ]
+[ 2@0, 28 ]
+#io.print(s);
+#--------------------------#
+# h t # name
+# void int # type
+#--------------------------#
+[ 0@0, nil ]
+[ 1@0, 2 ]
+[ 2@0, 3 ]
+[ 3@0, 4 ]
#io.print(r);
#--------------------------#
# h t # name
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
@@ -1365,7 +1365,7 @@ str
bool PyType_IsPyScalar(PyObject *object)
{
if (object == NULL) return false;
- return (PyInt_Check(object) || PyFloat_Check(object) ||
PyLong_Check(object) || PyString_Check(object) || PyBool_Check(object) ||
PyUnicode_Check(object) || PyByteArray_Check(object));
+ return (PyArray_CheckScalar(object) || PyInt_Check(object) ||
PyFloat_Check(object) || PyLong_Check(object) || PyString_Check(object) ||
PyBool_Check(object) || PyUnicode_Check(object) || PyByteArray_Check(object));
}
@@ -1373,7 +1373,7 @@ static char *PyError_CreateException(cha
{
PyObject *py_error_type = NULL, *py_error_value = NULL,
*py_error_traceback = NULL;
char *py_error_string = NULL;
- lng line_number;
+ lng line_number = -1;
PyErr_Fetch(&py_error_type, &py_error_value, &py_error_traceback);
if (py_error_value) {
@@ -1385,11 +1385,13 @@ static char *PyError_CreateException(cha
Py_XDECREF(error);
if (pycall != NULL && strlen(pycall) > 0) {
if (py_error_traceback == NULL) {
- //no traceback info, display normal error
- goto finally;
- }
-
- line_number = ((PyTracebackObject*)py_error_traceback)->tb_lineno;
+ //no traceback info, this means we are dealing with a parsing
error
+ //line information should be in the error message
+ sscanf(py_error_string, "%*[^0-9]%llu", &line_number);
+ if (line_number < 0) goto finally;
+ } else {
+ line_number =
((PyTracebackObject*)py_error_traceback)->tb_lineno;
+ }
// Now only display the line numbers around the error message, we
display 5 lines around the error message
{
diff --git a/sql/backends/monet5/Tests/pyapi02.sql
b/sql/backends/monet5/Tests/pyapi02.sql
--- a/sql/backends/monet5/Tests/pyapi02.sql
+++ b/sql/backends/monet5/Tests/pyapi02.sql
@@ -10,8 +10,17 @@ language P
return(x);
};
-SELECT pyapi02(i,j,2) as r02 FROM rval;
+SELECT pyapi02(i,j,2) FROM rval;
DROP FUNCTION pyapi02;
+
+CREATE FUNCTION pyapi02(i integer) returns integer
+language P
+{
+ return numpy.min(i)
+};
+
+SELECT pyapi02(i) FROM rval;
+
DROP TABLE rval;
ROLLBACK;
diff --git a/sql/backends/monet5/Tests/pyapi02.stable.out
b/sql/backends/monet5/Tests/pyapi02.stable.out
--- a/sql/backends/monet5/Tests/pyapi02.stable.out
+++ b/sql/backends/monet5/Tests/pyapi02.stable.out
@@ -41,7 +41,7 @@ Ready.
#};
#SELECT pyapi02(i,j,2) as r02 FROM rval;
% sys.L # table_name
-% r02 # name
+% pyapi02_i # name
% int # type
% 2 # length
[ 20 ]
@@ -49,6 +49,17 @@ Ready.
[ 60 ]
[ 80 ]
#DROP FUNCTION pyapi02;
+#CREATE FUNCTION pyapi02(i integer) returns integer
+#language P
+#{
+# return numpy.min(i)
+#};
+#SELECT pyapi02(i) FROM rval;
+% sys.L # table_name
+% pyapi02_i # name
+% int # type
+% 1 # length
+[ 1 ]
#DROP TABLE rval;
#ROLLBACK;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list