diff --git a/contrib/pageinspect/expected/page.out b/contrib/pageinspect/expected/page.out index 80ddb45a60a..04fd9dee4bd 100644 --- a/contrib/pageinspect/expected/page.out +++ b/contrib/pageinspect/expected/page.out @@ -239,3 +239,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) + diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 0f0252558c5..0c2e639131c 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -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"))); diff --git a/contrib/pageinspect/sql/page.sql b/contrib/pageinspect/sql/page.sql index 5bff568d3b5..59784fc7cce 100644 --- a/contrib/pageinspect/sql/page.sql +++ b/contrib/pageinspect/sql/page.sql @@ -98,3 +98,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)); diff --git a/contrib/pgstattuple/expected/pgstattuple.out b/contrib/pgstattuple/expected/pgstattuple.out index 283856e109e..9176dc98b6a 100644 --- a/contrib/pgstattuple/expected/pgstattuple.out +++ b/contrib/pgstattuple/expected/pgstattuple.out @@ -273,6 +273,31 @@ 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: relation "test_sequence" is of wrong relation kind +DETAIL: This operation is not supported for sequences. +drop sequence test_sequence; drop table test_partitioned; drop view test_view; drop foreign table test_foreign_table; diff --git a/contrib/pgstattuple/pgstattuple.c b/contrib/pgstattuple/pgstattuple.c index 3bd8b96197f..1d012233cbf 100644 --- a/contrib/pgstattuple/pgstattuple.c +++ b/contrib/pgstattuple/pgstattuple.c @@ -323,7 +323,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"))); diff --git a/contrib/pgstattuple/sql/pgstattuple.sql b/contrib/pgstattuple/sql/pgstattuple.sql index b08c31c21b7..7e72c567a06 100644 --- a/contrib/pgstattuple/sql/pgstattuple.sql +++ b/contrib/pgstattuple/sql/pgstattuple.sql @@ -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;