aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2018-07-27 13:40:24 +0900
committerMichael Paquier <michael@paquier.xyz>2018-07-27 13:40:24 +0900
commit39d51fe87dae843574fa2349128679800bfe7ccd (patch)
treea81cd2dc72b8baad0e7d27c8eca78fd58f6708b1
parent9f77ad2672f1be0c475428db7bf52b572af3c65f (diff)
downloadpostgresql-39d51fe87dae843574fa2349128679800bfe7ccd.tar.gz
postgresql-39d51fe87dae843574fa2349128679800bfe7ccd.zip
Fix handling of pgbench's hash when no argument is provided
Depending on the platform used, this can cause a crash in the worst case, or an unhelpful error message, so fail gracefully. Author: Fabien Coelho Discussion: https://postgr.es/m/alpine.DEB.2.21.1807262302550.29874@lancre Backpatch: 11-, where hash() has been added in pgbench.
-rw-r--r--src/bin/pgbench/exprparse.y2
-rw-r--r--src/bin/pgbench/t/002_pgbench_no_server.pl20
2 files changed, 21 insertions, 1 deletions
diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y
index 66288632d11..f7c56cc6a31 100644
--- a/src/bin/pgbench/exprparse.y
+++ b/src/bin/pgbench/exprparse.y
@@ -467,7 +467,7 @@ make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args)
/* hash functions with optional seed argument */
case PGBENCH_NARGS_HASH:
- if (len > 2)
+ if (len < 1 || len > 2)
expr_yyerror_more(yyscanner, "unexpected number of arguments",
PGBENCH_FUNCTIONS[fnumber].fname);
diff --git a/src/bin/pgbench/t/002_pgbench_no_server.pl b/src/bin/pgbench/t/002_pgbench_no_server.pl
index a2845a583bd..c1c2c1e3d4a 100644
--- a/src/bin/pgbench/t/002_pgbench_no_server.pl
+++ b/src/bin/pgbench/t/002_pgbench_no_server.pl
@@ -270,6 +270,26 @@ my @script_tests = (
'endif syntax error',
[qr{unexpected argument in command "endif"}],
{ 'endif-bad.sql' => "\\if 0\n\\endif BAD\n" }
+ ],
+ [
+ 'not enough arguments for least',
+ [qr{at least one argument expected \(least\)}],
+ { 'bad-least.sql' => "\\set i least()\n" }
+ ],
+ [
+ 'not enough arguments for greatest',
+ [qr{at least one argument expected \(greatest\)}],
+ { 'bad-greatest.sql' => "\\set i greatest()\n" }
+ ],
+ [
+ 'not enough arguments for hash',
+ [qr{unexpected number of arguments \(hash\)}],
+ { 'bad-hash-1.sql' => "\\set i hash()\n" }
+ ],
+ [
+ 'too many arguments for hash',
+ [qr{unexpected number of arguments \(hash\)}],
+ { 'bad-hash-2.sql' => "\\set i hash(1,2,3)\n" }
],);
for my $t (@script_tests)