From 73f5b8b05fe43044f2207ab22a88f6ba83aac758 Mon Sep 17 00:00:00 2001 From: Jason Petersen Date: Fri, 21 Oct 2016 11:56:03 -0600 Subject: [PATCH] Move all funcs to pg_catalog, add test to verify We'd been relying on a single SET search_path command in an earlier script, but a subsequent script RESET search_path, causing any further bare functions to be created in the first schema on the search path. However, starting with an older extension version and executing ALTER scripts one at a time DOES avoid putting any functions in the public namespace, so I wrote an upgrade script resilient to that, especially because PostgreSQL 9.5 will error out if a function is already in the schema it's being moved to. --- src/backend/distributed/Makefile | 4 ++- .../distributed/citus--6.0-13--6.0-14.sql | 25 ++++++++++++++++ src/backend/distributed/citus.control | 2 +- src/test/regress/expected/multi_extension.out | 29 +++++++++++++++++++ src/test/regress/sql/multi_extension.sql | 20 +++++++++++++ 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 src/backend/distributed/citus--6.0-13--6.0-14.sql diff --git a/src/backend/distributed/Makefile b/src/backend/distributed/Makefile index 9a2faf718..ecd86bc48 100644 --- a/src/backend/distributed/Makefile +++ b/src/backend/distributed/Makefile @@ -8,7 +8,7 @@ EXTENSION = citus EXTVERSIONS = 5.0 5.0-1 5.0-2 \ 5.1-1 5.1-2 5.1-3 5.1-4 5.1-5 5.1-6 5.1-7 5.1-8 \ 5.2-1 5.2-2 5.2-3 5.2-4 \ - 6.0-1 6.0-2 6.0-3 6.0-4 6.0-5 6.0-6 6.0-7 6.0-8 6.0-9 6.0-10 6.0-11 6.0-12 6.0-13 + 6.0-1 6.0-2 6.0-3 6.0-4 6.0-5 6.0-6 6.0-7 6.0-8 6.0-9 6.0-10 6.0-11 6.0-12 6.0-13 6.0-14 # All citus--*.sql files in the source directory DATA = $(patsubst $(citus_abs_srcdir)/%.sql,%.sql,$(wildcard $(citus_abs_srcdir)/$(EXTENSION)--*--*.sql)) @@ -84,6 +84,8 @@ $(EXTENSION)--6.0-12.sql: $(EXTENSION)--6.0-11.sql $(EXTENSION)--6.0-11--6.0-12. cat $^ > $@ $(EXTENSION)--6.0-13.sql: $(EXTENSION)--6.0-12.sql $(EXTENSION)--6.0-12--6.0-13.sql cat $^ > $@ +$(EXTENSION)--6.0-14.sql: $(EXTENSION)--6.0-13.sql $(EXTENSION)--6.0-13--6.0-14.sql + cat $^ > $@ NO_PGXS = 1 diff --git a/src/backend/distributed/citus--6.0-13--6.0-14.sql b/src/backend/distributed/citus--6.0-13--6.0-14.sql new file mode 100644 index 000000000..f618697d6 --- /dev/null +++ b/src/backend/distributed/citus--6.0-13--6.0-14.sql @@ -0,0 +1,25 @@ +/* citus--6.0-13--6.0-14.sql */ + +DO $ff$ +BEGIN + -- fix functions created in wrong namespace + ALTER FUNCTION public.recover_prepared_transactions() + SET SCHEMA pg_catalog; + + ALTER FUNCTION public.column_name_to_column(table_name regclass, column_name text) + SET SCHEMA pg_catalog; + + ALTER FUNCTION public.worker_drop_distributed_table(logicalrelid Oid) + SET SCHEMA pg_catalog; + + ALTER FUNCTION public.master_get_new_placementid() + SET SCHEMA pg_catalog; + + ALTER FUNCTION public.master_expire_table_cache(table_name regclass) + SET SCHEMA pg_catalog; + +-- some installations don't need this corrective, so just skip... +EXCEPTION WHEN undefined_function THEN + -- do nothing +END +$ff$; diff --git a/src/backend/distributed/citus.control b/src/backend/distributed/citus.control index 57bd51363..c2ea5fe3c 100644 --- a/src/backend/distributed/citus.control +++ b/src/backend/distributed/citus.control @@ -1,6 +1,6 @@ # Citus extension comment = 'Citus distributed database' -default_version = '6.0-13' +default_version = '6.0-14' module_pathname = '$libdir/citus' relocatable = false schema = pg_catalog diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index b28a3adb5..8d09e1011 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -7,6 +7,20 @@ -- not done yet. ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 580000; ALTER SEQUENCE pg_catalog.pg_dist_jobid_seq RESTART 580000; +-- ensure no objects were created outside pg_catalog +SELECT COUNT(*) +FROM pg_depend AS pgd, + pg_extension AS pge, + LATERAL pg_identify_object(pgd.classid, pgd.objid, pgd.objsubid) AS pgio +WHERE pgd.refclassid = 'pg_extension'::regclass AND + pgd.refobjid = pge.oid AND + pge.extname = 'citus' AND + pgio.schema NOT IN ('pg_catalog', 'citus'); + count +------- + 0 +(1 row) + -- DROP EXTENSION pre-created by the regression suite DROP EXTENSION citus; \c @@ -39,6 +53,21 @@ ALTER EXTENSION citus UPDATE TO '6.0-10'; ALTER EXTENSION citus UPDATE TO '6.0-11'; ALTER EXTENSION citus UPDATE TO '6.0-12'; ALTER EXTENSION citus UPDATE TO '6.0-13'; +ALTER EXTENSION citus UPDATE TO '6.0-14'; +-- ensure no objects were created outside pg_catalog +SELECT COUNT(*) +FROM pg_depend AS pgd, + pg_extension AS pge, + LATERAL pg_identify_object(pgd.classid, pgd.objid, pgd.objsubid) AS pgio +WHERE pgd.refclassid = 'pg_extension'::regclass AND + pgd.refobjid = pge.oid AND + pge.extname = 'citus' AND + pgio.schema NOT IN ('pg_catalog', 'citus'); + count +------- + 0 +(1 row) + -- drop extension an re-create in newest version DROP EXTENSION citus; \c diff --git a/src/test/regress/sql/multi_extension.sql b/src/test/regress/sql/multi_extension.sql index 140854716..fd4309f8d 100644 --- a/src/test/regress/sql/multi_extension.sql +++ b/src/test/regress/sql/multi_extension.sql @@ -10,6 +10,15 @@ ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 580000; ALTER SEQUENCE pg_catalog.pg_dist_jobid_seq RESTART 580000; +-- ensure no objects were created outside pg_catalog +SELECT COUNT(*) +FROM pg_depend AS pgd, + pg_extension AS pge, + LATERAL pg_identify_object(pgd.classid, pgd.objid, pgd.objsubid) AS pgio +WHERE pgd.refclassid = 'pg_extension'::regclass AND + pgd.refobjid = pge.oid AND + pge.extname = 'citus' AND + pgio.schema NOT IN ('pg_catalog', 'citus'); -- DROP EXTENSION pre-created by the regression suite DROP EXTENSION citus; @@ -44,6 +53,17 @@ ALTER EXTENSION citus UPDATE TO '6.0-10'; ALTER EXTENSION citus UPDATE TO '6.0-11'; ALTER EXTENSION citus UPDATE TO '6.0-12'; ALTER EXTENSION citus UPDATE TO '6.0-13'; +ALTER EXTENSION citus UPDATE TO '6.0-14'; + +-- ensure no objects were created outside pg_catalog +SELECT COUNT(*) +FROM pg_depend AS pgd, + pg_extension AS pge, + LATERAL pg_identify_object(pgd.classid, pgd.objid, pgd.objsubid) AS pgio +WHERE pgd.refclassid = 'pg_extension'::regclass AND + pgd.refobjid = pge.oid AND + pge.extname = 'citus' AND + pgio.schema NOT IN ('pg_catalog', 'citus'); -- drop extension an re-create in newest version DROP EXTENSION citus;