While playing with pgbench, I found multiple "-M query_mode" can be
set more than once. For example,

$ pgbench -p 11002 -M extended -S -M prepared test
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 1
query mode: prepared
number of clients: 1
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
latency average = 0.490 ms
tps = 2040.372858 (including connections establishing)
tps = 3920.541599 (excluding connections establishing)

In this case the last "-M prepared" was chosen as the query mode. This
is sloppy because we cannot actually choose different -M at the same
time.

Attached is a patch to detect such an error.

Best regards,
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 81bc6d8a6e..d69478b8dd 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -464,6 +464,7 @@ typedef enum QueryMode
 
 static QueryMode querymode = QUERY_SIMPLE;
 static const char *QUERYMODE[] = {"simple", "extended", "prepared"};
+bool	query_mode_already_set = false;
 
 typedef struct
 {
@@ -5149,6 +5150,12 @@ main(int argc, char **argv)
 				}
 				break;
 			case 'M':
+				if (query_mode_already_set)
+				{
+					fprintf(stderr, "query mode (-M) already set\n");
+					exit(1);
+				}
+				query_mode_already_set = true;
 				benchmarking_option_set = true;
 				for (querymode = 0; querymode < NUM_QUERYMODE; querymode++)
 					if (strcmp(optarg, QUERYMODE[querymode]) == 0)

Reply via email to