From: Andy Fan Date: Tue, 2 Jun 2026 18:08:13 +0800 Subject: [PATCH v2 4/4] Let pgbench support binary format. --- src/bin/pgbench/pgbench.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 0b2bb9340b5..533a1732158 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -722,6 +722,16 @@ typedef enum QueryMode static QueryMode querymode = QUERY_SIMPLE; static const char *const QUERYMODE[] = {"simple", "extended", "prepared"}; +typedef enum ResultFormat +{ + RESULT_FORMAT_TEXT, + RESULT_FORMAT_BINARY, + NUM_RESULT_FORMAT +} ResultFormat; + +static ResultFormat result_format = RESULT_FORMAT_TEXT; +static const char *const RESULT_FORMAT[] = {"text", "binary"}; + /* * struct Command represents one command in a script. * @@ -965,6 +975,8 @@ usage(void) " --max-tries=NUM max number of tries to run transaction (default: 1)\n" " --progress-timestamp use Unix epoch timestamps for progress\n" " --random-seed=SEED set random seed (\"time\", \"rand\", integer)\n" + " --result-format=text|binary\n" + " result format for extended/prepared protocol (default: text)\n" " --sampling-rate=NUM fraction of transactions to log (e.g., 0.01 for 1%%)\n" " --show-script=NAME show builtin script code, then exit\n" " --verbose-errors print messages of all errors\n" @@ -3173,7 +3185,7 @@ sendCommand(CState *st, Command *command) pg_log_debug("client %d sending %s", st->id, sql); r = PQsendQueryParams(st->con, sql, command->argc - 1, - NULL, params, NULL, NULL, 0); + NULL, params, NULL, NULL, result_format); } else if (querymode == QUERY_PREPARED) { @@ -3184,7 +3196,7 @@ sendCommand(CState *st, Command *command) pg_log_debug("client %d sending %s", st->id, command->prepname); r = PQsendQueryPrepared(st->con, command->prepname, command->argc - 1, - params, NULL, NULL, 0); + params, NULL, NULL, result_format); } else /* unknown sql mode */ r = 0; @@ -6470,6 +6482,7 @@ printResults(StatsData *total, printf("partition method: %s\npartitions: %d\n", PARTITION_METHOD[partition_method], partitions); printf("query mode: %s\n", QUERYMODE[querymode]); + printf("result format: %s\n", RESULT_FORMAT[result_format]); printf("number of clients: %d\n", nclients); printf("number of threads: %d\n", nthreads); @@ -6778,6 +6791,7 @@ main(int argc, char **argv) {"exit-on-abort", no_argument, NULL, 16}, {"debug", no_argument, NULL, 17}, {"continue-on-error", no_argument, NULL, 18}, + {"result-format", required_argument, NULL, 19}, {NULL, 0, NULL, 0} }; @@ -7138,6 +7152,14 @@ main(int argc, char **argv) benchmarking_option_set = true; continue_on_error = true; break; + case 19: /* result-format */ + benchmarking_option_set = true; + for (result_format = 0; result_format < NUM_RESULT_FORMAT; result_format++) + if (strcmp(optarg, RESULT_FORMAT[result_format]) == 0) + break; + if (result_format >= NUM_RESULT_FORMAT) + pg_fatal("invalid result format: \"%s\"", optarg); + break; default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -7169,6 +7191,9 @@ main(int argc, char **argv) if (total_weight == 0 && !is_init_mode) pg_fatal("total script weight must not be zero"); + if (result_format == RESULT_FORMAT_BINARY && querymode == QUERY_SIMPLE) + pg_fatal("binary result format requires extended or prepared query mode"); + /* show per script stats if several scripts are used */ if (num_scripts > 1) per_script_stats = true; -- 2.43.0 --=-=-= Content-Type: application/gzip Content-Disposition: attachment; filename=test.tar.gz Content-Transfer-Encoding: base64 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 --=-=-=--