-<!-- $PostgreSQL: pgsql/doc/src/sgml/plpython.sgml,v 1.50 2010/07/06 21:37:31 petere Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/plpython.sgml,v 1.51 2010/07/08 18:42:12 petere Exp $ -->
<chapter id="plpython">
<title>PL/Python - Python Procedural Language</title>
</para>
<para>
- 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.
</para>
</sect1>
/**********************************************************************
* 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 $
*
*********************************************************************
*/
#endif
+static const int plpython_python_version = PY_MAJOR_VERSION;
+
/*
* _PG_init() - library load-time initialization
*
{
/* 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;