Reintroduce support for sequences in pgstattuple and pageinspect.
authorNathan Bossart <[email protected]>
Thu, 12 Sep 2024 21:31:29 +0000 (16:31 -0500)
committerNathan Bossart <[email protected]>
Thu, 12 Sep 2024 21:31:29 +0000 (16:31 -0500)
Commit 4b82664156 restricted a number of functions provided by
contrib modules to only relations that use the "heap" table access
method.  Sequences always use this table access method, but they do
not advertise as such in the pg_class system catalog, so the
aforementioned commit also (presumably unintentionally) removed
support for sequences from some of these functions.  This commit
reintroduces said support for sequences to these functions and adds
a couple of relevant tests.

Co-authored-by: Ayush Vatsa
Reviewed-by: Robert Haas, Michael Paquier, Matthias van de Meent
Discussion: https://postgr.es/m/CACX%2BKaP3i%2Bi9tdPLjF5JCHVv93xobEdcd_eB%2B638VDvZ3i%3DcQA%40mail.gmail.com
Backpatch-through: 12

contrib/pageinspect/expected/page.out
contrib/pageinspect/heapfuncs.c
contrib/pageinspect/sql/page.sql
contrib/pgstattuple/expected/pgstattuple.out
contrib/pgstattuple/pgstattuple.c
contrib/pgstattuple/sql/pgstattuple.sql

index bb6b1162f3110546766d23bb40a2a2300373557c..51dfc6c4d3b8f65dd4dcaa5ae529a18b7447c632 100644 (file)
@@ -144,3 +144,12 @@ SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1);
               
 (1 row)
 
+-- tests for sequences
+create temporary sequence test_sequence;
+select tuple_data_split('test_sequence'::regclass, t_data, t_infomask, t_infomask2, t_bits)
+  from heap_page_items(get_raw_page('test_sequence', 0));
+                   tuple_data_split                    
+-------------------------------------------------------
+ {"\\x0100000000000000","\\x0000000000000000","\\x00"}
+(1 row)
+
index 64a6e351d5f85b114993e8fe1ab428141c71da5a..5766fa2e2455059ddedb0eb634041dc7e6b2966e 100644 (file)
@@ -319,7 +319,11 @@ tuple_data_split_internal(Oid relid, char *tupdata,
    raw_attrs = initArrayResult(BYTEAOID, CurrentMemoryContext, false);
    nattrs = tupdesc->natts;
 
-   if (rel->rd_rel->relam != HEAP_TABLE_AM_OID)
+   /*
+    * Sequences always use heap AM, but they don't show that in the catalogs.
+    */
+   if (rel->rd_rel->relkind != RELKIND_SEQUENCE &&
+       rel->rd_rel->relam != HEAP_TABLE_AM_OID)
        ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                        errmsg("only heap AM is supported")));
 
index 71f7679d88c4bdefe820014f0df2d84356f64c78..7580491c6dbaf365d79a320c3f8b567b03177125 100644 (file)
@@ -67,3 +67,8 @@ SHOW block_size \gset
 SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex'));
 SELECT page_header(decode(repeat('00', :block_size), 'hex'));
 SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1);
+
+-- tests for sequences
+create temporary sequence test_sequence;
+select tuple_data_split('test_sequence'::regclass, t_data, t_infomask, t_infomask2, t_bits)
+  from heap_page_items(get_raw_page('test_sequence', 0));
index 262633f065715d60cdf7c4ef07d4f1420f124446..54a2faf7868a3d350518241376983f56fa362767 100644 (file)
@@ -244,6 +244,30 @@ select pgstathashindex('test_partition_hash_idx');
  (4,8,0,1,0,0,0,100)
 (1 row)
 
+-- these should work for sequences
+create sequence test_sequence;
+select count(*) from pgstattuple('test_sequence');
+ count 
+-------
+     1
+(1 row)
+
+select pg_relpages('test_sequence');
+ pg_relpages 
+-------------
+           1
+(1 row)
+
+-- these should fail for sequences
+select pgstatindex('test_sequence');
+ERROR:  relation "test_sequence" is not a btree index
+select pgstatginindex('test_sequence');
+ERROR:  relation "test_sequence" is not a GIN index
+select pgstathashindex('test_sequence');
+ERROR:  relation "test_sequence" is not a hash index
+select pgstattuple_approx('test_sequence');
+ERROR:  "test_sequence" is not a table or materialized view
+drop sequence test_sequence;
 drop table test_partitioned;
 drop view test_view;
 drop foreign table test_foreign_table;
index e063ad83ff4076b8c409fc9846ff136cc817f0b6..1628e9e9f721b38a5c5b882fd83689f56786f7ee 100644 (file)
@@ -335,7 +335,11 @@ pgstat_heap(Relation rel, FunctionCallInfo fcinfo)
    pgstattuple_type stat = {0};
    SnapshotData SnapshotDirty;
 
-   if (rel->rd_rel->relam != HEAP_TABLE_AM_OID)
+   /*
+    * Sequences always use heap AM, but they don't show that in the catalogs.
+    */
+   if (rel->rd_rel->relkind != RELKIND_SEQUENCE &&
+       rel->rd_rel->relam != HEAP_TABLE_AM_OID)
        ereport(ERROR,
                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                 errmsg("only heap AM is supported")));
index 6a6846fd9ae44a9978e42c52e6283b4ee8c7edab..2c19befe65f320f7ce5b43fd55f9e193a55204f0 100644 (file)
@@ -114,6 +114,18 @@ create index test_partition_hash_idx on test_partition using hash (a);
 select pgstatindex('test_partition_idx');
 select pgstathashindex('test_partition_hash_idx');
 
+-- these should work for sequences
+create sequence test_sequence;
+select count(*) from pgstattuple('test_sequence');
+select pg_relpages('test_sequence');
+
+-- these should fail for sequences
+select pgstatindex('test_sequence');
+select pgstatginindex('test_sequence');
+select pgstathashindex('test_sequence');
+select pgstattuple_approx('test_sequence');
+
+drop sequence test_sequence;
 drop table test_partitioned;
 drop view test_view;
 drop foreign table test_foreign_table;