57 lines
2.1 KiB
Plaintext
57 lines
2.1 KiB
Plaintext
VACUUM;
|
|
--
|
|
-- Sanity check: every system catalog that has OIDs should have
|
|
-- a unique index on OID. This ensures that the OIDs will be unique,
|
|
-- even after the OID counter wraps around.
|
|
-- We exclude non-system tables from the check by looking at nspname.
|
|
--
|
|
SELECT relname, nspname
|
|
FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace JOIN pg_attribute a ON (attrelid = c.oid AND attname = 'oid')
|
|
WHERE relkind = 'r' and c.oid < 16384
|
|
AND ((nspname ~ '^pg_') IS NOT FALSE)
|
|
AND NOT EXISTS (SELECT 1 FROM pg_index i WHERE indrelid = c.oid
|
|
AND indkey[0] = a.attnum AND indnatts = 1
|
|
AND indisunique AND indimmediate);
|
|
relname | nspname
|
|
---------+---------
|
|
(0 rows)
|
|
|
|
-- check that relations without storage don't have relfilenode
|
|
SELECT relname, relkind
|
|
FROM pg_class
|
|
WHERE relkind IN ('v', 'c', 'f', 'p', 'I')
|
|
AND relfilenode <> 0;
|
|
relname | relkind
|
|
---------+---------
|
|
(0 rows)
|
|
|
|
--
|
|
-- When ALIGNOF_DOUBLE==4 (e.g. AIX), the C ABI may impose 8-byte alignment on
|
|
-- some of the C types that correspond to TYPALIGN_DOUBLE SQL types. To ensure
|
|
-- catalog C struct layout matches catalog tuple layout, arrange for the tuple
|
|
-- offset of each fixed-width, attalign='d' catalog column to be divisible by 8
|
|
-- unconditionally. Keep such columns before the first NameData column of the
|
|
-- catalog, since packagers can override NAMEDATALEN to an odd number.
|
|
--
|
|
WITH check_columns AS (
|
|
SELECT relname, attname,
|
|
array(
|
|
SELECT t.oid
|
|
FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid
|
|
WHERE pa.attrelid = a.attrelid AND
|
|
pa.attnum > 0 AND pa.attnum < a.attnum
|
|
ORDER BY pa.attnum) AS coltypes
|
|
FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid
|
|
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
WHERE attalign = 'd' AND relkind = 'r' AND
|
|
attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog'
|
|
)
|
|
SELECT relname, attname, coltypes, get_columns_length(coltypes)
|
|
FROM check_columns
|
|
WHERE get_columns_length(coltypes) % 8 != 0 OR
|
|
'name'::regtype::oid = ANY(coltypes);
|
|
relname | attname | coltypes | get_columns_length
|
|
---------+---------+----------+--------------------
|
|
(0 rows)
|
|
|