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:
@ -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
|
||||
|
Reference in New Issue
Block a user