pgbench: Add TAP tests to check consistency of data generated
authorMichael Paquier <[email protected]>
Sun, 23 Jul 2023 11:03:35 +0000 (20:03 +0900)
committerMichael Paquier <[email protected]>
Sun, 23 Jul 2023 11:03:35 +0000 (20:03 +0900)
The tables created by pgbench rely on a few assumptions for TPC-B, where
the "filler" attribute is used to comply with this benchmark's rules as
well as pgbencn historical behavior.  The data generated for each table
uses this filler in a different way:
- pgbench_accounts uses it as a blank-padded empty string.
- pgbench_tellers and pgbench_branches use it as a NULL value.

There were no checks done about the consistency of the data initialized,
and this has showed up while discussing a  that changes the logic
in charge of the client-side data generation (pgbench documents all that
already in its comments).  This commit adds some checks on the data
generated for both the server-side and client-side logic.

Reviewed-by: Tristan Partin
Discussion: https://postgr.es/m/[email protected]

src/bin/pgbench/t/001_pgbench_with_server.pl

index f8ca8a922d172da6b4e37b48b82bc05bb3dd9db3..142f966300aa81c726cc36f8b66d5c832729aa83 100644 (file)
@@ -8,6 +8,35 @@ use PostgreSQL::Test::Cluster;
 use PostgreSQL::Test::Utils;
 use Test::More;
 
+# Check the initial state of the data generated.  Tables for tellers and
+# branches use NULL for their filler attribute.  The table accounts uses
+# a non-NULL filler.  The history table should have no data.
+sub check_data_state
+{
+   local $Test::Builder::Level = $Test::Builder::Level + 1;
+   my $node = shift;
+   my $type = shift;
+
+   my $sql_result = $node->safe_psql('postgres',
+       'SELECT count(*) AS null_count FROM pgbench_accounts WHERE filler IS NULL LIMIT 10;'
+   );
+   is($sql_result, '0',
+       "$type: filler column of pgbench_accounts has no NULL data");
+   $sql_result = $node->safe_psql('postgres',
+       'SELECT count(*) AS null_count FROM pgbench_branches WHERE filler IS NULL;'
+   );
+   is($sql_result, '1',
+       "$type: filler column of pgbench_branches has only NULL data");
+   $sql_result = $node->safe_psql('postgres',
+       'SELECT count(*) AS null_count FROM pgbench_tellers WHERE filler IS NULL;'
+   );
+   is($sql_result, '10',
+       "$type: filler column of pgbench_tellers has only NULL data");
+   $sql_result = $node->safe_psql('postgres',
+       'SELECT count(*) AS data_count FROM pgbench_history;');
+   is($sql_result, '0', "$type: pgbench_history has no data");
+}
+
 # start a pgbench specific server
 my $node = PostgreSQL::Test::Cluster->new('main');
 # Set to untranslated messages, to be able to compare program output with
@@ -67,6 +96,9 @@ $node->pgbench(
    ],
    'pgbench scale 1 initialization',);
 
+# Check data state, after client-side data generation.
+check_data_state($node, 'client-side');
+
 # Again, with all possible options
 $node->pgbench(
    '--initialize --init-steps=dtpvg --scale=1 --unlogged-tables --fillfactor=98 --foreign-keys --quiet --tablespace=regress_pgbench_tap_1_ts --index-tablespace=regress_pgbench_tap_1_ts --partitions=2 --partition-method=hash',
@@ -101,6 +133,9 @@ $node->pgbench(
    ],
    'pgbench --init-steps');
 
+# Check data state, after server-side data generation.
+check_data_state($node, 'server-side');
+
 # Run all builtin scripts, for a few transactions each
 $node->pgbench(
    '--transactions=5 -Dfoo=bla --client=2 --protocol=simple --builtin=t'