v2-0001-Remove-aclitem-from-old-dump.patch
text/x-patch
Filename: v2-0001-Remove-aclitem-from-old-dump.patch
Type: text/x-patch
Part: 0
Patch
Format: unified
Series: patch v2-0001
| File | + | − |
|---|---|---|
| src/bin/pg_upgrade/upgrade_adapt.sql | 58 | 2 |
commit f4a6f18f008ab4acd0d6923ddce7aa6d20bef08f
Author: Anton A. Melnikov <a.melnikov@postgrespro.ru>
Date: Thu Dec 22 07:22:53 2022 +0300
Remove type 'aclitem' from old dump when test upgrade from older versions.
diff --git a/src/bin/pg_upgrade/upgrade_adapt.sql b/src/bin/pg_upgrade/upgrade_adapt.sql
index 27c4c7fd01..84389f3e5b 100644
--- a/src/bin/pg_upgrade/upgrade_adapt.sql
+++ b/src/bin/pg_upgrade/upgrade_adapt.sql
@@ -19,7 +19,8 @@ SELECT
ver <= 906 AS oldpgversion_le96,
ver <= 1000 AS oldpgversion_le10,
ver <= 1100 AS oldpgversion_le11,
- ver <= 1300 AS oldpgversion_le13
+ ver <= 1300 AS oldpgversion_le13,
+ ver <= 1500 AS oldpgversion_le15
FROM (SELECT current_setting('server_version_num')::int / 100 AS ver) AS v;
\gset
@@ -72,7 +73,7 @@ DO $stmt$
FROM pg_class
WHERE relname !~ '^pg_'
AND relhasoids
- AND relkind in ('r','m')
+ AND relkind = 'r'
ORDER BY 1
LOOP
execute 'ALTER TABLE ' || rec || ' SET WITHOUT OIDS';
@@ -89,3 +90,58 @@ DROP OPERATOR public.#%# (pg_catalog.int8, NONE);
DROP OPERATOR public.!=- (pg_catalog.int8, NONE);
DROP OPERATOR public.#@%# (pg_catalog.int8, NONE);
\endif
+
+-- The internal format of "aclitem" changed in PostgreSQL version 16
+-- so replace it with text type in tables and drop materialized views
+-- and indexes that contain column(s) of "aclitem" type.
+\if :oldpgversion_le15
+DO $$
+ DECLARE
+ rec text;
+ col text;
+ BEGIN
+ FOR rec in
+ SELECT oid::regclass::text
+ FROM pg_class
+ WHERE relname !~ '^pg_'
+ AND relkind = 'r'
+ ORDER BY 1
+ LOOP
+ FOR col in
+ SELECT attname
+ FROM pg_attribute
+ WHERE attrelid::regclass::text = rec
+ AND atttypid = 'aclitem'::regtype
+ LOOP
+ execute 'ALTER TABLE ' || rec || ' ALTER COLUMN '
+ || col || ' SET DATA TYPE text';
+ END LOOP;
+ END LOOP;
+ END; $$;
+
+DO $$
+ DECLARE
+ obj text;
+ BEGIN
+ FOR obj in
+ SELECT type || ' ' || name AS obj
+ FROM (SELECT
+ CASE
+ WHEN relkind = 'm' THEN 'MATERIALIZED VIEW'
+ WHEN relkind = 'i' THEN 'INDEX'
+ END AS type,
+ oid::regclass::text AS name
+ FROM pg_class
+ WHERE relname !~ '^pg_'
+ AND relkind in ('m','i')
+ AND EXISTS
+ (SELECT attname
+ FROM pg_attribute
+ WHERE attrelid = oid
+ AND atttypid = 'aclitem'::regtype)
+ ) AS foo
+ LOOP
+ execute 'DROP '|| obj || ' CASCADE';
+ END LOOP;
+ END; $$;
+\endif