From c2e5f60db160d74ba862023ec460ace938f4fb1c Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Fri, 27 Jul 2018 13:43:36 +0900
Subject: [PATCH] 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.
---
 src/bin/pgbench/exprparse.y                |  2 +-
 src/bin/pgbench/t/002_pgbench_no_server.pl | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

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 aa47710ace5..e82d3cb2429 100644
--- a/src/bin/pgbench/t/002_pgbench_no_server.pl
+++ b/src/bin/pgbench/t/002_pgbench_no_server.pl
@@ -266,6 +266,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)
-- 
GitLab