
Commit 866566a690bb9916 is insufficient to prevent dump/reload failures when using transform modules in a database with both plpython2 and plpython3 installed. The reason is that the transform extension scripts use DO blocks as a mechanism to pull in the libpython library before creating the transform function. It's necessary to preload the library because the dynamic loader won't do it for us on every platform, leading to "unresolved symbol" failures when the transform library is loaded. But it's *not* necessary to execute Python code, and doing so will provoke a multiple-Pythons-are-loaded error even after the preceding commit. To fix, use LOAD instead of a DO block. That requires superuser privilege, but creation of a C function does anyway. It also embeds knowledge of the underlying library name for each PL language; but that's wired into the initdb-time contents of pg_pltemplate too, so that doesn't seem like a large problem either. Note that CREATE TRANSFORM as such doesn't call the language module at all. Per a report from Paul Jones. Back-patch to 9.5 where transform modules were introduced.
20 lines
636 B
SQL
20 lines
636 B
SQL
-- make sure the prerequisite libraries are loaded
|
|
LOAD 'plpython2';
|
|
SELECT NULL::hstore;
|
|
|
|
|
|
CREATE FUNCTION hstore_to_plpython2(val internal) RETURNS internal
|
|
LANGUAGE C STRICT IMMUTABLE
|
|
AS 'MODULE_PATHNAME', 'hstore_to_plpython';
|
|
|
|
CREATE FUNCTION plpython2_to_hstore(val internal) RETURNS hstore
|
|
LANGUAGE C STRICT IMMUTABLE
|
|
AS 'MODULE_PATHNAME', 'plpython_to_hstore';
|
|
|
|
CREATE TRANSFORM FOR hstore LANGUAGE plpython2u (
|
|
FROM SQL WITH FUNCTION hstore_to_plpython2(internal),
|
|
TO SQL WITH FUNCTION plpython2_to_hstore(internal)
|
|
);
|
|
|
|
COMMENT ON TRANSFORM FOR hstore LANGUAGE plpython2u IS 'transform between hstore and Python dict';
|