1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-30 11:03:19 +03:00

Support amcheck of sequences

Sequences were left out of the list of relation kinds that
verify_heapam knew how to check, though it is fairly trivial to allow
them.  Doing that, and while at it, updating pg_amcheck to include
sequences in relations matched by table and relation patterns.

Author: Mark Dilger <mark.dilger@enterprisedb.com>
Discussion: https://www.postgresql.org/message-id/flat/81ad4757-92c1-4aa3-7bee-f609544837e3%40enterprisedb.com
This commit is contained in:
Peter Eisentraut
2021-09-28 15:26:25 +02:00
parent 7d1aa6bf1c
commit c3b011d991
6 changed files with 95 additions and 18 deletions

View File

@ -180,8 +180,10 @@ CREATE SEQUENCE test_sequence;
SELECT * FROM verify_heapam('test_sequence',
startblock := NULL,
endblock := NULL);
ERROR: cannot check relation "test_sequence"
DETAIL: This operation is not supported for sequences.
blkno | offnum | attnum | msg
-------+--------+--------+-----
(0 rows)
-- Check that foreign tables are rejected
CREATE FOREIGN DATA WRAPPER dummy;
CREATE SERVER dummy_server FOREIGN DATA WRAPPER dummy;

View File

@ -8,7 +8,7 @@ use PostgresNode;
use TestLib;
use Fcntl qw(:seek);
use Test::More tests => 80;
use Test::More tests => 272;
my ($node, $result);
@ -60,6 +60,22 @@ detects_no_corruption(
"verify_heapam('test', skip := 'all-frozen')",
"all-frozen corrupted table skipping all-frozen");
#
# Check a sequence with no corruption. The current implementation of sequences
# doesn't require its own test setup, since sequences are really just heap
# tables under-the-hood. To guard against future implementation changes made
# without remembering to update verify_heapam, we create and exercise a
# sequence, checking along the way that it passes corruption checks.
#
fresh_test_sequence('test_seq');
check_all_options_uncorrupted('test_seq', 'plain');
advance_test_sequence('test_seq');
check_all_options_uncorrupted('test_seq', 'plain');
set_test_sequence('test_seq');
check_all_options_uncorrupted('test_seq', 'plain');
reset_test_sequence('test_seq');
check_all_options_uncorrupted('test_seq', 'plain');
# Returns the filesystem path for the named relation.
sub relation_filepath
{
@ -110,6 +126,56 @@ sub fresh_test_table
));
}
# Create a test sequence of the given name.
sub fresh_test_sequence
{
my ($seqname) = @_;
return $node->safe_psql(
'postgres', qq(
DROP SEQUENCE IF EXISTS $seqname CASCADE;
CREATE SEQUENCE $seqname
INCREMENT BY 13
MINVALUE 17
START WITH 23;
SELECT nextval('$seqname');
SELECT setval('$seqname', currval('$seqname') + nextval('$seqname'));
));
}
# Call SQL functions to increment the sequence
sub advance_test_sequence
{
my ($seqname) = @_;
return $node->safe_psql(
'postgres', qq(
SELECT nextval('$seqname');
));
}
# Call SQL functions to set the sequence
sub set_test_sequence
{
my ($seqname) = @_;
return $node->safe_psql(
'postgres', qq(
SELECT setval('$seqname', 102);
));
}
# Call SQL functions to reset the sequence
sub reset_test_sequence
{
my ($seqname) = @_;
return $node->safe_psql(
'postgres', qq(
ALTER SEQUENCE $seqname RESTART WITH 51
));
}
# Stops the test node, corrupts the first page of the named relation, and
# restarts the node.
sub corrupt_first_page

View File

@ -305,14 +305,20 @@ verify_heapam(PG_FUNCTION_ARGS)
*/
if (ctx.rel->rd_rel->relkind != RELKIND_RELATION &&
ctx.rel->rd_rel->relkind != RELKIND_MATVIEW &&
ctx.rel->rd_rel->relkind != RELKIND_TOASTVALUE)
ctx.rel->rd_rel->relkind != RELKIND_TOASTVALUE &&
ctx.rel->rd_rel->relkind != RELKIND_SEQUENCE)
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("cannot check relation \"%s\"",
RelationGetRelationName(ctx.rel)),
errdetail_relkind_not_supported(ctx.rel->rd_rel->relkind)));
if (ctx.rel->rd_rel->relam != HEAP_TABLE_AM_OID)
/*
* Sequences always use heap AM, but they don't show that in the catalogs.
* Other relkinds might be using a different AM, so check.
*/
if (ctx.rel->rd_rel->relkind != RELKIND_SEQUENCE &&
ctx.rel->rd_rel->relam != HEAP_TABLE_AM_OID)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("only heap AM is supported")));