Hi, I was playing around with splitting up the tablespace test in regress so that I could use the tablespaces it creates in another test and happened to notice that the pg_class validity checks in type_sanity.sql are incomplete.
It seems that 8b08f7d4820fd did not update the pg_class tests in type_sanity to include partitioned indexes and tables. patch attached. I only changed these few lines in type_sanity to be more correct; I didn't change anything else in regress to actually exercise them (e.g. ensuring a partitioned table is around when running type_sanity). It might be worth moving type_sanity down in the parallel schedule? It does seem a bit hard to remember to update these tests in type_sanity.sql when adding some new value for a pg_class field. I wonder if there is a better way of testing this. - Melanie
From 1531cdf257af92d31836e50e1a0b865131f1a018 Mon Sep 17 00:00:00 2001 From: Melanie Plageman <melanieplage...@gmail.com> Date: Wed, 18 Jan 2023 14:26:36 -0500 Subject: [PATCH v1] Update pg_class validity test Partitioned tables and indexes were not considered in the pg_class validity checks in type_sanity.sql. This is not currently exercised because all partitioned tables and indexes have been dropped by the time type_sanity is run. --- src/test/regress/expected/type_sanity.out | 44 ++++++++++++----------- src/test/regress/sql/type_sanity.sql | 36 ++++++++++--------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out index a640cfc476..95435e3de6 100644 --- a/src/test/regress/expected/type_sanity.out +++ b/src/test/regress/expected/type_sanity.out @@ -498,34 +498,36 @@ ORDER BY 1; -- **************** pg_class **************** -- Look for illegal values in pg_class fields -SELECT c1.oid, c1.relname -FROM pg_class as c1 -WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR +SELECT oid, relname, relkind, relpersistence, relreplident +FROM pg_class +WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p', 'I') OR relpersistence NOT IN ('p', 'u', 't') OR relreplident NOT IN ('d', 'n', 'f', 'i'); - oid | relname ------+--------- + oid | relname | relkind | relpersistence | relreplident +-----+---------+---------+----------------+-------------- (0 rows) --- All tables and indexes should have an access method. -SELECT c1.oid, c1.relname -FROM pg_class as c1 -WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c') and - c1.relam = 0; - oid | relname ------+--------- +-- All tables and indexes except partitioned tables should have an access +-- method. +SELECT oid, relname, relkind, relam +FROM pg_class +WHERE relkind NOT IN ('S', 'v', 'f', 'c', 'p') and + relam = 0; + oid | relname | relkind | relam +-----+---------+---------+------- (0 rows) --- Conversely, sequences, views, types shouldn't have them -SELECT c1.oid, c1.relname -FROM pg_class as c1 -WHERE c1.relkind IN ('S', 'v', 'f', 'c') and - c1.relam != 0; - oid | relname ------+--------- +-- Conversely, sequences, views, types, and partitioned tables shouldn't have +-- them +SELECT oid, relname, relkind, relam +FROM pg_class +WHERE relkind IN ('S', 'v', 'f', 'c', 'p') and + relam != 0; + oid | relname | relkind | relam +-----+---------+---------+------- (0 rows) --- Indexes should have AMs of type 'i' +-- Indexes and partitioned indexes should have AMs of type 'i' SELECT pc.oid, pc.relname, pa.amname, pa.amtype FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) WHERE pc.relkind IN ('i') and @@ -534,7 +536,7 @@ WHERE pc.relkind IN ('i') and -----+---------+--------+-------- (0 rows) --- Tables, matviews etc should have AMs of type 't' +-- Tables, matviews etc should have AMs of type 't' (except partitioned tables) SELECT pc.oid, pc.relname, pa.amname, pa.amtype FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) WHERE pc.relkind IN ('r', 't', 'm') and diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql index 79ec410a6c..22a2dba94d 100644 --- a/src/test/regress/sql/type_sanity.sql +++ b/src/test/regress/sql/type_sanity.sql @@ -358,31 +358,33 @@ ORDER BY 1; -- Look for illegal values in pg_class fields -SELECT c1.oid, c1.relname -FROM pg_class as c1 -WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR +SELECT oid, relname, relkind, relpersistence, relreplident +FROM pg_class +WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p', 'I') OR relpersistence NOT IN ('p', 'u', 't') OR relreplident NOT IN ('d', 'n', 'f', 'i'); --- All tables and indexes should have an access method. -SELECT c1.oid, c1.relname -FROM pg_class as c1 -WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c') and - c1.relam = 0; - --- Conversely, sequences, views, types shouldn't have them -SELECT c1.oid, c1.relname -FROM pg_class as c1 -WHERE c1.relkind IN ('S', 'v', 'f', 'c') and - c1.relam != 0; - --- Indexes should have AMs of type 'i' +-- All tables and indexes except partitioned tables should have an access +-- method. +SELECT oid, relname, relkind, relam +FROM pg_class +WHERE relkind NOT IN ('S', 'v', 'f', 'c', 'p') and + relam = 0; + +-- Conversely, sequences, views, types, and partitioned tables shouldn't have +-- them +SELECT oid, relname, relkind, relam +FROM pg_class +WHERE relkind IN ('S', 'v', 'f', 'c', 'p') and + relam != 0; + +-- Indexes and partitioned indexes should have AMs of type 'i' SELECT pc.oid, pc.relname, pa.amname, pa.amtype FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) WHERE pc.relkind IN ('i') and pa.amtype != 'i'; --- Tables, matviews etc should have AMs of type 't' +-- Tables, matviews etc should have AMs of type 't' (except partitioned tables) SELECT pc.oid, pc.relname, pa.amname, pa.amtype FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) WHERE pc.relkind IN ('r', 't', 'm') and -- 2.34.1