From 803716013dc1350f8cd97fdfca4bdffc9a52021c Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 8 Jul 2010 18:42:12 +0000 Subject: [PATCH] Install safeguard against running PL/Python 2 and 3 in the same session --- doc/src/sgml/plpython.sgml | 15 ++++++++------- src/pl/plpython/plpython.c | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml index 3f924e6cbf..c76012db40 100644 --- a/doc/src/sgml/plpython.sgml +++ b/doc/src/sgml/plpython.sgml @@ -1,4 +1,4 @@ - + PL/Python - Python Procedural Language @@ -154,12 +154,13 @@ - On most (possibly all) platforms, it is not possible to use - PL/Python based on Python 2 and PL/Python based on Python 3 in the - same session, because the symbols in the dynamic modules will - clash, which will result in crashes of the PostgreSQL server - process. It is possible, however, to use both PL/Python variants - in the same database, from separate sessions. + It is not allowed to use PL/Python based on Python 2 and PL/Python + based on Python 3 in the same session, because the symbols in the + dynamic modules would clash, which could result in crashes of the + PostgreSQL server process. There is a check that prevents mixing + Python major versions in a session, which will abort the session if + a mismatch is detected. It is possible, however, to use both + PL/Python variants in the same database, from separate sessions. diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c index d63ba4a40c..4a71b8bf53 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.146 2010/07/06 19:19:01 momjian Exp $ + * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.147 2010/07/08 18:42:12 petere Exp $ * ********************************************************************* */ @@ -3206,6 +3206,8 @@ PyInit_plpy(void) #endif +static const int plpython_python_version = PY_MAJOR_VERSION; + /* * _PG_init() - library load-time initialization * @@ -3216,6 +3218,21 @@ _PG_init(void) { /* Be sure we do initialization only once (should be redundant now) */ static bool inited = false; + const int **version_ptr; + + /* Be sure we don't run Python 2 and 3 in the same session (might crash) */ + version_ptr = (const int **) find_rendezvous_variable("plpython_python_version"); + if (!(*version_ptr)) + *version_ptr = &plpython_python_version; + else + { + if (**version_ptr != plpython_python_version) + ereport(FATAL, + (errmsg("Python major version mismatch in session"), + errdetail("This session has previously used Python major version %d, and it is now attempting to use Python major version %d.", + **version_ptr, plpython_python_version), + errhint("Start a new session to use a different Python major version."))); + } if (inited) return;