diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index f39f341a26..cc80b3fc4f 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -269,6 +269,7 @@ pgbench options dbname Add the specified builtin script to the list of executed scripts. Available builtin scripts are: tpcb-like, simple-update and select-only. + Unambiguous prefixes of builtin names are accepted. With special name list, show the list of builtin scripts and exit immediately. diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 66cfdc9af8..8b0b17a74c 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -2746,22 +2746,36 @@ listAvailableScripts(void) fprintf(stderr, "\n"); } +/* return builtin script "name" if unambiguous */ static char * findBuiltin(const char *name, char **desc) { - int i; + int i, + found = 0, + len = strlen(name); + char *commands = NULL; for (i = 0; i < N_BUILTIN; i++) { - if (strncmp(builtin_script[i].name, name, - strlen(builtin_script[i].name)) == 0) + if (strncmp(builtin_script[i].name, name, len) == 0) { *desc = builtin_script[i].desc; - return builtin_script[i].commands; + commands = builtin_script[i].commands; + found++; } } - fprintf(stderr, "no builtin script found for name \"%s\"\n", name); + /* ok, unambiguous result */ + if (found == 1) + return commands; + + /* error cases */ + if (found == 0) + fprintf(stderr, "no builtin script found for name \"%s\"\n", name); + else /* found > 1 */ + fprintf(stderr, + "ambiguous builtin name: %d builtin scripts found for prefix \"%s\"\n", found, name); + listAvailableScripts(); exit(1); }