Reintroduce support for sequences in pgstattuple and pageinspect.
authorNathan Bossart <nathan@postgresql.org>
Thu, 12 Sep 2024 21:31:29 +0000 (16:31 -0500)
committerNathan Bossart <nathan@postgresql.org>
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 8134eda1d7e95ccc5d6c13012cd51440f974fa0c..0e4a5e55ffb0058c4e720faf09c60e3bd75c5d0a 100644 (file)
@@ -236,3 +236,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 f6760eb31e798a2973d9e6f8ea702198e437a7a2..07c3cee5288213b63a540d9dd620fd73bfa56fcc 100644 (file)
@@ -320,7 +320,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 b5c41cc8ac53a1e00c3f5b20aa57aef04080b2ee..ebc6e71ce39ef9bbbe30af1264cb0e7574891e58 100644 (file)
@@ -97,3 +97,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 48a3ef237ea5d0567dcf3783cb92060c09f2dd68..9b1906613e7cc72bef5aa2dc6e1bed19fec7d34a 100644 (file)
@@ -263,6 +263,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, materialized view, or TOAST table
+drop sequence test_sequence;
 drop table test_partitioned;
 drop view test_view;
 drop foreign table test_foreign_table;
index 32ac4103ce6cb01590e54e0ab00a7f62a8256d40..a1498a93ae577e0ba5fedeb5c4f24e98cf294f58 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 b08c31c21b7ea111f9475a67de8561d103e3a92b..7e72c567a06411d5fa25858a474770843cbc040e 100644 (file)
@@ -119,6 +119,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;