Skip to content

Commit 8d48e6a

Browse files
committed
Improve the check for pg_catalog.line data type in pg_upgrade
The pg_upgrade check for pg_catalog.line data type when upgrading from 9.3 had a couple of issues with domains and composite types. Firstly, it triggered false positives for composite types unused in objects with storage. This was enough to trigger an unnecessary pg_upgrade failure: CREATE TYPE line_composite AS (l pg_catalog.line) On the other hand, this only happened with composite types directly on the pg_catalog.line data type, but not with a domain. So this was not detected CREATE DOMAIN line_domain AS pg_catalog.line; CREATE TYPE line_composite_2 AS (l line_domain); unlike the first example. These false positives and inconsistencies are unfortunate, but what's worse we've failed to detected objects using the pg_catalog.line data type through a domain. So we missed cases like this CREATE TABLE t (l line_composite_2); The consequence is clusters broken after a pg_upgrade. This fixes these false positives and false negatives by using the same recursive CTE introduced by eaf900e for sql_identifier. 9.3 did not support domains on composite types, but we can still have multi-level composite types. Backpatch all the way to 9.4, where the format for pg_catalog.line data type changed. Author: Tomas Vondra Backpatch-to: 9.4- Discussion: https://postgr.es/m/16045-673e8fa6b5ace196%40postgresql.org
1 parent ae5cae5 commit 8d48e6a

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

src/bin/pg_upgrade/version.c

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,42 @@ old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
131131
DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
132132
PGconn *conn = connectToServer(cluster, active_db->db_name);
133133

134+
/*
135+
* The pg_catalog.line type may be wrapped in a domain or composite
136+
* type, or both (9.3 did not allow domains on composite types, but
137+
* there may be multi-level composite type). To detect these cases
138+
* we need a recursive CTE.
139+
*/
134140
res = executeQueryOrDie(conn,
141+
"WITH RECURSIVE oids AS ( "
142+
/* the pg_catalog.line type itself */
143+
" SELECT 'pg_catalog.line'::pg_catalog.regtype AS oid "
144+
" UNION ALL "
145+
" SELECT * FROM ( "
146+
/* domains on the type */
147+
" WITH x AS (SELECT oid FROM oids) "
148+
" SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' "
149+
" UNION "
150+
/* composite types containing the type */
151+
" SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x "
152+
" WHERE t.typtype = 'c' AND "
153+
" t.oid = c.reltype AND "
154+
" c.oid = a.attrelid AND "
155+
" NOT a.attisdropped AND "
156+
" a.atttypid = x.oid "
157+
" ) foo "
158+
") "
135159
"SELECT n.nspname, c.relname, a.attname "
136160
"FROM pg_catalog.pg_class c, "
137161
" pg_catalog.pg_namespace n, "
138162
" pg_catalog.pg_attribute a "
139163
"WHERE c.oid = a.attrelid AND "
140164
" NOT a.attisdropped AND "
141-
" a.atttypid = 'pg_catalog.line'::pg_catalog.regtype AND "
165+
" a.atttypid IN (SELECT oid FROM oids) AND "
166+
" c.relkind IN ("
167+
CppAsString2(RELKIND_RELATION) ", "
168+
CppAsString2(RELKIND_MATVIEW) ", "
169+
CppAsString2(RELKIND_INDEX) ") AND "
142170
" c.relnamespace = n.oid AND "
143171
/* exclude possible orphaned temp tables */
144172
" n.nspname !~ '^pg_temp_' AND "

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy