aboutsummaryrefslogtreecommitdiff
path: root/src/pl/plpython/plpython.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2009-09-13 22:07:06 +0000
committerPeter Eisentraut <peter_e@gmx.net>2009-09-13 22:07:06 +0000
commiteb62398f391eedee7953becb410bf3ae86b9872b (patch)
tree4771b5163f5b0543bba85a009950511add1e344c /src/pl/plpython/plpython.c
parent6689ce3e6aba88682b9e7e276daa3c4c58e7df24 (diff)
downloadpostgresql-eb62398f391eedee7953becb410bf3ae86b9872b.tar.gz
postgresql-eb62398f391eedee7953becb410bf3ae86b9872b.zip
Fix Unicode support in PL/Python
Check calls of PyUnicode_AsEncodedString() for NULL return, probably because the encoding name is not known. Add special treatment for SQL_ASCII, which Python definitely does not know. Since using SQL_ASCII produces errors in the regression tests when non-ASCII characters are involved, we have to put back various regression test result variants.
Diffstat (limited to 'src/pl/plpython/plpython.c')
-rw-r--r--src/pl/plpython/plpython.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index ae898385b56..c37993829f1 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.129 2009/09/12 22:13:12 petere Exp $
+ * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.130 2009/09/13 22:07:06 petere Exp $
*
*********************************************************************
*/
@@ -3343,11 +3343,21 @@ PLy_free(void *ptr)
static PyObject*
PLyUnicode_Str(PyObject *unicode)
{
+ PyObject *rv;
+ const char *serverenc;
+
/*
- * This assumes that the PostgreSQL encoding names are acceptable
- * to Python, but that appears to be the case.
+ * Python understands almost all PostgreSQL encoding names, but it
+ * doesn't know SQL_ASCII.
*/
- return PyUnicode_AsEncodedString(unicode, GetDatabaseEncodingName(), "strict");
+ if (GetDatabaseEncoding() == PG_SQL_ASCII)
+ serverenc = "ascii";
+ else
+ serverenc = GetDatabaseEncodingName();
+ rv = PyUnicode_AsEncodedString(unicode, serverenc, "strict");
+ if (rv == NULL)
+ PLy_elog(ERROR, "could not convert Python Unicode object to PostgreSQL server encoding");
+ return rv;
}
/*