diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 9d18524834..24833f46bc 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -916,6 +916,8 @@ pgbench options d value can be inserted into a SQL command by writing :variablename. When running more than one client session, each session has its own set of variables. + pgbench supports up to 255 variable uses in one + statement. diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 5df54a8e57..4789ab92ee 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -476,7 +476,12 @@ typedef struct */ #define SQL_COMMAND 1 #define META_COMMAND 2 -#define MAX_ARGS 10 + +/* + * max number of backslash command arguments or SQL variables, + * including the command or SQL statement itself + */ +#define MAX_ARGS 256 typedef enum MetaCommand { @@ -4124,6 +4129,10 @@ parseQuery(Command *cmd) continue; } + /* + * cmd->argv[0] is the SQL statement itself, so the max number of + * arguments is one less than MAX_ARGS + */ if (cmd->argc >= MAX_ARGS) { fprintf(stderr, "statement has too many arguments (maximum is %d): %s\n", @@ -4461,6 +4470,10 @@ process_backslash_command(PsqlScanState sstate, const char *source) /* For all other commands, collect remaining words. */ while (expr_lex_one_word(sstate, &word_buf, &word_offset)) { + /* + * my_command->argv[0] is the command itself, so the max number of + * arguments is one less than MAX_ARGS + */ if (j >= MAX_ARGS) syntax_error(source, lineno, my_command->first_line, my_command->argv[0], "too many arguments", NULL, -1); diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index 930ff4ebb9..45888dc12e 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -597,11 +597,10 @@ my @errors = ( } ], [ - 'sql too many args', 1, [qr{statement has too many arguments.*\b9\b}], - q{-- MAX_ARGS=10 for prepared + 'sql too many args', 1, [qr{statement has too many arguments.*\b255\b}], + q{-- MAX_ARGS=256 for prepared \set i 0 -SELECT LEAST(:i, :i, :i, :i, :i, :i, :i, :i, :i, :i, :i); -} +SELECT LEAST(}.join(', ', (':i') x 256).q{)} ], # SHELL @@ -619,25 +618,8 @@ SELECT LEAST(:i, :i, :i, :i, :i, :i, :i, :i, :i, :i, :i); [ 'shell missing command', 1, [qr{missing command }], q{\shell} ], [ 'shell too many args', 1, [qr{too many arguments in command "shell"}], - q{-- 257 arguments to \shell -\shell echo \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F \ - 0 1 2 3 4 5 6 7 8 9 A B C D E F -} + q{-- 256 arguments to \shell +\shell echo }.join(' ', ('arg') x 255) ], # SET