aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2022-12-26 08:00:55 +0900
committerMichael Paquier <michael@paquier.xyz>2022-12-26 08:00:55 +0900
commitd3c0cc4447307a2ffbcff8274573b544294e583c (patch)
tree24684202f39d455f7741a74ceeaa52ff8b174de4
parent442e25d2485b1ecf3357725acee995a1c349163d (diff)
downloadpostgresql-d3c0cc4447307a2ffbcff8274573b544294e583c.tar.gz
postgresql-d3c0cc4447307a2ffbcff8274573b544294e583c.zip
Switch query fixing aclitems in ~15 from O(N^2) to O(N) in upgrade_adapt.sql
f4f2f2b was doing a sequential scan of pg_class before checking if a relation had attributes dependent on aclitem as data typewhen building the set of ALTER TABLE queries, but it would be costly on a regression database. While on it, make the query style more consistent with the rest. Reported-by: Justin Pryzby Discussion: https://postgr.es/m/20221223032724.GQ1153@telsasoft.com
-rw-r--r--src/bin/pg_upgrade/upgrade_adapt.sql26
1 files changed, 11 insertions, 15 deletions
diff --git a/src/bin/pg_upgrade/upgrade_adapt.sql b/src/bin/pg_upgrade/upgrade_adapt.sql
index 54920f54f51..a368a51ff5e 100644
--- a/src/bin/pg_upgrade/upgrade_adapt.sql
+++ b/src/bin/pg_upgrade/upgrade_adapt.sql
@@ -95,25 +95,21 @@ DROP OPERATOR public.#@%# (pg_catalog.int8, NONE);
-- The internal format of "aclitem" has changed in 16, so replace it with
-- text type in tables.
\if :oldpgversion_le15
-DO $$
+DO $stmt$
DECLARE
- rec text;
- col text;
+ rec record;
BEGIN
FOR rec in
- SELECT oid::regclass::text
- FROM pg_class
- WHERE relname !~ '^pg_'
- AND relkind IN ('r')
+ SELECT oid::regclass::text as rel, attname as col
+ FROM pg_class c, pg_attribute a
+ WHERE c.relname !~ '^pg_'
+ AND c.relkind IN ('r')
+ AND a.attrelid = c.oid
+ AND a.atttypid = 'aclitem'::regtype
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 ' || quote_ident(rec) || ' ALTER COLUMN ' ||
- quote_ident(col) || ' SET DATA TYPE text';
- END LOOP;
+ EXECUTE 'ALTER TABLE ' || quote_ident(rec.rel) || ' ALTER COLUMN ' ||
+ quote_ident(rec.col) || ' SET DATA TYPE text';
END LOOP;
- END; $$;
+ END; $stmt$;
\endif