mirror of https://github.com/postgres/postgres
Reintroduce support for sequences in pgstattuple and pageinspect.
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
This commit is contained in:
parent
b0c30612c5
commit
05036a3155
|
@ -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)
|
||||
|
||||
|
|
|
@ -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")));
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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")));
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue