From f069af5d60587c93efd7c190706f08b81d6fad1f Mon Sep 17 00:00:00 2001 From: Christoph Berg Date: Mon, 23 Mar 2015 15:52:49 +0100 Subject: [PATCH 001/181] Query all sequences per DB in parallel for action=sequence action=sequence used to open a new session for every sequence checked, which could be very slow. Fix by creating a single SQL statement using UNION ALL to query all sequences at once. --- check_postgres.pl | 19 ++++++++++++------- t/02_sequence.t | 15 ++++++++++++++- t/CP_Testing.pm | 3 ++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/check_postgres.pl b/check_postgres.pl index 5f78bbb8..fbffae2c 100755 --- a/check_postgres.pl +++ b/check_postgres.pl @@ -7274,12 +7274,15 @@ sub check_sequence { my %seqinfo; my %seqperf; my $multidb = @{$info->{db}} > 1 ? "$db->{dbname}." : ''; - for my $r (@{$db->{slurp}}) { + my @seq_sql; + for my $r (@{$db->{slurp}}) { # for each sequence, create SQL command to inspect it my ($schema, $seq, $seqname, $typename) = @$r{qw/ nspname seqname safename typname /}; next if skip_item($seq); my $maxValue = $typename eq 'int2' ? $MAXINT2 : $typename eq 'int4' ? $MAXINT4 : $MAXINT8; - $SQL = qq{ -SELECT last_value, slots, used, ROUND(used/slots*100) AS percent, + my $seqname_l = $seqname; + $seqname_l =~ s/'/''/g; # SQL literal quoting (name is already identifier-quoted) + push @seq_sql, qq{ +SELECT '$seqname_l' AS seqname, last_value, slots, used, ROUND(used/slots*100) AS percent, CASE WHEN slots < used THEN 0 ELSE slots - used END AS numleft FROM ( SELECT last_value, @@ -7287,10 +7290,10 @@ sub check_sequence { CEIL((last_value-min_value::numeric+1)/increment_by::NUMERIC) AS used FROM $seqname) foo }; - - my $seqinfo = run_command($SQL, { target => $db }); - my $r2 = $seqinfo->{db}[0]{slurp}[0]; - my ($last, $slots, $used, $percent, $left) = @$r2{qw/ last_value slots used percent numleft / }; + } + my $seqinfo = run_command(join("\nUNION ALL\n", @seq_sql), { target => $db }); # execute all SQL commands at once + for my $r2 (@{$seqinfo->{db}[0]{slurp}}) { # now look at all results + my ($seqname, $last, $slots, $used, $percent, $left) = @$r2{qw/ seqname last_value slots used percent numleft / }; if (! defined $last) { ndie msg('seq-die', $seqname); } @@ -9825,6 +9828,8 @@ =head1 HISTORY Declare POD encoding to be utf8. (Christoph Berg) + Query all sequences per DB in parallel for action=sequence. (Christoph Berg) + =item B September 24, 2013 Fix issue with SQL steps in check_pgagent_jobs for sql steps which perform deletes diff --git a/t/02_sequence.t b/t/02_sequence.t index d42187f6..b1fa3ea3 100644 --- a/t/02_sequence.t +++ b/t/02_sequence.t @@ -6,7 +6,7 @@ use 5.006; use strict; use warnings; use Data::Dumper; -use Test::More tests => 10; +use Test::More tests => 12; use lib 't','.'; use CP_Testing; @@ -45,6 +45,7 @@ if ($ver < 80100) { my $seqname = 'cp_test_sequence'; $cp->drop_sequence_if_exists($seqname); $cp->drop_sequence_if_exists("${seqname}2"); +$cp->drop_sequence_if_exists("${seqname}'\"evil"); $t=qq{$S works when no sequences exist}; like ($cp->run(''), qr{OK:.+No sequences found}, $t); @@ -83,4 +84,16 @@ like ($cp->run('--critical=22%'), qr{CRITICAL:.+public.cp_test_sequence=33% \(ca $t=qq{$S returns correct information with MRTG output}; is ($cp->run('--critical=22% --output=mrtg'), "33\n0\n\npublic.cp_test_sequence\n", $t); +# create second sequence +$dbh->do("CREATE SEQUENCE ${seqname}2"); +$dbh->commit(); +$t=qq{$S returns correct information for two sequences}; +like ($cp->run(''), qr{OK:.+public.cp_test_sequence=33% .* \| .*${seqname}=33%.*${seqname}2=0%}, $t); + +# test SQL quoting +$dbh->do(qq{CREATE SEQUENCE "${seqname}'""evil"}); +$dbh->commit(); +$t=qq{$S handles SQL quoting}; +like ($cp->run(''), qr{OK:.+'public."${seqname}''""evil"'}, $t); # extra " and ' because name is both identifier+literal quoted + exit; diff --git a/t/CP_Testing.pm b/t/CP_Testing.pm index 28ff60b3..c473c9f7 100644 --- a/t/CP_Testing.pm +++ b/t/CP_Testing.pm @@ -700,7 +700,8 @@ sub drop_sequence_if_exists { $SQL = q{SELECT count(*) FROM pg_class WHERE relkind = 'S' AND relname = } . $dbh->quote($name); my $count = $dbh->selectall_arrayref($SQL)->[0][0]; if ($count) { - $dbh->do("DROP SEQUENCE $name"); + $name =~ s/"/""/g; + $dbh->do("DROP SEQUENCE \"$name\""); $dbh->commit(); } return; From c2d15dafc62c3a7498a10cf28f4e6c0fc1340987 Mon Sep 17 00:00:00 2001 From: Christoph Berg Date: Mon, 23 Mar 2015 16:38:18 +0100 Subject: [PATCH 002/181] Add tests for "serial" and "smallserial" columns The code was already there, but not covered by tests --- t/02_sequence.t | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/t/02_sequence.t b/t/02_sequence.t index b1fa3ea3..efce3a02 100644 --- a/t/02_sequence.t +++ b/t/02_sequence.t @@ -6,7 +6,7 @@ use 5.006; use strict; use warnings; use Data::Dumper; -use Test::More tests => 12; +use Test::More tests => 14; use lib 't','.'; use CP_Testing; @@ -43,9 +43,11 @@ if ($ver < 80100) { my $seqname = 'cp_test_sequence'; +my $testtbl = 'sequence_test'; $cp->drop_sequence_if_exists($seqname); $cp->drop_sequence_if_exists("${seqname}2"); $cp->drop_sequence_if_exists("${seqname}'\"evil"); +$cp->drop_table_if_exists("$testtbl"); $t=qq{$S works when no sequences exist}; like ($cp->run(''), qr{OK:.+No sequences found}, $t); @@ -96,4 +98,28 @@ $dbh->commit(); $t=qq{$S handles SQL quoting}; like ($cp->run(''), qr{OK:.+'public."${seqname}''""evil"'}, $t); # extra " and ' because name is both identifier+literal quoted +$dbh->do("DROP SEQUENCE ${seqname}"); +$dbh->do("DROP SEQUENCE ${seqname}2"); +$dbh->do(qq{DROP SEQUENCE "${seqname}'""evil"}); + +# test integer column where the datatype range is smaller than the serial range +$dbh->do("CREATE TABLE $testtbl (id serial)"); +$dbh->do("SELECT setval('${testtbl}_id_seq',2000000000)"); +$dbh->commit; +$t=qq{$S handles "serial" column}; +like ($cp->run(''), qr{WARNING:.+public.sequence_test_id_seq=93% \(calls left=147483647\)}, $t); + +if ($ver >= 90200) { + # test smallint column where the datatype range is even smaller (and while we are at it, test --exclude) + $dbh->do("ALTER TABLE $testtbl ADD COLUMN smallid smallserial"); + $dbh->do("SELECT setval('${testtbl}_smallid_seq',30000)"); + $dbh->commit; + $t=qq{$S handles "smallserial" column}; + like ($cp->run('--exclude=sequence_test_id_seq'), qr{WARNING:.+public.sequence_test_smallid_seq=92% \(calls left=2767\)}, $t); +} else { + SKIP: { + skip '"smallserial" needs PostgreSQL 9.2 or later', 2; + } +} + exit; From e3d43fece536cb8a5d5c717b7fb2843e8b576bcb Mon Sep 17 00:00:00 2001 From: glynastill Date: Fri, 20 Dec 2013 13:16:43 +0000 Subject: [PATCH 003/181] Change the way tables are quoted in replicate_row. Change the way tables are quoted in replicate_row to allow for tables with schema name. --- check_postgres.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_postgres.pl b/check_postgres.pl index fbffae2c..e1915ace 100755 --- a/check_postgres.pl +++ b/check_postgres.pl @@ -6149,7 +6149,7 @@ sub check_replicate_row { my ($table,$pk,$id,$col,$val1,$val2) = (@repinfo); ## Quote everything, just to be safe (e.g. columns named 'desc') - $table = qq{"$table"}; + $table =~ s/([^\.]+)/\"$1\"/g; $pk = qq{"$pk"}; $col = qq{"$col"}; From 7d56cc7dad04b05d965a28aa05764bc08314f166 Mon Sep 17 00:00:00 2001 From: glyn Date: Wed, 15 Apr 2015 10:53:31 +0100 Subject: [PATCH 004/181] Fix issues with latest changes to check_sequence and run_command: check_sequence - Split big UNION of sequence selects into chunks to avoid overrunning system argument size run_command - If we have specified a "target" database, skip all others in global targetdb list --- check_postgres.pl | 52 ++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/check_postgres.pl b/check_postgres.pl index e1915ace..a702ee43 100755 --- a/check_postgres.pl +++ b/check_postgres.pl @@ -2254,6 +2254,10 @@ sub run_command { if ($arg->{dbnumber} and $arg->{dbnumber} != $num) { next; } + ## Likewise if we have specified "target" database info and this is not our choice + if ($arg->{target} and $arg->{target} != $db) { + next; + } ## Just to keep things clean: truncate $tempfh, 0; @@ -7291,30 +7295,34 @@ sub check_sequence { FROM $seqname) foo }; } - my $seqinfo = run_command(join("\nUNION ALL\n", @seq_sql), { target => $db }); # execute all SQL commands at once - for my $r2 (@{$seqinfo->{db}[0]{slurp}}) { # now look at all results - my ($seqname, $last, $slots, $used, $percent, $left) = @$r2{qw/ seqname last_value slots used percent numleft / }; - if (! defined $last) { - ndie msg('seq-die', $seqname); - } - my $msg = msg('seq-msg', $seqname, $percent, $left); - my $nicename = perfname("$multidb$seqname"); - $seqperf{$percent}{$seqname} = [$left, " $nicename=$percent%;$w%;$c%"]; - if ($percent >= $maxp) { - $maxp = $percent; - if (! exists $opt{perflimit} or $limit++ < $opt{perflimit}) { - push @{$seqinfo{$percent}} => $MRTG ? [$seqname,$percent,$slots,$used,$left] : $msg; + # Use UNION ALL to query multiple sequences at once, however if there are too many sequences this can exceed + # maximum argument length; so split into chunks of 200 sequences or less and iterate over them. + while (my @seq_sql_chunk = splice @seq_sql, 0, 200) { + my $seqinfo = run_command(join("\nUNION ALL\n", @seq_sql_chunk), { target => $db }); # execute all SQL commands at once + for my $r2 (@{$seqinfo->{db}[0]{slurp}}) { # now look at all results + my ($seqname, $last, $slots, $used, $percent, $left) = @$r2{qw/ seqname last_value slots used percent numleft / }; + if (! defined $last) { + ndie msg('seq-die', $seqname); } - } - next if $MRTG; + my $msg = msg('seq-msg', $seqname, $percent, $left); + my $nicename = perfname("$multidb$seqname"); + $seqperf{$percent}{$seqname} = [$left, " $nicename=$percent%;$w%;$c%"]; + if ($percent >= $maxp) { + $maxp = $percent; + if (! exists $opt{perflimit} or $limit++ < $opt{perflimit}) { + push @{$seqinfo{$percent}} => $MRTG ? [$seqname,$percent,$slots,$used,$left] : $msg; + } + } + next if $MRTG; - if (length $critical and $percent >= $c) { - push @crit => $msg; - } - elsif (length $warning and $percent >= $w) { - push @warn => $msg; + if (length $critical and $percent >= $c) { + push @crit => $msg; + } + elsif (length $warning and $percent >= $w) { + push @warn => $msg; + } } - } + } if ($MRTG) { my $msg = join ' | ' => map { $_->[0] } @{$seqinfo{$maxp}}; do_mrtg({one => $maxp, msg => $msg}); @@ -7958,8 +7966,6 @@ sub check_wal_files { } ## end of check_wal_files - - =pod =encoding utf8 From da35d417cabd4585cd2db1d00b78e07e31cf43e6 Mon Sep 17 00:00:00 2001 From: Greg Sabino Mullane Date: Thu, 7 May 2015 23:54:00 -0400 Subject: [PATCH 005/181] Bump copyright --- README | 4 ++-- check_postgres.pl | 2 +- check_postgres.pl.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README b/README index 82028cae..9063c8dd 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -check_postgres is Copyright (C) 2007-2013, Greg Sabino Mullane +check_postgres is Copyright (C) 2007-2015, Greg Sabino Mullane This is check_postgres, a monitoring tool for Postgres. @@ -76,7 +76,7 @@ https://mail.endcrypt.com/mailman/listinfo/check_postgres-commit COPYRIGHT: ---------- - Copyright (c) 2007-2013 Greg Sabino Mullane + Copyright (c) 2007-2015 Greg Sabino Mullane LICENSE INFORMATION: diff --git a/check_postgres.pl b/check_postgres.pl index a702ee43..f8da6b8a 100755 --- a/check_postgres.pl +++ b/check_postgres.pl @@ -10555,7 +10555,7 @@ =head1 NAGIOS EXAMPLES =head1 LICENSE AND COPYRIGHT -Copyright (c) 2007-2013 Greg Sabino Mullane . +Copyright (c) 2007-2015 Greg Sabino Mullane . Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/check_postgres.pl.html b/check_postgres.pl.html index 9ba2625b..d06da4cc 100644 --- a/check_postgres.pl.html +++ b/check_postgres.pl.html @@ -2703,7 +2703,7 @@

NAGIOS EXAMPLES


LICENSE AND COPYRIGHT

-

Copyright (c) 2007-2013 Greg Sabino Mullane <greg@endpoint.com>.

+

Copyright (c) 2007-2015 Greg Sabino Mullane <greg@endpoint.com>.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:


From 4cea93ea51fceb532c4b07b70c18eeb412aaeed7 Mon Sep 17 00:00:00 2001
From: Greg Sabino Mullane 
Date: Tue, 26 May 2015 22:02:30 -0400
Subject: [PATCH 006/181] Remove tabs, cleanup whitespace

---
 check_postgres.pl | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/check_postgres.pl b/check_postgres.pl
index f8da6b8a..a7a2a767 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -2254,10 +2254,10 @@ sub run_command {
         if ($arg->{dbnumber} and $arg->{dbnumber} != $num) {
             next;
         }
-	## Likewise if we have specified "target" database info and this is not our choice
-	if ($arg->{target} and $arg->{target} != $db) {
+        ## Likewise if we have specified "target" database info and this is not our choice
+        if ($arg->{target} and $arg->{target} != $db) {
             next;
-	}
+        }
 
         ## Just to keep things clean:
         truncate $tempfh, 0;
@@ -7295,9 +7295,9 @@ sub check_sequence {
 FROM $seqname) foo
 };
         }
-	# Use UNION ALL to query multiple sequences at once, however if there are too many sequences this can exceed
+        # Use UNION ALL to query multiple sequences at once, however if there are too many sequences this can exceed
         # maximum argument length; so split into chunks of 200 sequences or less and iterate over them.
-	while (my @seq_sql_chunk = splice @seq_sql, 0, 200) {
+        while (my @seq_sql_chunk = splice @seq_sql, 0, 200) {
             my $seqinfo = run_command(join("\nUNION ALL\n", @seq_sql_chunk), { target => $db }); # execute all SQL commands at once
             for my $r2 (@{$seqinfo->{db}[0]{slurp}}) { # now look at all results
                 my ($seqname, $last, $slots, $used, $percent, $left) = @$r2{qw/ seqname last_value slots used percent numleft / };
@@ -7322,7 +7322,7 @@ sub check_sequence {
                     push @warn => $msg;
                 }
             }
-	}
+        }
         if ($MRTG) {
             my $msg = join ' | ' => map { $_->[0] } @{$seqinfo{$maxp}};
             do_mrtg({one => $maxp, msg => $msg});

From 776408aab47f29e4f7f47bf4d515671d7736ab08 Mon Sep 17 00:00:00 2001
From: Greg Sabino Mullane 
Date: Tue, 23 Jun 2015 09:09:07 -0400
Subject: [PATCH 007/181] Version bump.

---
 check_postgres.pl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/check_postgres.pl b/check_postgres.pl
index a7a2a767..df143576 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -32,7 +32,7 @@ package check_postgres;
 
 binmode STDOUT, ':encoding(UTF-8)';
 
-our $VERSION = '2.21.0';
+our $VERSION = '2.21.1';
 
 use vars qw/ %opt $PGBINDIR $PSQL $res $COM $SQL $db /;
 

From 51c6991862c9b24da0bfaa5917c1597db12ff495 Mon Sep 17 00:00:00 2001
From: Greg Sabino Mullane 
Date: Tue, 23 Jun 2015 09:16:26 -0400
Subject: [PATCH 008/181] Update release notes a bit

---
 check_postgres.pl | 34 +++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/check_postgres.pl b/check_postgres.pl
index df143576..42f1ab07 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -7974,7 +7974,7 @@ =head1 NAME
 
 B - a Postgres monitoring script for Nagios, MRTG, Cacti, and others
 
-This documents describes check_postgres.pl version 2.21.0
+This documents describes check_postgres.pl version 2.21.1
 
 =head1 SYNOPSIS
 
@@ -9832,20 +9832,44 @@ =head1 HISTORY
   Add explicit ORDER BY to the slony_status check to get the most lagged server.
     (Jeff Frost)
 
-  Declare POD encoding to be utf8. (Christoph Berg)
+  Change the way tables are quoted in replicate_row.
+    (Glyn Astill)
 
-  Query all sequences per DB in parallel for action=sequence. (Christoph Berg)
+  Improved multi-slave support in replicate_row.
+    (Andrew Yochum)
+
+  Add xact timestamp support to hot_standby_delay.
+  Allow the hot_standby_delay check to accept xlog byte position or
+  timestamp lag intervals as thresholds, or even both at the same time.
+    (Josh Williams)
+
+  Fix and extend hot_standby_delay documentation
+    (Michael Renner)
+
+  Don't swallow space before the -c flag when reporting errors
+    (Jeff Janes)
+
+  Show actual long-running query in query_time output
+    (Peter Eisentraut)
+
+  Declare POD encoding to be utf8.
+    (Christoph Berg)
+
+  Query all sequences per DB in parallel for action=sequence.
+    (Christoph Berg)
 
 =item B September 24, 2013
 
   Fix issue with SQL steps in check_pgagent_jobs for sql steps which perform deletes
     (Rob Emery via github pull)
 
-  Install man page in section 1. (Peter Eisentraut, bug 53, github issue 26)
+  Install man page in section 1.
+    (Peter Eisentraut, bug 53, github issue 26)
 
   Order lock types in check_locks output to make the ordering predictable;
   setting SKIP_NETWORK_TESTS will skip the new_version tests; other minor test
-  suite fixes. (Christoph Berg)
+  suite fixes.
+    (Christoph Berg)
 
   Fix same_schema check on 9.3 by ignoring relminmxid differences in pg_class
     (Christoph Berg)

From 791a17ff1b662b1b6d4d3e5261bfdc3aac313731 Mon Sep 17 00:00:00 2001
From: Christoph Berg 
Date: Tue, 23 Jun 2015 16:26:10 +0200
Subject: [PATCH 009/181] Fix t/02_sequence.t for PG 9.0/1

---
 t/02_sequence.t | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/t/02_sequence.t b/t/02_sequence.t
index efce3a02..1111d895 100644
--- a/t/02_sequence.t
+++ b/t/02_sequence.t
@@ -118,7 +118,7 @@ if ($ver >= 90200) {
     like ($cp->run('--exclude=sequence_test_id_seq'), qr{WARNING:.+public.sequence_test_smallid_seq=92% \(calls left=2767\)}, $t);
 } else {
     SKIP: {
-        skip '"smallserial" needs PostgreSQL 9.2 or later', 2;
+        skip '"smallserial" needs PostgreSQL 9.2 or later', 1;
     }
 }
 

From 60af9f27721d62219a5ef220feff02ae7e8b79b1 Mon Sep 17 00:00:00 2001
From: Christoph Berg 
Date: Tue, 23 Jun 2015 16:35:31 +0200
Subject: [PATCH 010/181] Fix txn_time regression test for 9.0/9.1

Newer versions will show the last or current query here, older versions
will just show " in transaction" if there is currently no
query running.
---
 t/02_txn_time.t | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/t/02_txn_time.t b/t/02_txn_time.t
index 8be2fa18..d743fe1f 100644
--- a/t/02_txn_time.t
+++ b/t/02_txn_time.t
@@ -76,7 +76,8 @@ sleep(1);
 like ($cp->run(q{-w 0}), qr{longest txn: 1s}, $t);
 
 $t .= ' (MRTG)';
-like ($cp->run(q{--output=mrtg -w 0}), qr{\d+\n0\n\nPID:\d+ database:$dbname username:\w+ query:SELECT 1\n}, $t);
+my $query_patten = ($ver >= 90200) ? "SELECT 1" : " in transaction";
+like ($cp->run(q{--output=mrtg -w 0}), qr{\d+\n0\n\nPID:\d+ database:$dbname username:\w+ query:$query_patten\n}, $t);
 
 $idle_dbh->commit;
 

From efcff69ea7678ec264e814b3e515a09d1674db87 Mon Sep 17 00:00:00 2001
From: Greg Sabino Mullane 
Date: Fri, 26 Jun 2015 08:52:32 -0400
Subject: [PATCH 011/181] Rearrange recent changes in rough priority order

---
 check_postgres.pl | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/check_postgres.pl b/check_postgres.pl
index 42f1ab07..6bb63d31 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -9826,38 +9826,38 @@ =head1 HISTORY
 
 =item B
 
+  Add xact timestamp support to hot_standby_delay.
+  Allow the hot_standby_delay check to accept xlog byte position or
+  timestamp lag intervals as thresholds, or even both at the same time.
+    (Josh Williams)
+
+  Query all sequences per DB in parallel for action=sequence.
+    (Christoph Berg)
+
   Fix bloat check to use correct SQL depending on the server version.
     (Adrian Vondendriesch)
 
+  Show actual long-running query in query_time output
+    (Peter Eisentraut)
+
   Add explicit ORDER BY to the slony_status check to get the most lagged server.
     (Jeff Frost)
 
-  Change the way tables are quoted in replicate_row.
-    (Glyn Astill)
-
   Improved multi-slave support in replicate_row.
     (Andrew Yochum)
 
-  Add xact timestamp support to hot_standby_delay.
-  Allow the hot_standby_delay check to accept xlog byte position or
-  timestamp lag intervals as thresholds, or even both at the same time.
-    (Josh Williams)
-
-  Fix and extend hot_standby_delay documentation
-    (Michael Renner)
+  Change the way tables are quoted in replicate_row.
+    (Glyn Astill)
 
   Don't swallow space before the -c flag when reporting errors
     (Jeff Janes)
 
-  Show actual long-running query in query_time output
-    (Peter Eisentraut)
+  Fix and extend hot_standby_delay documentation
+    (Michael Renner)
 
   Declare POD encoding to be utf8.
     (Christoph Berg)
 
-  Query all sequences per DB in parallel for action=sequence.
-    (Christoph Berg)
-
 =item B September 24, 2013
 
   Fix issue with SQL steps in check_pgagent_jobs for sql steps which perform deletes

From d2412d5125ac991252f09ddf0aac17674feec10d Mon Sep 17 00:00:00 2001
From: Greg Sabino Mullane 
Date: Fri, 26 Jun 2015 09:18:02 -0400
Subject: [PATCH 012/181] Spelling

---
 check_postgres.pl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/check_postgres.pl b/check_postgres.pl
index 6bb63d31..2fd53ec4 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -8857,7 +8857,7 @@ =head2 B
 to it. The slave server must be in hot_standby (e.g. read only) mode, therefore the minimum version to use
 this action is Postgres 9.0. The I<--warning> and I<--critical> options are the delta between the xlog
 locations. Since these values are byte offsets in the WAL they should match the expected transaction volume
-of your application to prevent false postives or negatives.
+of your application to prevent false positives or negatives.
 
 The first "--dbname", "--host", and "--port", etc. options are considered the
 master; the second belongs to the slave.
@@ -8869,7 +8869,7 @@ =head2 B
 form 'I and I