summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-11-21 21:51:05 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-11-21 21:51:05 +0000
commitc714e5cba7ae76e9f4c7fbeedb6dcb4f203e708b (patch)
tree779f3f0b3f6f56701479d88bc8fcbd6c1de5455f
parenta48e92ea1d3420b0893b7996be2d89c15344628d (diff)
downloadpostgresql-c714e5cba7ae76e9f4c7fbeedb6dcb4f203e708b.tar.gz
Fix plpython to work (or at least pass its regression tests) with
python 2.5. This involves fixing several violations of the published spec for creating PyTypeObjects, and adding another regression test expected output for yet another variation of error message spelling.
-rw-r--r--src/pl/plpython/expected/plpython_error_3.out38
-rw-r--r--src/pl/plpython/plpython.c16
2 files changed, 48 insertions, 6 deletions
diff --git a/src/pl/plpython/expected/plpython_error_3.out b/src/pl/plpython/expected/plpython_error_3.out
new file mode 100644
index 0000000000..3cde9bf6ac
--- /dev/null
+++ b/src/pl/plpython/expected/plpython_error_3.out
@@ -0,0 +1,38 @@
+-- test error handling, i forgot to restore Warn_restart in
+-- the trigger handler once. the errors and subsequent core dump were
+-- interesting.
+SELECT invalid_type_uncaught('rick');
+WARNING: plpython: in function invalid_type_uncaught:
+DETAIL: <class 'plpy.SPIError'>: Unknown error in PLy_spi_prepare
+ERROR: type "test" does not exist
+SELECT invalid_type_caught('rick');
+WARNING: plpython: in function invalid_type_caught:
+DETAIL: <class 'plpy.SPIError'>: Unknown error in PLy_spi_prepare
+ERROR: type "test" does not exist
+SELECT invalid_type_reraised('rick');
+WARNING: plpython: in function invalid_type_reraised:
+DETAIL: <class 'plpy.SPIError'>: Unknown error in PLy_spi_prepare
+ERROR: type "test" does not exist
+SELECT valid_type('rick');
+ valid_type
+------------
+
+(1 row)
+
+--
+-- Test Unicode error handling.
+--
+SELECT unicode_return_error();
+ERROR: plpython: function "unicode_return_error" could not create return value
+DETAIL: <type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
+INSERT INTO unicode_test (testvalue) VALUES ('test');
+ERROR: plpython: function "unicode_trigger_error" could not modify tuple
+DETAIL: <type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
+SELECT unicode_plan_error1();
+WARNING: plpython: in function unicode_plan_error1:
+DETAIL: <class 'plpy.Error'>: Unknown error in PLy_spi_execute_plan
+ERROR: plpython: function "unicode_plan_error1" could not execute plan
+DETAIL: <type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
+SELECT unicode_plan_error2();
+ERROR: plpython: function "unicode_plan_error2" could not execute plan
+DETAIL: <type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index 6445837ac9..06313aceb6 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -1,7 +1,7 @@
/**********************************************************************
* plpython.c - python as a procedural language for PostgreSQL
*
- * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.89 2006/10/04 00:30:14 momjian Exp $
+ * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.90 2006/11/21 21:51:05 tgl Exp $
*
*********************************************************************
*/
@@ -1981,7 +1981,7 @@ static PyTypeObject PLy_PlanType = {
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- 0, /* tp_xxx4 */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
PLy_plan_doc, /* tp_doc */
};
@@ -2026,7 +2026,7 @@ static PyTypeObject PLy_ResultType = {
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- 0, /* tp_xxx4 */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
PLy_result_doc, /* tp_doc */
};
@@ -2098,7 +2098,7 @@ PLy_plan_dealloc(PyObject * arg)
PLy_free(ob->args);
}
- PyMem_DEL(arg);
+ arg->ob_type->tp_free(arg);
}
@@ -2152,7 +2152,7 @@ PLy_result_dealloc(PyObject * arg)
Py_XDECREF(ob->rows);
Py_XDECREF(ob->status);
- PyMem_DEL(ob);
+ arg->ob_type->tp_free(arg);
}
static PyObject *
@@ -2701,7 +2701,11 @@ PLy_init_plpy(void)
/*
* initialize plpy module
*/
- PLy_PlanType.ob_type = PLy_ResultType.ob_type = &PyType_Type;
+ if (PyType_Ready(&PLy_PlanType) < 0)
+ elog(ERROR, "could not init PLy_PlanType");
+ if (PyType_Ready(&PLy_ResultType) < 0)
+ elog(ERROR, "could not init PLy_ResultType");
+
plpy = Py_InitModule("plpy", PLy_methods);
plpy_dict = PyModule_GetDict(plpy);