Commit f04d4ac9 authored by Tom Lane's avatar Tom Lane

Reindent Perl files with perltidy version 20170521.

Discussion: https://postgr.es/m/CABUevEzK3cNiHZQ18f5tK0guoT+cN_jWeVzhYYxY=r+1Q3SmoA@mail.gmail.com
parent 46cda5bf
......@@ -38,8 +38,8 @@ while (<$feat>)
$is_supported eq $yesno || next;
$feature_name =~ s/</&lt;/g;
$feature_name =~ s/>/&gt;/g;
$feature_name =~ s/</&lt;/g;
$feature_name =~ s/>/&gt;/g;
$subfeature_name =~ s/</&lt;/g;
$subfeature_name =~ s/>/&gt;/g;
......
......@@ -33,185 +33,186 @@ sub ParseHeader
'TransactionId' => 'xid',
'XLogRecPtr' => 'pg_lsn');
my %catalog;
my $declaring_attributes = 0;
my $is_varlen = 0;
my $is_client_code = 0;
my %catalog;
my $declaring_attributes = 0;
my $is_varlen = 0;
my $is_client_code = 0;
$catalog{columns} = [];
$catalog{toasting} = [];
$catalog{indexing} = [];
$catalog{client_code} = [];
$catalog{columns} = [];
$catalog{toasting} = [];
$catalog{indexing} = [];
$catalog{client_code} = [];
open(my $ifh, '<', $input_file) || die "$input_file: $!";
open(my $ifh, '<', $input_file) || die "$input_file: $!";
# Scan the input file.
while (<$ifh>)
{
# Scan the input file.
while (<$ifh>)
{
# Set appropriate flag when we're in certain code sections.
if (/^#/)
# Set appropriate flag when we're in certain code sections.
if (/^#/)
{
$is_varlen = 1 if /^#ifdef\s+CATALOG_VARLEN/;
if (/^#ifdef\s+EXPOSE_TO_CLIENT_CODE/)
{
$is_varlen = 1 if /^#ifdef\s+CATALOG_VARLEN/;
if (/^#ifdef\s+EXPOSE_TO_CLIENT_CODE/)
{
$is_client_code = 1;
next;
}
next if !$is_client_code;
$is_client_code = 1;
next;
}
next if !$is_client_code;
}
if (!$is_client_code)
if (!$is_client_code)
{
# Strip C-style comments.
s;/\*(.|\n)*\*/;;g;
if (m;/\*;)
{
# Strip C-style comments.
s;/\*(.|\n)*\*/;;g;
if (m;/\*;)
{
# handle multi-line comments properly.
my $next_line = <$ifh>;
die "$input_file: ends within C-style comment\n"
if !defined $next_line;
$_ .= $next_line;
redo;
}
# Strip useless whitespace and trailing semicolons.
chomp;
s/^\s+//;
s/;\s*$//;
s/\s+/ /g;
# handle multi-line comments properly.
my $next_line = <$ifh>;
die "$input_file: ends within C-style comment\n"
if !defined $next_line;
$_ .= $next_line;
redo;
}
# Push the data into the appropriate data structure.
if (/^DECLARE_TOAST\(\s*(\w+),\s*(\d+),\s*(\d+)\)/)
# Strip useless whitespace and trailing semicolons.
chomp;
s/^\s+//;
s/;\s*$//;
s/\s+/ /g;
}
# Push the data into the appropriate data structure.
if (/^DECLARE_TOAST\(\s*(\w+),\s*(\d+),\s*(\d+)\)/)
{
my ($toast_name, $toast_oid, $index_oid) = ($1, $2, $3);
push @{ $catalog{toasting} },
"declare toast $toast_oid $index_oid on $toast_name\n";
}
elsif (/^DECLARE_(UNIQUE_)?INDEX\(\s*(\w+),\s*(\d+),\s*(.+)\)/)
{
my ($is_unique, $index_name, $index_oid, $using) =
($1, $2, $3, $4);
push @{ $catalog{indexing} },
sprintf(
"declare %sindex %s %s %s\n",
$is_unique ? 'unique ' : '',
$index_name, $index_oid, $using);
}
elsif (/^BUILD_INDICES/)
{
push @{ $catalog{indexing} }, "build indices\n";
}
elsif (/^CATALOG\((\w+),(\d+),(\w+)\)/)
{
$catalog{catname} = $1;
$catalog{relation_oid} = $2;
$catalog{relation_oid_macro} = $3;
$catalog{bootstrap} = /BKI_BOOTSTRAP/ ? ' bootstrap' : '';
$catalog{shared_relation} =
/BKI_SHARED_RELATION/ ? ' shared_relation' : '';
$catalog{without_oids} =
/BKI_WITHOUT_OIDS/ ? ' without_oids' : '';
if (/BKI_ROWTYPE_OID\((\d+),(\w+)\)/)
{
my ($toast_name, $toast_oid, $index_oid) = ($1, $2, $3);
push @{ $catalog{toasting} },
"declare toast $toast_oid $index_oid on $toast_name\n";
$catalog{rowtype_oid} = $1;
$catalog{rowtype_oid_clause} = " rowtype_oid $1";
$catalog{rowtype_oid_macro} = $2;
}
elsif (/^DECLARE_(UNIQUE_)?INDEX\(\s*(\w+),\s*(\d+),\s*(.+)\)/)
else
{
my ($is_unique, $index_name, $index_oid, $using) =
($1, $2, $3, $4);
push @{ $catalog{indexing} },
sprintf(
"declare %sindex %s %s %s\n",
$is_unique ? 'unique ' : '',
$index_name, $index_oid, $using);
$catalog{rowtype_oid} = '';
$catalog{rowtype_oid_clause} = '';
$catalog{rowtype_oid_macro} = '';
}
elsif (/^BUILD_INDICES/)
$catalog{schema_macro} = /BKI_SCHEMA_MACRO/ ? 1 : 0;
$declaring_attributes = 1;
}
elsif ($is_client_code)
{
if (/^#endif/)
{
push @{ $catalog{indexing} }, "build indices\n";
$is_client_code = 0;
}
elsif (/^CATALOG\((\w+),(\d+),(\w+)\)/)
else
{
$catalog{catname} = $1;
$catalog{relation_oid} = $2;
$catalog{relation_oid_macro} = $3;
$catalog{bootstrap} = /BKI_BOOTSTRAP/ ? ' bootstrap' : '';
$catalog{shared_relation} =
/BKI_SHARED_RELATION/ ? ' shared_relation' : '';
$catalog{without_oids} =
/BKI_WITHOUT_OIDS/ ? ' without_oids' : '';
if (/BKI_ROWTYPE_OID\((\d+),(\w+)\)/)
{
$catalog{rowtype_oid} = $1;
$catalog{rowtype_oid_clause} = " rowtype_oid $1";
$catalog{rowtype_oid_macro} = $2;
}
else
{
$catalog{rowtype_oid} = '';
$catalog{rowtype_oid_clause} = '';
$catalog{rowtype_oid_macro} = '';
}
$catalog{schema_macro} = /BKI_SCHEMA_MACRO/ ? 1 : 0;
$declaring_attributes = 1;
push @{ $catalog{client_code} }, $_;
}
elsif ($is_client_code)
}
elsif ($declaring_attributes)
{
next if (/^{|^$/);
if (/^}/)
{
if (/^#endif/)
{
$is_client_code = 0;
}
else
{
push @{ $catalog{client_code} }, $_;
}
$declaring_attributes = 0;
}
elsif ($declaring_attributes)
else
{
next if (/^{|^$/);
if (/^}/)
my %column;
my @attopts = split /\s+/, $_;
my $atttype = shift @attopts;
my $attname = shift @attopts;
die "parse error ($input_file)"
unless ($attname and $atttype);
if (exists $RENAME_ATTTYPE{$atttype})
{
$declaring_attributes = 0;
$atttype = $RENAME_ATTTYPE{$atttype};
}
else
# If the C name ends with '[]' or '[digits]', we have
# an array type, so we discard that from the name and
# prepend '_' to the type.
if ($attname =~ /(\w+)\[\d*\]/)
{
my %column;
my @attopts = split /\s+/, $_;
my $atttype = shift @attopts;
my $attname = shift @attopts;
die "parse error ($input_file)"
unless ($attname and $atttype);
if (exists $RENAME_ATTTYPE{$atttype})
$attname = $1;
$atttype = '_' . $atttype;
}
$column{type} = $atttype;
$column{name} = $attname;
$column{is_varlen} = 1 if $is_varlen;
foreach my $attopt (@attopts)
{
if ($attopt eq 'BKI_FORCE_NULL')
{
$atttype = $RENAME_ATTTYPE{$atttype};
$column{forcenull} = 1;
}
# If the C name ends with '[]' or '[digits]', we have
# an array type, so we discard that from the name and
# prepend '_' to the type.
if ($attname =~ /(\w+)\[\d*\]/)
elsif ($attopt eq 'BKI_FORCE_NOT_NULL')
{
$attname = $1;
$atttype = '_' . $atttype;
$column{forcenotnull} = 1;
}
$column{type} = $atttype;
$column{name} = $attname;
$column{is_varlen} = 1 if $is_varlen;
# We use quotes for values like \0 and \054, to
# make sure all compilers and syntax highlighters
# can recognize them properly.
elsif ($attopt =~ /BKI_DEFAULT\(['"]?([^'"]+)['"]?\)/)
{
$column{default} = $1;
}
elsif ($attopt =~ /BKI_LOOKUP\((\w+)\)/)
{
$column{lookup} = $1;
}
else
{
die
"unknown column option $attopt on column $attname";
}
foreach my $attopt (@attopts)
if ($column{forcenull} and $column{forcenotnull})
{
if ($attopt eq 'BKI_FORCE_NULL')
{
$column{forcenull} = 1;
}
elsif ($attopt eq 'BKI_FORCE_NOT_NULL')
{
$column{forcenotnull} = 1;
}
# We use quotes for values like \0 and \054, to
# make sure all compilers and syntax highlighters
# can recognize them properly.
elsif ($attopt =~ /BKI_DEFAULT\(['"]?([^'"]+)['"]?\)/)
{
$column{default} = $1;
}
elsif ($attopt =~ /BKI_LOOKUP\((\w+)\)/)
{
$column{lookup} = $1;
}
else
{
die
"unknown column option $attopt on column $attname";
}
if ($column{forcenull} and $column{forcenotnull})
{
die "$attname is forced both null and not null";
}
die "$attname is forced both null and not null";
}
push @{ $catalog{columns} }, \%column;
}
push @{ $catalog{columns} }, \%column;
}
}
close $ifh;
}
close $ifh;
return \%catalog;
}
......@@ -228,7 +229,7 @@ sub ParseData
$input_file =~ /(\w+)\.dat$/
or die "Input file $input_file needs to be a .dat file.\n";
my $catname = $1;
my $data = [];
my $data = [];
# Scan the input file.
while (<$ifd>)
......@@ -311,8 +312,9 @@ sub AddDefaultValues
{
$row->{$attname} = $column->{default};
}
elsif ($catname eq 'pg_proc' && $attname eq 'pronargs' &&
defined($row->{proargtypes}))
elsif ($catname eq 'pg_proc'
&& $attname eq 'pronargs'
&& defined($row->{proargtypes}))
{
# pg_proc.pronargs can be derived from proargtypes.
my @proargtypes = split /\s+/, $row->{proargtypes};
......@@ -328,7 +330,7 @@ sub AddDefaultValues
if (@missing_fields)
{
die sprintf "missing values for field(s) %s in %s.dat line %s\n",
join(', ', @missing_fields), $catname, $row->{line_number};
join(', ', @missing_fields), $catname, $row->{line_number};
}
}
......@@ -379,7 +381,7 @@ sub FindDefinedSymbol
sub FindDefinedSymbolFromData
{
my ($data, $symbol) = @_;
foreach my $row (@{ $data })
foreach my $row (@{$data})
{
if ($row->{oid_symbol} eq $symbol)
{
......
......@@ -116,10 +116,12 @@ foreach my $header (@input_files)
# within a given Postgres release, such as fixed OIDs. Do not substitute
# anything that could depend on platform or configuration. (The right place
# to handle those sorts of things is in initdb.c's bootstrap_template1().)
my $BOOTSTRAP_SUPERUSERID = Catalog::FindDefinedSymbolFromData(
$catalog_data{pg_authid}, 'BOOTSTRAP_SUPERUSERID');
my $PG_CATALOG_NAMESPACE = Catalog::FindDefinedSymbolFromData(
$catalog_data{pg_namespace}, 'PG_CATALOG_NAMESPACE');
my $BOOTSTRAP_SUPERUSERID =
Catalog::FindDefinedSymbolFromData($catalog_data{pg_authid},
'BOOTSTRAP_SUPERUSERID');
my $PG_CATALOG_NAMESPACE =
Catalog::FindDefinedSymbolFromData($catalog_data{pg_namespace},
'PG_CATALOG_NAMESPACE');
# Build lookup tables for OID macro substitutions and for pg_attribute
......@@ -138,8 +140,7 @@ foreach my $row (@{ $catalog_data{pg_opclass} })
{
# There is no unique name, so we need to combine access method
# and opclass name.
my $key = sprintf "%s/%s",
$row->{opcmethod}, $row->{opcname};
my $key = sprintf "%s/%s", $row->{opcmethod}, $row->{opcname};
$opcoids{$key} = $row->{oid};
}
......@@ -160,8 +161,7 @@ foreach my $row (@{ $catalog_data{pg_opfamily} })
{
# There is no unique name, so we need to combine access method
# and opfamily name.
my $key = sprintf "%s/%s",
$row->{opfmethod}, $row->{opfname};
my $key = sprintf "%s/%s", $row->{opfmethod}, $row->{opfname};
$opfoids{$key} = $row->{oid};
}
......@@ -179,6 +179,7 @@ foreach my $row (@{ $catalog_data{pg_proc} })
{
$procoids{$prokey} = $row->{oid};
}
# Also generate an entry using proname(proargtypes). This is not quite
# identical to regprocedure lookup because we don't worry much about
# special SQL names for types etc; we just use the names in the source
......@@ -201,7 +202,7 @@ my %types;
foreach my $row (@{ $catalog_data{pg_type} })
{
$typeoids{ $row->{typname} } = $row->{oid};
$types{ $row->{typname} } = $row;
$types{ $row->{typname} } = $row;
}
# Map catalog name to OID lookup.
......@@ -211,8 +212,7 @@ my %lookup_kind = (
pg_operator => \%operoids,
pg_opfamily => \%opfoids,
pg_proc => \%procoids,
pg_type => \%typeoids
);
pg_type => \%typeoids);
# Generate postgres.bki, postgres.description, postgres.shdescription,
......@@ -345,11 +345,14 @@ EOM
# Complain about unrecognized keys; they are presumably misspelled
foreach my $key (keys %bki_values)
{
next if $key eq "oid" || $key eq "oid_symbol" || $key eq "descr"
|| $key eq "line_number";
next
if $key eq "oid"
|| $key eq "oid_symbol"
|| $key eq "descr"
|| $key eq "line_number";
die sprintf "unrecognized field name \"%s\" in %s.dat line %s\n",
$key, $catname, $bki_values{line_number}
if (!exists($attnames{$key}));
$key, $catname, $bki_values{line_number}
if (!exists($attnames{$key}));
}
# Perform required substitutions on fields
......@@ -379,8 +382,8 @@ EOM
if ($atttype eq 'oidvector')
{
@lookupnames = split /\s+/, $bki_values{$attname};
@lookupoids = lookup_oids($lookup, $catname,
\%bki_values, @lookupnames);
@lookupoids = lookup_oids($lookup, $catname, \%bki_values,
@lookupnames);
$bki_values{$attname} = join(' ', @lookupoids);
}
elsif ($atttype eq '_oid')
......@@ -389,17 +392,18 @@ EOM
{
$bki_values{$attname} =~ s/[{}]//g;
@lookupnames = split /,/, $bki_values{$attname};
@lookupoids = lookup_oids($lookup, $catname,
\%bki_values, @lookupnames);
$bki_values{$attname} =
sprintf "{%s}", join(',', @lookupoids);
@lookupoids =
lookup_oids($lookup, $catname, \%bki_values,
@lookupnames);
$bki_values{$attname} = sprintf "{%s}",
join(',', @lookupoids);
}
}
else
{
$lookupnames[0] = $bki_values{$attname};
@lookupoids = lookup_oids($lookup, $catname,
\%bki_values, @lookupnames);
@lookupoids = lookup_oids($lookup, $catname, \%bki_values,
@lookupnames);
$bki_values{$attname} = $lookupoids[0];
}
}
......@@ -562,7 +566,7 @@ sub gen_pg_attribute
morph_row_for_schemapg(\%row, $schema);
push @{ $schemapg_entries{$table_name} },
sprintf "{ %s }",
join(', ', grep { defined $_ } @row{@attnames});
join(', ', grep { defined $_ } @row{@attnames});
}
# Generate entries for system attributes.
......@@ -589,7 +593,7 @@ sub gen_pg_attribute
# Omit the oid column if the catalog doesn't have them
next
if $table->{without_oids}
&& $attr->{name} eq 'oid';
&& $attr->{name} eq 'oid';
morph_row_for_pgattr(\%row, $schema, $attr, 1);
print_bki_insert(\%row, $schema);
......@@ -641,11 +645,11 @@ sub morph_row_for_pgattr
# compare DefineAttr in bootstrap.c. oidvector and
# int2vector are also treated as not-nullable.
$row->{attnotnull} =
$type->{typname} eq 'oidvector' ? 't'
: $type->{typname} eq 'int2vector' ? 't'
: $type->{typlen} eq 'NAMEDATALEN' ? 't'
: $type->{typlen} > 0 ? 't'
: 'f';
$type->{typname} eq 'oidvector' ? 't'
: $type->{typname} eq 'int2vector' ? 't'
: $type->{typlen} eq 'NAMEDATALEN' ? 't'
: $type->{typlen} > 0 ? 't'
: 'f';
}
else
{
......@@ -686,7 +690,7 @@ sub print_bki_insert
# the "id" pattern in bootscanner.l, currently "[-A-Za-z0-9_]+".
$bki_value = sprintf(qq'"%s"', $bki_value)
if length($bki_value) == 0
or $bki_value =~ /[^-A-Za-z0-9_]/;
or $bki_value =~ /[^-A-Za-z0-9_]/;
push @bki_values, $bki_value;
}
......@@ -725,7 +729,7 @@ sub morph_row_for_schemapg
# don't change.
elsif ($atttype eq 'bool')
{
$row->{$attname} = 'true' if $row->{$attname} eq 't';
$row->{$attname} = 'true' if $row->{$attname} eq 't';
$row->{$attname} = 'false' if $row->{$attname} eq 'f';
}
......@@ -756,9 +760,10 @@ sub lookup_oids
else
{
push @lookupoids, $lookupname;
warn sprintf "unresolved OID reference \"%s\" in %s.dat line %s\n",
$lookupname, $catname, $bki_values->{line_number}
if $lookupname ne '-' and $lookupname ne '0';
warn sprintf
"unresolved OID reference \"%s\" in %s.dat line %s\n",
$lookupname, $catname, $bki_values->{line_number}
if $lookupname ne '-' and $lookupname ne '0';
}
}
return @lookupoids;
......@@ -772,10 +777,10 @@ sub form_pg_type_symbol
# Skip for rowtypes of bootstrap catalogs, since they have their
# own naming convention defined elsewhere.
return
if $typename eq 'pg_type'
or $typename eq 'pg_proc'
or $typename eq 'pg_attribute'
or $typename eq 'pg_class';
if $typename eq 'pg_type'
or $typename eq 'pg_proc'
or $typename eq 'pg_attribute'
or $typename eq 'pg_class';
# Transform like so:
# foo_bar -> FOO_BAROID
......
......@@ -68,7 +68,7 @@ foreach my $datfile (@input_files)
my $header = "$1.h";
die "There in no header file corresponding to $datfile"
if ! -e $header;
if !-e $header;
my $catalog = Catalog::ParseHeader($header);
my $catname = $catalog->{catname};
......@@ -79,10 +79,12 @@ foreach my $datfile (@input_files)
}
# Fetch some values for later.
my $FirstBootstrapObjectId = Catalog::FindDefinedSymbol(
'access/transam.h', \@include_path, 'FirstBootstrapObjectId');
my $INTERNALlanguageId = Catalog::FindDefinedSymbolFromData(
$catalog_data{pg_language}, 'INTERNALlanguageId');
my $FirstBootstrapObjectId =
Catalog::FindDefinedSymbol('access/transam.h', \@include_path,
'FirstBootstrapObjectId');
my $INTERNALlanguageId =
Catalog::FindDefinedSymbolFromData($catalog_data{pg_language},
'INTERNALlanguageId');
print "Generating fmgrtab.c, fmgroids.h, and fmgrprotos.h...\n";
......@@ -230,7 +232,7 @@ foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
print $tfh
" { $s->{oid}, \"$s->{prosrc}\", $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, $s->{prosrc} }";
$fmgr_builtin_oid_index[$s->{oid}] = $fmgr_count++;
$fmgr_builtin_oid_index[ $s->{oid} ] = $fmgr_count++;
if ($fmgr_count <= $#fmgr)
{
......
......@@ -49,12 +49,13 @@ mkdir $datadir;
'successful creation');
# Permissions on PGDATA should be default
SKIP:
SKIP:
{
skip "unix-style permissions not supported on Windows", 1 if ($windows_os);
skip "unix-style permissions not supported on Windows", 1
if ($windows_os);
ok(check_mode_recursive($datadir, 0700, 0600),
"check PGDATA permissions");
"check PGDATA permissions");
}
}
command_ok([ 'initdb', '-S', $datadir ], 'sync only');
......@@ -63,7 +64,8 @@ command_fails([ 'initdb', $datadir ], 'existing data directory');
# Check group access on PGDATA
SKIP:
{
skip "unix-style permissions not supported on Windows", 2 if ($windows_os);
skip "unix-style permissions not supported on Windows", 2
if ($windows_os);
# Init a new db with group access
my $datadir_group = "$tempdir/data_group";
......
......@@ -10,11 +10,8 @@ program_options_handling_ok('pg_archivecleanup');
my $tempdir = TestLib::tempdir;
my @walfiles = (
'00000001000000370000000C.gz',
'00000001000000370000000D',
'00000001000000370000000E',
'00000001000000370000000F.partial',
);
'00000001000000370000000C.gz', '00000001000000370000000D',
'00000001000000370000000E', '00000001000000370000000F.partial',);
sub create_files
{
......@@ -28,32 +25,41 @@ sub create_files
create_files();
command_fails_like(['pg_archivecleanup'],
qr/must specify archive location/,
'fails if archive location is not specified');
command_fails_like(
['pg_archivecleanup'],
qr/must specify archive location/,
'fails if archive location is not specified');
command_fails_like(['pg_archivecleanup', $tempdir],
qr/must specify oldest kept WAL file/,
'fails if oldest kept WAL file name is not specified');
command_fails_like(
[ 'pg_archivecleanup', $tempdir ],
qr/must specify oldest kept WAL file/,
'fails if oldest kept WAL file name is not specified');
command_fails_like(['pg_archivecleanup', 'notexist', 'foo'],
qr/archive location .* does not exist/,
'fails if archive location does not exist');
command_fails_like(
[ 'pg_archivecleanup', 'notexist', 'foo' ],
qr/archive location .* does not exist/,
'fails if archive location does not exist');
command_fails_like(['pg_archivecleanup', $tempdir, 'foo', 'bar'],
qr/too many command-line arguments/,
'fails with too many command-line arguments');
command_fails_like(
[ 'pg_archivecleanup', $tempdir, 'foo', 'bar' ],
qr/too many command-line arguments/,
'fails with too many command-line arguments');
command_fails_like(['pg_archivecleanup', $tempdir, 'foo'],
qr/invalid file name argument/,
'fails with invalid restart file name');
command_fails_like(
[ 'pg_archivecleanup', $tempdir, 'foo' ],
qr/invalid file name argument/,
'fails with invalid restart file name');
{
# like command_like but checking stderr
my $stderr;
my $result = IPC::Run::run ['pg_archivecleanup', '-d', '-n', $tempdir, $walfiles[2]], '2>', \$stderr;
my $result = IPC::Run::run [ 'pg_archivecleanup', '-d', '-n', $tempdir,
$walfiles[2] ], '2>', \$stderr;
ok($result, "pg_archivecleanup dry run: exit code 0");
like($stderr, qr/$walfiles[1].*would be removed/, "pg_archivecleanup dry run: matches");
like(
$stderr,
qr/$walfiles[1].*would be removed/,
"pg_archivecleanup dry run: matches");
foreach my $fn (@walfiles)
{
ok(-f "$tempdir/$fn", "$fn not removed");
......@@ -66,16 +72,23 @@ sub run_check
create_files();
command_ok(['pg_archivecleanup', '-x', '.gz', $tempdir, $walfiles[2] . $suffix],
"$test_name: runs");
ok(! -f "$tempdir/$walfiles[0]", "$test_name: first older WAL file was cleaned up");
ok(! -f "$tempdir/$walfiles[1]", "$test_name: second older WAL file was cleaned up");
ok(-f "$tempdir/$walfiles[2]", "$test_name: restartfile was not cleaned up");
ok(-f "$tempdir/$walfiles[3]", "$test_name: newer WAL file was not cleaned up");
ok(-f "$tempdir/unrelated_file", "$test_name: unrelated file was not cleaned up");
command_ok(
[ 'pg_archivecleanup', '-x', '.gz', $tempdir,
$walfiles[2] . $suffix ],
"$test_name: runs");
ok(!-f "$tempdir/$walfiles[0]",
"$test_name: first older WAL file was cleaned up");
ok(!-f "$tempdir/$walfiles[1]",
"$test_name: second older WAL file was cleaned up");
ok(-f "$tempdir/$walfiles[2]",
"$test_name: restartfile was not cleaned up");
ok(-f "$tempdir/$walfiles[3]",
"$test_name: newer WAL file was not cleaned up");
ok(-f "$tempdir/unrelated_file",
"$test_name: unrelated file was not cleaned up");
}
run_check('', 'pg_archivecleanup');
run_check('.partial', 'pg_archivecleanup with .partial file');
run_check('', 'pg_archivecleanup');
run_check('.partial', 'pg_archivecleanup with .partial file');
run_check('.00000020.backup', 'pg_archivecleanup with .backup file');
......@@ -41,7 +41,8 @@ is($slot->{'slot_type'}, 'physical', 'physical replication slot was created');
is($slot->{'restart_lsn'}, '', 'restart LSN of new slot is null');
$primary->command_ok([ 'pg_receivewal', '--slot', $slot_name, '--drop-slot' ],
'dropping a replication slot');
is($primary->slot($slot_name)->{'slot_type'}, '', 'replication slot was removed');
is($primary->slot($slot_name)->{'slot_type'},
'', 'replication slot was removed');
# Generate some WAL. Use --synchronous at the same time to add more
# code coverage. Switch to the next segment first so that subsequent
......@@ -63,8 +64,9 @@ $primary->command_ok(
# Permissions on WAL files should be default
SKIP:
{
skip "unix-style permissions not supported on Windows", 1 if ($windows_os);
skip "unix-style permissions not supported on Windows", 1
if ($windows_os);
ok(check_mode_recursive($stream_dir, 0700, 0600),
"check stream dir permissions");
"check stream dir permissions");
}
......@@ -21,17 +21,20 @@ command_like([ 'pg_controldata', $node->data_dir ],
# check with a corrupted pg_control
my $pg_control = $node->data_dir . '/global/pg_control';
my $size = (stat($pg_control))[7];
my $size = (stat($pg_control))[7];
open my $fh, '>', $pg_control or BAIL_OUT($!);
binmode $fh;
# fill file with zeros
print $fh pack("x[$size]");
close $fh;
command_checks_all([ 'pg_controldata', $node->data_dir ],
0,
[ qr/WARNING: Calculated CRC checksum does not match value stored in file/,
qr/WARNING: invalid WAL segment size/ ],
[ qr/^$/ ],
'pg_controldata with corrupted pg_control');
command_checks_all(
[ 'pg_controldata', $node->data_dir ],
0,
[
qr/WARNING: Calculated CRC checksum does not match value stored in file/,
qr/WARNING: invalid WAL segment size/ ],
[qr/^$/],
'pg_controldata with corrupted pg_control');
......@@ -63,14 +63,14 @@ command_fails([ 'pg_ctl', 'stop', '-D', "$tempdir/data" ],
# Windows but we still want to do the restart test.
my $logFileName = "$tempdir/data/perm-test-600.log";
command_ok(
[ 'pg_ctl', 'restart', '-D', "$tempdir/data", '-l', $logFileName ],
command_ok([ 'pg_ctl', 'restart', '-D', "$tempdir/data", '-l', $logFileName ],
'pg_ctl restart with server not running');
# Permissions on log file should be default
SKIP:
{
skip "unix-style permissions not supported on Windows", 2 if ($windows_os);
skip "unix-style permissions not supported on Windows", 2
if ($windows_os);
ok(-f $logFileName);
ok(check_mode_recursive("$tempdir/data", 0700, 0600));
......
This diff is collapsed.
......@@ -13,14 +13,14 @@ my $node = get_new_node('main');
$node->init;
command_like([ 'pg_resetwal', '-n', $node->data_dir ],
qr/checkpoint/,
'pg_resetwal -n produces output');
qr/checkpoint/, 'pg_resetwal -n produces output');
# Permissions on PGDATA should be default
SKIP:
{
skip "unix-style permissions not supported on Windows", 1 if ($windows_os);
skip "unix-style permissions not supported on Windows", 1
if ($windows_os);
ok(check_mode_recursive($node->data_dir, 0700, 0600),
'check PGDATA permissions');
......
......@@ -11,7 +11,7 @@ my $node = get_new_node('main');
$node->init;
my $pg_control = $node->data_dir . '/global/pg_control';
my $size = (stat($pg_control))[7];
my $size = (stat($pg_control))[7];
# Read out the head of the file to get PG_CONTROL_VERSION in
# particular.
......@@ -27,11 +27,14 @@ binmode $fh;
print $fh pack("x[$size]");
close $fh;
command_checks_all([ 'pg_resetwal', '-n', $node->data_dir ],
0,
[ qr/pg_control version number/ ],
[ qr/pg_resetwal: pg_control exists but is broken or wrong version; ignoring it/ ],
'processes corrupted pg_control all zeroes');
command_checks_all(
[ 'pg_resetwal', '-n', $node->data_dir ],
0,
[qr/pg_control version number/],
[
qr/pg_resetwal: pg_control exists but is broken or wrong version; ignoring it/
],
'processes corrupted pg_control all zeroes');
# Put in the previously saved header data. This uses a different code
# path internally, allowing us to process a zero WAL segment size.
......@@ -40,8 +43,11 @@ binmode $fh;
print $fh $data, pack("x[" . ($size - 16) . "]");
close $fh;
command_checks_all([ 'pg_resetwal', '-n', $node->data_dir ],
0,
[ qr/pg_control version number/ ],
[ qr/\Qpg_resetwal: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/ ],
'processes zero WAL segment size');
command_checks_all(
[ 'pg_resetwal', '-n', $node->data_dir ],
0,
[qr/pg_control version number/],
[
qr/\Qpg_resetwal: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/
],
'processes zero WAL segment size');
......@@ -115,16 +115,18 @@ sub check_query
sub setup_cluster
{
my $extra_name = shift; # Used to differentiate clusters
my $extra = shift; # Extra params for initdb
my $extra_name = shift; # Used to differentiate clusters
my $extra = shift; # Extra params for initdb
# Initialize master, data checksums are mandatory
$node_master = get_new_node('master' . ($extra_name ? "_${extra_name}" : ''));
$node_master->init(
allows_streaming => 1, extra => $extra);
$node_master =
get_new_node('master' . ($extra_name ? "_${extra_name}" : ''));
$node_master->init(allows_streaming => 1, extra => $extra);
# Set wal_keep_segments to prevent WAL segment recycling after enforced
# checkpoints in the tests.
$node_master->append_conf('postgresql.conf', qq(
$node_master->append_conf(
'postgresql.conf', qq(
wal_keep_segments = 20
));
}
......@@ -141,7 +143,8 @@ sub create_standby
{
my $extra_name = shift;
$node_standby = get_new_node('standby' . ($extra_name ? "_${extra_name}" : ''));
$node_standby =
get_new_node('standby' . ($extra_name ? "_${extra_name}" : ''));
$node_master->backup('my_backup');
$node_standby->init_from_backup($node_master, 'my_backup');
my $connstr_master = $node_master->connstr();
......@@ -239,10 +242,11 @@ sub run_pg_rewind
"$tmp_folder/master-postgresql.conf.tmp",
"$master_pgdata/postgresql.conf");
chmod($node_master->group_access() ? 0640 : 0600,
"$master_pgdata/postgresql.conf")
or BAIL_OUT(
"unable to set permissions for $master_pgdata/postgresql.conf");
chmod(
$node_master->group_access() ? 0640 : 0600,
"$master_pgdata/postgresql.conf")
or BAIL_OUT(
"unable to set permissions for $master_pgdata/postgresql.conf");
# Plug-in rewound node to the now-promoted standby node
my $port_standby = $node_standby->port;
......
......@@ -87,9 +87,10 @@ in master, before promotion
'tail-copy');
# Permissions on PGDATA should be default
SKIP:
SKIP:
{
skip "unix-style permissions not supported on Windows", 1 if ($windows_os);
skip "unix-style permissions not supported on Windows", 1
if ($windows_os);
ok(check_mode_recursive($node_master->data_dir(), 0700, 0600),
'check PGDATA permissions');
......
......@@ -43,9 +43,10 @@ template1
'database names');
# Permissions on PGDATA should have group permissions
SKIP:
SKIP:
{
skip "unix-style permissions not supported on Windows", 1 if ($windows_os);
skip "unix-style permissions not supported on Windows", 1
if ($windows_os);
ok(check_mode_recursive($node_master->data_dir(), 0750, 0640),
'check PGDATA permissions');
......
......@@ -81,8 +81,10 @@ pgbench(
# Initialize pgbench tables scale 1
pgbench(
'-i', 0, [qr{^$}],
[ qr{creating tables}, qr{vacuuming}, qr{creating primary keys}, qr{done\.} ],
'-i', 0,
[qr{^$}],
[ qr{creating tables}, qr{vacuuming},
qr{creating primary keys}, qr{done\.} ],
'pgbench scale 1 initialization',);
# Again, with all possible options
......@@ -100,8 +102,9 @@ pgbench(
# Test interaction of --init-steps with legacy step-selection options
pgbench(
'--initialize --init-steps=dtpvgvv --no-vacuum --foreign-keys --unlogged-tables',
0, [qr{^$}],
'--initialize --init-steps=dtpvgvv --no-vacuum --foreign-keys --unlogged-tables',
0,
[qr{^$}],
[ qr{dropping old tables},
qr{creating tables},
qr{creating primary keys},
......@@ -218,15 +221,16 @@ COMMIT;
# test expressions
# command 1..3 and 23 depend on random seed which is used to call srandom.
pgbench(
'--random-seed=5432 -t 1 -Dfoo=-10.1 -Dbla=false -Di=+3 -Dminint=-9223372036854775808 -Dn=null -Dt=t -Df=of -Dd=1.0',
'--random-seed=5432 -t 1 -Dfoo=-10.1 -Dbla=false -Di=+3 -Dminint=-9223372036854775808 -Dn=null -Dt=t -Df=of -Dd=1.0',
0,
[ qr{type: .*/001_pgbench_expressions}, qr{processed: 1/1} ],
[ qr{setting random seed to 5432\b},
# After explicit seeding, the four * random checks (1-3,20) should be
# deterministic, but not necessarily portable.
qr{command=1.: int 1\d\b}, # uniform random: 12 on linux
qr{command=2.: int 1\d\d\b}, # exponential random: 106 on linux
qr{command=3.: int 1\d\d\d\b}, # gaussian random: 1462 on linux
qr{command=1.: int 1\d\b}, # uniform random: 12 on linux
qr{command=2.: int 1\d\d\b}, # exponential random: 106 on linux
qr{command=3.: int 1\d\d\d\b}, # gaussian random: 1462 on linux
qr{command=4.: int 4\b},
qr{command=5.: int 5\b},
qr{command=6.: int 6\b},
......@@ -240,7 +244,7 @@ pgbench(
qr{command=16.: double 16\b},
qr{command=17.: double 17\b},
qr{command=18.: int 9223372036854775807\b},
qr{command=20.: int \d\b}, # zipfian random: 1 on linux
qr{command=20.: int \d\b}, # zipfian random: 1 on linux
qr{command=21.: double -27\b},
qr{command=22.: double 1024\b},
qr{command=23.: double 1\b},
......@@ -280,9 +284,9 @@ pgbench(
qr{command=86.: int 86\b},
qr{command=93.: int 93\b},
qr{command=95.: int 0\b},
qr{command=96.: int 1\b}, # :scale
qr{command=97.: int 0\b}, # :client_id
qr{command=98.: int 5432\b}, # :random_seed
qr{command=96.: int 1\b}, # :scale
qr{command=97.: int 0\b}, # :client_id
qr{command=98.: int 5432\b}, # :random_seed
],
'pgbench expressions',
{ '001_pgbench_expressions' => q{-- integer functions
......@@ -411,18 +415,20 @@ SELECT :v0, :v1, :v2, :v3;
# random determinism when seeded
$node->safe_psql('postgres',
'CREATE UNLOGGED TABLE seeded_random(seed INT8 NOT NULL, rand TEXT NOT NULL, val INTEGER NOT NULL);');
'CREATE UNLOGGED TABLE seeded_random(seed INT8 NOT NULL, rand TEXT NOT NULL, val INTEGER NOT NULL);'
);
# same value to check for determinism
my $seed = int(rand(1000000000));
for my $i (1, 2)
{
pgbench("--random-seed=$seed -t 1",
0,
[qr{processed: 1/1}],
[qr{setting random seed to $seed\b}],
"random seeded with $seed",
{ "001_pgbench_random_seed_$i" => q{-- test random functions
pgbench(
"--random-seed=$seed -t 1",
0,
[qr{processed: 1/1}],
[qr{setting random seed to $seed\b}],
"random seeded with $seed",
{ "001_pgbench_random_seed_$i" => q{-- test random functions
\set ur random(1000, 1999)
\set er random_exponential(2000, 2999, 2.0)
\set gr random_gaussian(3000, 3999, 3.0)
......@@ -436,16 +442,20 @@ INSERT INTO seeded_random(seed, rand, val) VALUES
}
# check that all runs generated the same 4 values
my ($ret, $out, $err) =
$node->psql('postgres',
'SELECT seed, rand, val, COUNT(*) FROM seeded_random GROUP BY seed, rand, val');
my ($ret, $out, $err) = $node->psql('postgres',
'SELECT seed, rand, val, COUNT(*) FROM seeded_random GROUP BY seed, rand, val'
);
ok($ret == 0, "psql seeded_random count ok");
ok($ret == 0, "psql seeded_random count ok");
ok($err eq '', "psql seeded_random count stderr is empty");
ok($out =~ /\b$seed\|uniform\|1\d\d\d\|2/, "psql seeded_random count uniform");
ok($out =~ /\b$seed\|exponential\|2\d\d\d\|2/, "psql seeded_random count exponential");
ok($out =~ /\b$seed\|gaussian\|3\d\d\d\|2/, "psql seeded_random count gaussian");
ok($out =~ /\b$seed\|zipfian\|4\d\d\d\|2/, "psql seeded_random count zipfian");
ok($out =~ /\b$seed\|uniform\|1\d\d\d\|2/,
"psql seeded_random count uniform");
ok( $out =~ /\b$seed\|exponential\|2\d\d\d\|2/,
"psql seeded_random count exponential");
ok( $out =~ /\b$seed\|gaussian\|3\d\d\d\|2/,
"psql seeded_random count gaussian");
ok($out =~ /\b$seed\|zipfian\|4\d\d\d\|2/,
"psql seeded_random count zipfian");
$node->safe_psql('postgres', 'DROP TABLE seeded_random;');
......@@ -481,8 +491,8 @@ my @errors = (
# SQL
[ 'sql syntax error',
0,
[ qr{ERROR: syntax error}, qr{prepared statement .* does not exist}
],
[ qr{ERROR: syntax error},
qr{prepared statement .* does not exist} ],
q{-- SQL syntax error
SELECT 1 + ;
} ],
......@@ -493,7 +503,7 @@ SELECT LEAST(:i, :i, :i, :i, :i, :i, :i, :i, :i, :i, :i);
} ],
# SHELL
[ 'shell bad command', 0,
[ 'shell bad command', 0,
[qr{\(shell\) .* meta-command failed}], q{\shell no-such-command} ],
[ 'shell undefined variable', 0,
[qr{undefined variable ":nosuchvariable"}],
......@@ -557,52 +567,34 @@ SELECT LEAST(:i, :i, :i, :i, :i, :i, :i, :i, :i, :i, :i);
0,
[qr{exponential parameter must be greater }],
q{\set i random_exponential(0, 10, 0.0)} ],
[ 'set zipfian param to 1',
[ 'set zipfian param to 1',
0,
[qr{zipfian parameter must be in range \(0, 1\) U \(1, \d+\]}],
q{\set i random_zipfian(0, 10, 1)} ],
[ 'set zipfian param too large',
[ 'set zipfian param too large',
0,
[qr{zipfian parameter must be in range \(0, 1\) U \(1, \d+\]}],
q{\set i random_zipfian(0, 10, 1000000)} ],
[ 'set non numeric value', 0,
[qr{malformed variable "foo" value: "bla"}], q{\set i :foo + 1} ],
[ 'set no expression',
1,
[qr{syntax error}],
q{\set i} ],
[ 'set missing argument',
[ 'set no expression', 1, [qr{syntax error}], q{\set i} ],
[ 'set missing argument', 1, [qr{missing argument}i], q{\set} ],
[ 'set not a bool', 0,
[qr{cannot coerce double to boolean}], q{\set b NOT 0.0} ],
[ 'set not an int', 0,
[qr{cannot coerce boolean to int}], q{\set i TRUE + 2} ],
[ 'set not a double', 0,
[qr{cannot coerce boolean to double}], q{\set d ln(TRUE)} ],
[ 'set case error',
1,
[qr{missing argument}i],
q{\set} ],
[ 'set not a bool',
0,
[ qr{cannot coerce double to boolean} ],
q{\set b NOT 0.0} ],
[ 'set not an int',
0,
[ qr{cannot coerce boolean to int} ],
q{\set i TRUE + 2} ],
[ 'set not a double',
0,
[ qr{cannot coerce boolean to double} ],
q{\set d ln(TRUE)} ],
[ 'set case error',
1,
[ qr{syntax error in command "set"} ],
[qr{syntax error in command "set"}],
q{\set i CASE TRUE THEN 1 ELSE 0 END} ],
[ 'set random error',
0,
[ qr{cannot coerce boolean to int} ],
q{\set b random(FALSE, TRUE)} ],
[ 'set number of args mismatch',
1,
[ qr{unexpected number of arguments} ],
q{\set d ln(1.0, 2.0))} ],
[ 'set at least one arg',
1,
[ qr{at least one argument expected} ],
q{\set i greatest())} ],
[ 'set random error', 0,
[qr{cannot coerce boolean to int}], q{\set b random(FALSE, TRUE)} ],
[ 'set number of args mismatch', 1,
[qr{unexpected number of arguments}], q{\set d ln(1.0, 2.0))} ],
[ 'set at least one arg', 1,
[qr{at least one argument expected}], q{\set i greatest())} ],
# SETSHELL
[ 'setshell not an int', 0,
......@@ -625,8 +617,8 @@ SELECT LEAST(:i, :i, :i, :i, :i, :i, :i, :i, :i, :i, :i);
[ 'misc invalid backslash command', 1,
[qr{invalid command .* "nosuchcommand"}], q{\nosuchcommand} ],
[ 'misc empty script', 1, [qr{empty command list for script}], q{} ],
[ 'bad boolean', 0, [qr{malformed variable.*trueXXX}], q{\set b :badtrue or true} ],
);
[ 'bad boolean', 0,
[qr{malformed variable.*trueXXX}], q{\set b :badtrue or true} ],);
for my $e (@errors)
......@@ -635,7 +627,7 @@ for my $e (@errors)
my $n = '001_pgbench_error_' . $name;
$n =~ s/ /_/g;
pgbench(
'-n -t 1 -Dfoo=bla -Dnull=null -Dtrue=true -Done=1 -Dzero=0.0 -Dbadtrue=trueXXX -M prepared',
'-n -t 1 -Dfoo=bla -Dnull=null -Dtrue=true -Done=1 -Dzero=0.0 -Dbadtrue=trueXXX -M prepared',
$status,
[ $status ? qr{^$} : qr{processed: 0/1} ],
$re,
......@@ -647,7 +639,7 @@ for my $e (@errors)
pgbench(
'-t 1', 0,
[ qr{processed: 1/1}, qr{zipfian cache array overflowed 1 time\(s\)} ],
[ qr{^} ],
[qr{^}],
'pgbench zipfian array overflow on random_zipfian',
{ '001_pgbench_random_zipfian' => q{
\set i random_zipfian(1, 100, 0.5)
......
......@@ -15,8 +15,7 @@ $testname =~ s/\.pl$//;
my $testdir = "$TestLib::tmp_check/t_${testname}_stuff";
mkdir $testdir
or
BAIL_OUT("could not create test directory \"${testdir}\": $!");
or BAIL_OUT("could not create test directory \"${testdir}\": $!");
# invoke pgbench
sub pgbench
......@@ -38,8 +37,10 @@ sub pgbench_scripts
for my $fn (sort keys %$files)
{
my $filename = $testdir . '/' . $fn;
# cleanup file weight if any
$filename =~ s/\@\d+$//;
# cleanup from prior runs
unlink $filename;
append_to_file($filename, $$files{$fn});
......@@ -105,14 +106,17 @@ my @options = (
[ 'ambiguous builtin', '-b s', [qr{ambiguous}] ],
[ '--progress-timestamp => --progress', '--progress-timestamp',
[qr{allowed only under}] ],
[ '-I without init option', '-I dtg',
[ '-I without init option',
'-I dtg',
[qr{cannot be used in benchmarking mode}] ],
[ 'invalid init step', '-i -I dta',
[qr{unrecognized initialization step},
qr{allowed steps are} ] ],
[ 'bad random seed', '--random-seed=one',
[qr{unrecognized random seed option "one": expecting an unsigned integer, "time" or "rand"},
qr{error while setting random seed from --random-seed option} ] ],
[ 'invalid init step',
'-i -I dta',
[ qr{unrecognized initialization step}, qr{allowed steps are} ] ],
[ 'bad random seed',
'--random-seed=one',
[
qr{unrecognized random seed option "one": expecting an unsigned integer, "time" or "rand"},
qr{error while setting random seed from --random-seed option} ] ],
# loging sub-options
[ 'sampling => log', '--sampling-rate=0.01',
......@@ -161,23 +165,44 @@ pgbench(
'pgbench builtin list');
my @script_tests = (
# name, err, { file => contents }
[ 'missing endif', [qr{\\if without matching \\endif}], {'if-noendif.sql' => '\if 1'} ],
[ 'missing if on elif', [qr{\\elif without matching \\if}], {'elif-noif.sql' => '\elif 1'} ],
[ 'missing if on else', [qr{\\else without matching \\if}], {'else-noif.sql' => '\else'} ],
[ 'missing if on endif', [qr{\\endif without matching \\if}], {'endif-noif.sql' => '\endif'} ],
[ 'elif after else', [qr{\\elif after \\else}], {'else-elif.sql' => "\\if 1\n\\else\n\\elif 0\n\\endif"} ],
[ 'else after else', [qr{\\else after \\else}], {'else-else.sql' => "\\if 1\n\\else\n\\else\n\\endif"} ],
[ 'if syntax error', [qr{syntax error in command "if"}], {'if-bad.sql' => "\\if\n\\endif\n"} ],
[ 'elif syntax error', [qr{syntax error in command "elif"}], {'elif-bad.sql' => "\\if 0\n\\elif +\n\\endif\n"} ],
[ 'else syntax error', [qr{unexpected argument in command "else"}], {'else-bad.sql' => "\\if 0\n\\else BAD\n\\endif\n"} ],
[ 'endif syntax error', [qr{unexpected argument in command "endif"}], {'endif-bad.sql' => "\\if 0\n\\endif BAD\n"} ],
);
[ 'missing endif',
[qr{\\if without matching \\endif}],
{ 'if-noendif.sql' => '\if 1' } ],
[ 'missing if on elif',
[qr{\\elif without matching \\if}],
{ 'elif-noif.sql' => '\elif 1' } ],
[ 'missing if on else',
[qr{\\else without matching \\if}],
{ 'else-noif.sql' => '\else' } ],
[ 'missing if on endif',
[qr{\\endif without matching \\if}],
{ 'endif-noif.sql' => '\endif' } ],
[ 'elif after else',
[qr{\\elif after \\else}],
{ 'else-elif.sql' => "\\if 1\n\\else\n\\elif 0\n\\endif" } ],
[ 'else after else',
[qr{\\else after \\else}],
{ 'else-else.sql' => "\\if 1\n\\else\n\\else\n\\endif" } ],
[ 'if syntax error',
[qr{syntax error in command "if"}],
{ 'if-bad.sql' => "\\if\n\\endif\n" } ],
[ 'elif syntax error',
[qr{syntax error in command "elif"}],
{ 'elif-bad.sql' => "\\if 0\n\\elif +\n\\endif\n" } ],
[ 'else syntax error',
[qr{unexpected argument in command "else"}],
{ 'else-bad.sql' => "\\if 0\n\\else BAD\n\\endif\n" } ],
[ 'endif syntax error',
[qr{unexpected argument in command "endif"}],
{ 'endif-bad.sql' => "\\if 0\n\\endif BAD\n" } ],);
for my $t (@script_tests)
{
my ($name, $err, $files) = @$t;
pgbench_scripts('', 1, [qr{^$}], $err, 'pgbench option error: ' . $name, $files);
pgbench_scripts('', 1, [qr{^$}], $err, 'pgbench option error: ' . $name,
$files);
}
done_testing();
......@@ -16,4 +16,5 @@ $node->init;
$node->start;
# use a long timeout for the benefit of very slow buildfarm machines
$node->command_ok([qw(pg_isready --timeout=60)], 'succeeds with server running');
$node->command_ok([qw(pg_isready --timeout=60)],
'succeeds with server running');
......@@ -36,13 +36,17 @@ $node->issues_sql_like(
$node->command_ok([qw(vacuumdb -Z --table=pg_am dbname=template1)],
'vacuumdb with connection string');
$node->command_fails([qw(vacuumdb -Zt pg_am;ABORT postgres)],
$node->command_fails(
[qw(vacuumdb -Zt pg_am;ABORT postgres)],
'trailing command in "-t", without COLUMNS');
# Unwanted; better if it failed.
$node->command_ok([qw(vacuumdb -Zt pg_am(amname);ABORT postgres)],
$node->command_ok(
[qw(vacuumdb -Zt pg_am(amname);ABORT postgres)],
'trailing command in "-t", with COLUMNS');
$node->safe_psql('postgres', q|
$node->safe_psql(
'postgres', q|
CREATE TABLE "need""q(uot" (")x" text);
CREATE FUNCTION f0(int) RETURNS int LANGUAGE SQL AS 'SELECT $1 * $1';
......@@ -53,5 +57,6 @@ $node->safe_psql('postgres', q|
|);
$node->command_ok([qw|vacuumdb -Z --table="need""q(uot"(")x") postgres|],
'column list');
$node->command_fails([qw|vacuumdb -Zt funcidx postgres|],
$node->command_fails(
[qw|vacuumdb -Zt funcidx postgres|],
'unqualifed name via functional index');
......@@ -15,11 +15,11 @@ while (<>)
next if /^CATALOG\(.*BKI_BOOTSTRAP/;
next
unless /\boid *=> *'(\d+)'/
|| /^CATALOG\([^,]*, *(\d+).*BKI_ROWTYPE_OID\((\d+),/
|| /^CATALOG\([^,]*, *(\d+)/
|| /^DECLARE_INDEX\([^,]*, *(\d+)/
|| /^DECLARE_UNIQUE_INDEX\([^,]*, *(\d+)/
|| /^DECLARE_TOAST\([^,]*, *(\d+), *(\d+)/;
|| /^CATALOG\([^,]*, *(\d+).*BKI_ROWTYPE_OID\((\d+),/
|| /^CATALOG\([^,]*, *(\d+)/
|| /^DECLARE_INDEX\([^,]*, *(\d+)/
|| /^DECLARE_UNIQUE_INDEX\([^,]*, *(\d+)/
|| /^DECLARE_TOAST\([^,]*, *(\d+), *(\d+)/;
$oidcounts{$1}++;
$oidcounts{$2}++ if $2;
}
......
......@@ -73,7 +73,7 @@ foreach my $datfile (@input_files)
my $header = "$1.h";
die "There in no header file corresponding to $datfile"
if ! -e $header;
if !-e $header;
my $catalog = Catalog::ParseHeader($header);
my $catname = $catalog->{catname};
......@@ -186,7 +186,7 @@ sub strip_default_values
{
my $attname = $column->{name};
die "strip_default_values: $catname.$attname undefined\n"
if ! defined $row->{$attname};
if !defined $row->{$attname};
# Delete values that match defaults.
if (defined $column->{default}
......@@ -196,8 +196,9 @@ sub strip_default_values
}
# Also delete pg_proc.pronargs, since that can be recomputed.
if ($catname eq 'pg_proc' && $attname eq 'pronargs' &&
defined($row->{proargtypes}))
if ( $catname eq 'pg_proc'
&& $attname eq 'pronargs'
&& defined($row->{proargtypes}))
{
delete $row->{$attname};
}
......@@ -210,7 +211,7 @@ sub strip_default_values
# data files.
sub format_hash
{
my $data = shift;
my $data = shift;
my @orig_attnames = @_;
# Copy attname to new array if it has a value, so we can determine
......@@ -228,7 +229,7 @@ sub format_hash
my $char_count = 1;
my $threshold;
my $hash_str = '';
my $hash_str = '';
my $element_count = 0;
foreach my $attname (@attnames)
......@@ -262,7 +263,7 @@ sub format_hash
# Include a leading space in the key-value pair, since this will
# always go after either a comma or an additional padding space on
# the next line.
my $element = " $attname => '$value'";
my $element = " $attname => '$value'";
my $element_length = length($element);
# If adding the element to the current line would expand the line
......
......@@ -17,12 +17,12 @@ my ($krb5_bin_dir, $krb5_sbin_dir);
if ($^O eq 'darwin')
{
$krb5_bin_dir = '/usr/local/opt/krb5/bin';
$krb5_bin_dir = '/usr/local/opt/krb5/bin';
$krb5_sbin_dir = '/usr/local/opt/krb5/sbin';
}
elsif ($^O eq 'freebsd')
{
$krb5_bin_dir = '/usr/local/bin';
$krb5_bin_dir = '/usr/local/bin';
$krb5_sbin_dir = '/usr/local/sbin';
}
elsif ($^O eq 'linux')
......@@ -30,45 +30,48 @@ elsif ($^O eq 'linux')
$krb5_sbin_dir = '/usr/sbin';
}
my $krb5_config = 'krb5-config';
my $kinit = 'kinit';
my $kdb5_util = 'kdb5_util';
my $krb5_config = 'krb5-config';
my $kinit = 'kinit';
my $kdb5_util = 'kdb5_util';
my $kadmin_local = 'kadmin.local';
my $krb5kdc = 'krb5kdc';
my $krb5kdc = 'krb5kdc';
if ($krb5_bin_dir && -d $krb5_bin_dir)
{
$krb5_config = $krb5_bin_dir . '/' . $krb5_config;
$kinit = $krb5_bin_dir . '/' . $kinit;
$kinit = $krb5_bin_dir . '/' . $kinit;
}
if ($krb5_sbin_dir && -d $krb5_sbin_dir)
{
$kdb5_util = $krb5_sbin_dir . '/' . $kdb5_util;
$kdb5_util = $krb5_sbin_dir . '/' . $kdb5_util;
$kadmin_local = $krb5_sbin_dir . '/' . $kadmin_local;
$krb5kdc = $krb5_sbin_dir . '/' . $krb5kdc;
$krb5kdc = $krb5_sbin_dir . '/' . $krb5kdc;
}
my $realm = 'EXAMPLE.COM';
my $krb5_conf = "${TestLib::tmp_check}/krb5.conf";
my $kdc_conf = "${TestLib::tmp_check}/kdc.conf";
my $krb5_log = "${TestLib::tmp_check}/krb5libs.log";
my $kdc_log = "${TestLib::tmp_check}/krb5kdc.log";
my $kdc_port = int(rand() * 16384) + 49152;
my $krb5_conf = "${TestLib::tmp_check}/krb5.conf";
my $kdc_conf = "${TestLib::tmp_check}/kdc.conf";
my $krb5_log = "${TestLib::tmp_check}/krb5libs.log";
my $kdc_log = "${TestLib::tmp_check}/krb5kdc.log";
my $kdc_port = int(rand() * 16384) + 49152;
my $kdc_datadir = "${TestLib::tmp_check}/krb5kdc";
my $kdc_pidfile = "${TestLib::tmp_check}/krb5kdc.pid";
my $keytab = "${TestLib::tmp_check}/krb5.keytab";
my $keytab = "${TestLib::tmp_check}/krb5.keytab";
note "setting up Kerberos";
my ($stdout, $krb5_version);
run_log [ $krb5_config, '--version' ], '>', \$stdout or BAIL_OUT("could not execute krb5-config");
run_log [ $krb5_config, '--version' ], '>', \$stdout
or BAIL_OUT("could not execute krb5-config");
BAIL_OUT("Heimdal is not supported") if $stdout =~ m/heimdal/;
$stdout =~ m/Kerberos 5 release ([0-9]+\.[0-9]+)/ or BAIL_OUT("could not get Kerberos version");
$stdout =~ m/Kerberos 5 release ([0-9]+\.[0-9]+)/
or BAIL_OUT("could not get Kerberos version");
$krb5_version = $1;
append_to_file($krb5_conf,
qq![logging]
append_to_file(
$krb5_conf,
qq![logging]
default = FILE:$krb5_log
kdc = FILE:$kdc_log
......@@ -80,27 +83,32 @@ $realm = {
kdc = localhost:$kdc_port
}!);
append_to_file($kdc_conf,
qq![kdcdefaults]
append_to_file(
$kdc_conf,
qq![kdcdefaults]
!);
# For new-enough versions of krb5, use the _listen settings rather
# than the _ports settings so that we can bind to localhost only.
if ($krb5_version >= 1.15)
{
append_to_file($kdc_conf,
qq!kdc_listen = localhost:$kdc_port
append_to_file(
$kdc_conf,
qq!kdc_listen = localhost:$kdc_port
kdc_tcp_listen = localhost:$kdc_port
!);
}
else
{
append_to_file($kdc_conf,
qq!kdc_ports = $kdc_port
append_to_file(
$kdc_conf,
qq!kdc_ports = $kdc_port
kdc_tcp_ports = $kdc_port
!);
}
append_to_file($kdc_conf,
qq!
append_to_file(
$kdc_conf,
qq!
[realms]
$realm = {
database_name = $kdc_datadir/principal
......@@ -111,7 +119,7 @@ $realm = {
mkdir $kdc_datadir or die;
$ENV{'KRB5_CONFIG'} = $krb5_conf;
$ENV{'KRB5_CONFIG'} = $krb5_conf;
$ENV{'KRB5_KDC_PROFILE'} = $kdc_conf;
my $service_principal = "$ENV{with_krb_srvnam}/localhost";
......@@ -128,7 +136,7 @@ system_or_bail $krb5kdc, '-P', $kdc_pidfile;
END
{
kill 'INT', `cat $kdc_pidfile` if -f $kdc_pidfile;
kill 'INT', `cat $kdc_pidfile` if -f $kdc_pidfile;
}
note "setting up PostgreSQL instance";
......@@ -148,9 +156,12 @@ sub test_access
my ($node, $role, $expected_res, $test_name) = @_;
# need to connect over TCP/IP for Kerberos
my $res = $node->psql('postgres', 'SELECT 1',
extra_params => [ '-d', $node->connstr('postgres').' host=localhost',
'-U', $role ]);
my $res = $node->psql(
'postgres',
'SELECT 1',
extra_params => [
'-d', $node->connstr('postgres') . ' host=localhost',
'-U', $role ]);
is($res, $expected_res, $test_name);
}
......@@ -171,7 +182,8 @@ test_access($node, 'test1', 0, 'succeeds with mapping');
truncate($node->data_dir . '/pg_ident.conf', 0);
unlink($node->data_dir . '/pg_hba.conf');
$node->append_conf('pg_hba.conf', qq{host all all localhost gss include_realm=0});
$node->append_conf('pg_hba.conf',
qq{host all all localhost gss include_realm=0});
$node->restart;
test_access($node, 'test1', 0, 'succeeds with include_realm=0');
This diff is collapsed.
......@@ -15,25 +15,27 @@ $node->start;
$node->safe_psql('postgres', 'create extension pageinspect');
# Create a table with an autosummarizing BRIN index
$node->safe_psql('postgres',
$node->safe_psql(
'postgres',
'create table brin_wi (a int) with (fillfactor = 10);
create index brin_wi_idx on brin_wi using brin (a) with (pages_per_range=1, autosummarize=on);
'
);
my $count = $node->safe_psql('postgres',
"select count(*) from brin_page_items(get_raw_page('brin_wi_idx', 2), 'brin_wi_idx'::regclass)"
"select count(*) from brin_page_items(get_raw_page('brin_wi_idx', 2), 'brin_wi_idx'::regclass)"
);
is($count, '1', "initial index state is correct");
$node->safe_psql('postgres',
'insert into brin_wi select * from generate_series(1, 100)');
$node->poll_query_until('postgres',
"select count(*) > 1 from brin_page_items(get_raw_page('brin_wi_idx', 2), 'brin_wi_idx'::regclass)",
$node->poll_query_until(
'postgres',
"select count(*) > 1 from brin_page_items(get_raw_page('brin_wi_idx', 2), 'brin_wi_idx'::regclass)",
't');
$count = $node->safe_psql('postgres',
"select count(*) > 1 from brin_page_items(get_raw_page('brin_wi_idx', 2), 'brin_wi_idx'::regclass)"
"select count(*) > 1 from brin_page_items(get_raw_page('brin_wi_idx', 2), 'brin_wi_idx'::regclass)"
);
is($count, 't', "index got summarized");
$node->stop;
This diff is collapsed.
......@@ -284,7 +284,7 @@ sub group_access
my $dir_stat = stat($self->data_dir);
defined($dir_stat)
or die('unable to stat ' . $self->data_dir);
or die('unable to stat ' . $self->data_dir);
return (S_IMODE($dir_stat->mode) == 0750);
}
......@@ -482,8 +482,8 @@ sub init
}
close $conf;
chmod($self->group_access ? 0640 : 0600, "$pgdata/postgresql.conf")
or die("unable to set permissions for $pgdata/postgresql.conf");
chmod($self->group_access ? 0640 : 0600, "$pgdata/postgresql.conf")
or die("unable to set permissions for $pgdata/postgresql.conf");
$self->set_replication_conf if $params{allows_streaming};
$self->enable_archiving if $params{has_archiving};
......@@ -510,8 +510,8 @@ sub append_conf
TestLib::append_to_file($conffile, $str . "\n");
chmod($self->group_access() ? 0640 : 0600, $conffile)
or die("unable to set permissions for $conffile");
chmod($self->group_access() ? 0640 : 0600, $conffile)
or die("unable to set permissions for $conffile");
}
=pod
......@@ -1535,7 +1535,7 @@ sub wait_for_catchup
}
else
{
$lsn_expr = 'pg_current_wal_lsn()'
$lsn_expr = 'pg_current_wal_lsn()';
}
print "Waiting for replication conn "
. $standby_name . "'s "
......@@ -1686,8 +1686,8 @@ to check for timeout. retval is undef on timeout.
sub pg_recvlogical_upto
{
my ($self, $dbname, $slot_name, $endpos, $timeout_secs, %plugin_options) =
@_;
my ($self, $dbname, $slot_name, $endpos, $timeout_secs, %plugin_options)
= @_;
my ($stdout, $stderr);
my $timeout_exception = 'pg_recvlogical timed out';
......
......@@ -71,7 +71,7 @@ sub copypath
{
croak "if specified, filterfn must be a subroutine reference"
unless defined(ref $params{filterfn})
and (ref $params{filterfn} eq 'CODE');
and (ref $params{filterfn} eq 'CODE');
$filterfn = $params{filterfn};
}
......
......@@ -169,16 +169,17 @@ sub tempdir_short
# not under msys, return the input argument unchanged.
sub real_dir
{
my $dir = "$_[0]";
return $dir unless -d $dir;
return $dir unless $Config{osname} eq 'msys';
my $here = cwd;
chdir $dir;
my $dir = "$_[0]";
return $dir unless -d $dir;
return $dir unless $Config{osname} eq 'msys';
my $here = cwd;
chdir $dir;
# this odd way of calling 'pwd -W' is the only way that seems to work.
$dir = qx{sh -c "pwd -W"};
chomp $dir;
chdir $here;
return $dir;
$dir = qx{sh -c "pwd -W"};
chomp $dir;
chdir $here;
return $dir;
}
sub system_log
......@@ -254,12 +255,9 @@ sub check_mode_recursive
# Result defaults to true
my $result = 1;
find
(
{follow_fast => 1,
wanted =>
sub
{
find(
{ follow_fast => 1,
wanted => sub {
my $file_stat = stat($File::Find::name);
# Is file in the ignore list?
......@@ -272,7 +270,7 @@ sub check_mode_recursive
}
defined($file_stat)
or die("unable to stat $File::Find::name");
or die("unable to stat $File::Find::name");
my $file_mode = S_IMODE($file_stat->mode);
......@@ -281,35 +279,39 @@ sub check_mode_recursive
{
if ($file_mode != $expected_file_mode)
{
print(*STDERR,
print(
*STDERR,
sprintf("$File::Find::name mode must be %04o\n",
$expected_file_mode));
$expected_file_mode));
$result = 0;
return;
}
}
# Else a directory?
elsif (S_ISDIR($file_stat->mode))
{
if ($file_mode != $expected_dir_mode)
{
print(*STDERR,
print(
*STDERR,
sprintf("$File::Find::name mode must be %04o\n",
$expected_dir_mode));
$expected_dir_mode));
$result = 0;
return;
}
}
# Else something we can't handle
else
{
die "unknown file type for $File::Find::name";
}
}},
$dir
);
}
},
$dir);
return $result;
}
......@@ -319,23 +321,21 @@ sub chmod_recursive
{
my ($dir, $dir_mode, $file_mode) = @_;
find
(
{follow_fast => 1,
wanted =>
sub
{
find(
{ follow_fast => 1,
wanted => sub {
my $file_stat = stat($File::Find::name);
if (defined($file_stat))
{
chmod(S_ISDIR($file_stat->mode) ? $dir_mode : $file_mode,
$File::Find::name)
or die "unable to chmod $File::Find::name";
chmod(
S_ISDIR($file_stat->mode) ? $dir_mode : $file_mode,
$File::Find::name
) or die "unable to chmod $File::Find::name";
}
}},
$dir
);
}
},
$dir);
}
# Check presence of a given regexp within pg_config.h for the installation
......@@ -351,7 +351,7 @@ sub check_pg_config
chomp($stdout);
open my $pg_config_h, '<', "$stdout/pg_config.h" or die "$!";
my $match = (grep {/^$regexp/} <$pg_config_h>);
my $match = (grep { /^$regexp/ } <$pg_config_h>);
close $pg_config_h;
return $match;
}
......
......@@ -80,8 +80,7 @@ is($stdout_recv, $expected,
$node_master->poll_query_until('postgres',
"SELECT EXISTS (SELECT 1 FROM pg_replication_slots WHERE slot_name = 'test_slot' AND active_pid IS NULL)"
)
or die "slot never became inactive";
) or die "slot never became inactive";
$stdout_recv = $node_master->pg_recvlogical_upto(
'postgres', 'test_slot', $endpos, 10,
......
......@@ -333,9 +333,9 @@ $cur_master->psql(
# Ensure that last transaction is replayed on standby.
my $cur_master_lsn =
$cur_master->safe_psql('postgres', "SELECT pg_current_wal_lsn()");
$cur_master->safe_psql('postgres', "SELECT pg_current_wal_lsn()");
my $caughtup_query =
"SELECT '$cur_master_lsn'::pg_lsn <= pg_last_wal_replay_lsn()";
"SELECT '$cur_master_lsn'::pg_lsn <= pg_last_wal_replay_lsn()";
$cur_standby->poll_query_until('postgres', $caughtup_query)
or die "Timed out while waiting for standby to catch up";
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -34,7 +34,7 @@ $node_publisher->wait_for_catchup($appname);
# Wait for initial sync to finish as well
my $synced_query =
"SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('s', 'r');";
"SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('s', 'r');";
$node_subscriber->poll_query_until('postgres', $synced_query)
or die "Timed out while waiting for subscriber to synchronize data";
......
This diff is collapsed.
......@@ -28,7 +28,8 @@ $node_subscriber->safe_psql('postgres',
$node_publisher->wait_for_catchup($appname);
$node_subscriber->safe_psql('postgres', q{
$node_subscriber->safe_psql(
'postgres', q{
BEGIN;
ALTER SUBSCRIPTION mysub DISABLE;
ALTER SUBSCRIPTION mysub SET (slot_name = NONE);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment