mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Limit pgbench COPY FREEZE to ordinary relations
pgbench client-side data generation uses COPY FREEZE to load data for most tables. COPY FREEZE isn't supported for partitioned tables and since pgbench only supports partitioning pgbench_accounts, pgbench used a hard-coded check to skip COPY FREEZE and use plain COPY for a partitioned pgbench_accounts. If the user has manually partitioned one of the other pgbench tables, this causes client-side data generation to error out with: ERROR: cannot perform COPY FREEZE on a partitioned table Fix this by limiting COPY FREEZE to ordinary tables (RELKIND_RELATION). Author: Sergey Tatarintsev <s.tatarintsev@postgrespro.ru> Reviewed-by: Álvaro Herrera <alvherre@alvh.no-ip.org> Discussion: https://postgr.es/m/flat/97f55fca-8a7b-4da8-b413-7d1c57010676%40postgrespro.ru
This commit is contained in:
@ -53,6 +53,7 @@
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#include "catalog/pg_class_d.h"
|
||||
#include "common/int.h"
|
||||
#include "common/logging.h"
|
||||
#include "common/pg_prng.h"
|
||||
@ -848,6 +849,31 @@ static const PsqlScanCallbacks pgbench_callbacks = {
|
||||
NULL, /* don't need get_variable functionality */
|
||||
};
|
||||
|
||||
static char
|
||||
get_table_relkind(PGconn *con, const char *table)
|
||||
{
|
||||
PGresult *res;
|
||||
char *val;
|
||||
char relkind;
|
||||
const char *params[1] = {table};
|
||||
const char *sql =
|
||||
"SELECT relkind FROM pg_catalog.pg_class WHERE oid=$1::pg_catalog.regclass";
|
||||
|
||||
res = PQexecParams(con, sql, 1, NULL, params, NULL, NULL, 0);
|
||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||
{
|
||||
pg_log_error("query failed: %s", PQerrorMessage(con));
|
||||
pg_log_error_detail("Query was: %s", sql);
|
||||
exit(1);
|
||||
}
|
||||
val = PQgetvalue(res, 0, 0);
|
||||
Assert(strlen(val) == 1);
|
||||
relkind = val[0];
|
||||
PQclear(res);
|
||||
|
||||
return relkind;
|
||||
}
|
||||
|
||||
static inline pg_time_usec_t
|
||||
pg_time_now(void)
|
||||
{
|
||||
@ -4962,16 +4988,11 @@ initPopulateTable(PGconn *con, const char *table, int64 base,
|
||||
|
||||
initPQExpBuffer(&sql);
|
||||
|
||||
/*
|
||||
* Use COPY with FREEZE on v14 and later for all the tables except
|
||||
* pgbench_accounts when it is partitioned.
|
||||
*/
|
||||
if (PQserverVersion(con) >= 140000)
|
||||
{
|
||||
if (strcmp(table, "pgbench_accounts") != 0 ||
|
||||
partitions == 0)
|
||||
copy_statement_fmt = "copy %s from stdin with (freeze on)";
|
||||
}
|
||||
/* Use COPY with FREEZE on v14 and later for all ordinary tables */
|
||||
if ((PQserverVersion(con) >= 140000) &&
|
||||
get_table_relkind(con, table) == RELKIND_RELATION)
|
||||
copy_statement_fmt = "copy %s from stdin with (freeze on)";
|
||||
|
||||
|
||||
n = pg_snprintf(copy_statement, sizeof(copy_statement), copy_statement_fmt, table);
|
||||
if (n >= sizeof(copy_statement))
|
||||
|
Reference in New Issue
Block a user