1
0
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:
Tomas Vondra
2021-06-08 20:22:18 +02:00
parent d1f0aa7696
commit cb92703384
6 changed files with 52 additions and 11 deletions

View File

@ -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;
}

View File

@ -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,