diff --git a/src/backend/parser/parse_param.c b/src/backend/parser/parse_param.c index dbf1a7dff08..b617591ef68 100644 --- a/src/backend/parser/parse_param.c +++ b/src/backend/parser/parse_param.c @@ -31,6 +31,7 @@ #include "parser/parse_param.h" #include "utils/builtins.h" #include "utils/lsyscache.h" +#include "utils/memutils.h" typedef struct FixedParamState @@ -136,7 +137,7 @@ variable_paramref_hook(ParseState *pstate, ParamRef *pref) Param *param; /* Check parameter number is in range */ - if (paramno <= 0 || paramno > INT_MAX / sizeof(Oid)) + if (paramno <= 0 || paramno > MaxAllocSize / sizeof(Oid)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_PARAMETER), errmsg("there is no parameter $%d", paramno), diff --git a/src/test/regress/expected/prepare.out b/src/test/regress/expected/prepare.out index 5815e17b39c..853cbed248e 100644 --- a/src/test/regress/expected/prepare.out +++ b/src/test/regress/expected/prepare.out @@ -184,6 +184,11 @@ SELECT name, statement, parameter_types, result_types FROM pg_prepared_statement | UPDATE tenk1 SET stringu1 = $2 WHERE unique1 = $1; | | (6 rows) +-- max parameter number and one above +PREPARE q9 AS SELECT $268435455, $268435456; +ERROR: there is no parameter $268435456 +LINE 1: PREPARE q9 AS SELECT $268435455, $268435456; + ^ -- test DEALLOCATE ALL; DEALLOCATE ALL; SELECT name, statement, parameter_types FROM pg_prepared_statements diff --git a/src/test/regress/sql/prepare.sql b/src/test/regress/sql/prepare.sql index c6098dc95ce..1536f802d5e 100644 --- a/src/test/regress/sql/prepare.sql +++ b/src/test/regress/sql/prepare.sql @@ -78,6 +78,9 @@ PREPARE q8 AS SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements ORDER BY name; +-- max parameter number and one above +PREPARE q9 AS SELECT $268435455, $268435456; + -- test DEALLOCATE ALL; DEALLOCATE ALL; SELECT name, statement, parameter_types FROM pg_prepared_statements