mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
Adjust batch size in postgres_fdw to not use too many parameters
The FE/BE protocol identifies parameters with an Int16 index, which limits the maximum number of parameters per query to 65535. With batching added to postges_fdw this limit is much easier to hit, as the whole batch is essentially a single query, making this error much easier to hit. The failures are a bit unpredictable, because it also depends on the number of columns in the query. So instead of just failing, this patch tweaks the batch_size to not exceed the maximum number of parameters. Reported-by: Hou Zhijie <houzj.fnst@cn.fujitsu.com> Reviewed-by: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com> Discussion: https://postgr.es/m/OS0PR01MB571603973C0AC2874AD6BF2594299%40OS0PR01MB5716.jpnprd01.prod.outlook.com
This commit is contained in:
@ -1403,10 +1403,11 @@ PQsendQueryParams(PGconn *conn,
|
||||
libpq_gettext("command string is a null pointer\n"));
|
||||
return 0;
|
||||
}
|
||||
if (nParams < 0 || nParams > 65535)
|
||||
if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
|
||||
{
|
||||
appendPQExpBufferStr(&conn->errorMessage,
|
||||
libpq_gettext("number of parameters must be between 0 and 65535\n"));
|
||||
appendPQExpBuffer(&conn->errorMessage,
|
||||
libpq_gettext("number of parameters must be between 0 and %d\n"),
|
||||
PQ_QUERY_PARAM_MAX_LIMIT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1451,10 +1452,11 @@ PQsendPrepare(PGconn *conn,
|
||||
libpq_gettext("command string is a null pointer\n"));
|
||||
return 0;
|
||||
}
|
||||
if (nParams < 0 || nParams > 65535)
|
||||
if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
|
||||
{
|
||||
appendPQExpBufferStr(&conn->errorMessage,
|
||||
libpq_gettext("number of parameters must be between 0 and 65535\n"));
|
||||
appendPQExpBuffer(&conn->errorMessage,
|
||||
libpq_gettext("number of parameters must be between 0 and %d\n"),
|
||||
PQ_QUERY_PARAM_MAX_LIMIT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1548,10 +1550,11 @@ PQsendQueryPrepared(PGconn *conn,
|
||||
libpq_gettext("statement name is a null pointer\n"));
|
||||
return 0;
|
||||
}
|
||||
if (nParams < 0 || nParams > 65535)
|
||||
if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
|
||||
{
|
||||
appendPQExpBufferStr(&conn->errorMessage,
|
||||
libpq_gettext("number of parameters must be between 0 and 65535\n"));
|
||||
appendPQExpBuffer(&conn->errorMessage,
|
||||
libpq_gettext("number of parameters must be between 0 and %d\n"),
|
||||
PQ_QUERY_PARAM_MAX_LIMIT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -429,6 +429,8 @@ extern PGresult *PQexecPrepared(PGconn *conn,
|
||||
int resultFormat);
|
||||
|
||||
/* Interface for multiple-result or asynchronous queries */
|
||||
#define PQ_QUERY_PARAM_MAX_LIMIT 65535
|
||||
|
||||
extern int PQsendQuery(PGconn *conn, const char *query);
|
||||
extern int PQsendQueryParams(PGconn *conn,
|
||||
const char *command,
|
||||
|
Reference in New Issue
Block a user