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
