Escape output of pg_amcheck test
authorPeter Eisentraut <peter@eisentraut.org>
Sat, 13 Jan 2024 19:29:01 +0000 (20:29 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Sat, 13 Jan 2024 19:32:18 +0000 (20:32 +0100)
The pg_amcheck test reports a skip message if the layout of the index
does not match expectations.  That message includes the bytes that
were expected and the ones that were found.  But the found ones are
arbitrary bytes, which can have funny effects on the terminal when
they are printed.  To avoid that, escape non-word characters before
printing.

Reviewed-by: Aleksander Alekseev <aleksander@timescale.com>
Discussion: https://www.postgresql.org/message-id/flat/3f96f079-64e5-468a-8a19-cb481f0d31e5%40eisentraut.org

src/bin/pg_amcheck/t/004_verify_heapam.pl

index 8c796ed2218cd882b9108a9b532c63a6a7a3c069..f6d2c5f7877d53e6836294a082b620b4b8fb670a 100644 (file)
@@ -367,10 +367,11 @@ for (my $tupidx = 0; $tupidx < $ROWCOUNT; $tupidx++)
        {
                close($file);    # ignore errors on close; we're exiting anyway
                $node->clean_node;
-               plan skip_all =>
-                 sprintf(
+               plan skip_all => sprintf(
                        "Page layout of index %d differs from our expectations: expected (%x, %x, \"%s\"), got (%x, %x, \"%s\")",
-                       $tupidx, 0xDEADF9F9, 0xDEADF9F9, "abcdefg", $a_1, $a_2, $b);
+                       $tupidx, 0xDEADF9F9, 0xDEADF9F9, "abcdefg", $a_1, $a_2,
+                       # escape non-word characters to avoid confusing the terminal
+                       $b =~ s{(\W)}{ sprintf '\x%02x', ord($1) }aegr);
                exit;
        }