Create extension infrastructure for the core procedural languages.

This mostly just involves creating control, install, and
update-from-unpackaged scripts for them.  However, I had to adjust plperl
and plpython to not share the same support functions between variants,
because we can't put the same function into multiple extensions.

catversion bump forced due to new contents of pg_pltemplate, and because
initdb now installs plpgsql as an extension not a bare language.

Add support for regression testing these as extensions not bare
languages.

Fix a couple of other issues that popped up while testing this: my initial
hack at pg_dump binary-upgrade support didn't work right, and we don't want
an extra schema permissions test after all.

Documentation changes still to come, but I'm committing now to see
whether the MSVC build scripts need work (likely they do).
This commit is contained in:
Tom Lane
2011-03-04 21:51:14 -05:00
parent efa415da8c
commit 63b656b7bf
41 changed files with 399 additions and 43 deletions

View File

@ -37,8 +37,13 @@ override CPPFLAGS := -I. -I$(srcdir) $(python_includespec) $(CPPFLAGS)
rpathdir = $(python_libdir)
NAME = plpython$(python_majorversion)
OBJS = plpython.o
DATA = plpythonu.control plpythonu--1.0.sql plpythonu--unpackaged--1.0.sql \
plpython2u.control plpython2u--1.0.sql plpython2u--unpackaged--1.0.sql \
plpython3u.control plpython3u--1.0.sql plpython3u--unpackaged--1.0.sql
# Python on win32 ships with import libraries only for Microsoft Visual C++,
# which are not compatible with mingw gcc. Therefore we need to build a
@ -60,7 +65,7 @@ REGRESS_OPTS = --dbname=$(PL_TESTDB)
# Only load plpythonu with Python 2. The test files themselves load
# the versioned language plpython(2|3)u.
ifeq ($(python_majorversion),2)
REGRESS_OPTS += --load-language=plpythonu
REGRESS_OPTS += --load-extension=plpythonu
endif
REGRESS = \
plpython_schema \
@ -98,18 +103,32 @@ all: all-lib
distprep: spiexceptions.h
install: all installdirs install-lib
install: all installdirs install-lib install-data
ifeq ($(python_majorversion),2)
cd '$(DESTDIR)$(pkglibdir)' && rm -f plpython$(DLSUFFIX) && $(LN_S) $(shlib) plpython$(DLSUFFIX)
endif
installdirs: installdirs-lib
$(MKDIR_P) '$(DESTDIR)$(datadir)/extension'
uninstall: uninstall-lib
uninstall: uninstall-lib uninstall-data
ifeq ($(python_majorversion),2)
rm -f '$(DESTDIR)$(pkglibdir)/plpython$(DLSUFFIX)'
endif
install-data:
@for file in $(addprefix $(srcdir)/, $(DATA)); do \
echo "$(INSTALL_DATA) $$file '$(DESTDIR)$(datadir)/extension'"; \
$(INSTALL_DATA) $$file '$(DESTDIR)$(datadir)/extension'; \
done
uninstall-data:
rm -f $(addprefix '$(DESTDIR)$(datadir)/extension'/, $(notdir $(DATA)))
.PHONY: install-data uninstall-data
ifeq ($(python_majorversion),3)
# Adjust regression tests for Python 3 compatibility
prep3:
@ -124,6 +143,8 @@ prep3:
-e "s/def next/def __next__/g" \
-e "s/LANGUAGE plpythonu/LANGUAGE plpython3u/g" \
-e "s/LANGUAGE plpython2u/LANGUAGE plpython3u/g" \
-e "s/EXTENSION plpythonu/EXTENSION plpython3u/g" \
-e "s/EXTENSION plpython2u/EXTENSION plpython3u/g" \
$$file >`echo $$file | sed 's,$(srcdir),python3,'`; \
done

View File

@ -2,4 +2,5 @@
-- For paranoia's sake, don't leave an untrusted language sitting around
--
SET client_min_messages = WARNING;
DROP PROCEDURAL LANGUAGE plpythonu CASCADE;
DROP EXTENSION plpythonu CASCADE;
DROP EXTENSION IF EXISTS plpython2u CASCADE;

View File

@ -1,5 +1,5 @@
-- first some tests of basic functionality
CREATE LANGUAGE plpython2u;
CREATE EXTENSION plpython2u;
-- really stupid function just to get the module loaded
CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu;
select stupid();

View File

@ -4652,3 +4652,36 @@ PLyUnicode_FromString(const char *s)
}
#endif /* PY_MAJOR_VERSION >= 3 */
#if PY_MAJOR_VERSION < 3
/* Define aliases plpython2_call_handler etc */
Datum plpython2_call_handler(PG_FUNCTION_ARGS);
Datum plpython2_inline_handler(PG_FUNCTION_ARGS);
Datum plpython2_validator(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(plpython2_call_handler);
Datum
plpython2_call_handler(PG_FUNCTION_ARGS)
{
return plpython_call_handler(fcinfo);
}
PG_FUNCTION_INFO_V1(plpython2_inline_handler);
Datum
plpython2_inline_handler(PG_FUNCTION_ARGS)
{
return plpython_inline_handler(fcinfo);
}
PG_FUNCTION_INFO_V1(plpython2_validator);
Datum
plpython2_validator(PG_FUNCTION_ARGS)
{
return plpython_validator(fcinfo);
}
#endif /* PY_MAJOR_VERSION < 3 */

View File

@ -0,0 +1,9 @@
/* src/pl/plpython/plpython2u--1.0.sql */
/*
* Currently, all the interesting stuff is done by CREATE LANGUAGE.
* Later we will probably "dumb down" that command and put more of the
* knowledge into this script.
*/
CREATE PROCEDURAL LANGUAGE plpython2u;

View File

@ -0,0 +1,7 @@
/* src/pl/plpython/plpython2u--unpackaged--1.0.sql */
ALTER EXTENSION plpython2u ADD PROCEDURAL LANGUAGE plpython2u;
-- ALTER ADD LANGUAGE doesn't pick up the support functions, so we have to.
ALTER EXTENSION plpython2u ADD FUNCTION plpython2_call_handler();
ALTER EXTENSION plpython2u ADD FUNCTION plpython2_inline_handler(internal);
ALTER EXTENSION plpython2u ADD FUNCTION plpython2_validator(oid);

View File

@ -0,0 +1,7 @@
# plpython2u extension
comment = 'PL/Python2U untrusted procedural language'
default_version = '1.0'
module_pathname = '$libdir/plpython2'
relocatable = false
schema = pg_catalog
superuser = true

View File

@ -0,0 +1,9 @@
/* src/pl/plpython/plpython3u--1.0.sql */
/*
* Currently, all the interesting stuff is done by CREATE LANGUAGE.
* Later we will probably "dumb down" that command and put more of the
* knowledge into this script.
*/
CREATE PROCEDURAL LANGUAGE plpython3u;

View File

@ -0,0 +1,7 @@
/* src/pl/plpython/plpython3u--unpackaged--1.0.sql */
ALTER EXTENSION plpython3u ADD PROCEDURAL LANGUAGE plpython3u;
-- ALTER ADD LANGUAGE doesn't pick up the support functions, so we have to.
ALTER EXTENSION plpython3u ADD FUNCTION plpython3_call_handler();
ALTER EXTENSION plpython3u ADD FUNCTION plpython3_inline_handler(internal);
ALTER EXTENSION plpython3u ADD FUNCTION plpython3_validator(oid);

View File

@ -0,0 +1,7 @@
# plpython3u extension
comment = 'PL/Python3U untrusted procedural language'
default_version = '1.0'
module_pathname = '$libdir/plpython3'
relocatable = false
schema = pg_catalog
superuser = true

View File

@ -0,0 +1,9 @@
/* src/pl/plpython/plpythonu--1.0.sql */
/*
* Currently, all the interesting stuff is done by CREATE LANGUAGE.
* Later we will probably "dumb down" that command and put more of the
* knowledge into this script.
*/
CREATE PROCEDURAL LANGUAGE plpythonu;

View File

@ -0,0 +1,7 @@
/* src/pl/plpython/plpythonu--unpackaged--1.0.sql */
ALTER EXTENSION plpythonu ADD PROCEDURAL LANGUAGE plpythonu;
-- ALTER ADD LANGUAGE doesn't pick up the support functions, so we have to.
ALTER EXTENSION plpythonu ADD FUNCTION plpython_call_handler();
ALTER EXTENSION plpythonu ADD FUNCTION plpython_inline_handler(internal);
ALTER EXTENSION plpythonu ADD FUNCTION plpython_validator(oid);

View File

@ -0,0 +1,7 @@
# plpythonu extension
comment = 'PL/PythonU untrusted procedural language'
default_version = '1.0'
module_pathname = '$libdir/plpython2'
relocatable = false
schema = pg_catalog
superuser = true

View File

@ -3,4 +3,6 @@
--
SET client_min_messages = WARNING;
DROP PROCEDURAL LANGUAGE plpythonu CASCADE;
DROP EXTENSION plpythonu CASCADE;
DROP EXTENSION IF EXISTS plpython2u CASCADE;

View File

@ -1,5 +1,5 @@
-- first some tests of basic functionality
CREATE LANGUAGE plpython2u;
CREATE EXTENSION plpython2u;
-- really stupid function just to get the module loaded
CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu;