> > That's a good point but let's avoid excessive redundancy in the > structures. Adding a few fields to RelStatsInfo should be enough. > > Regards, > Jeff Davis >
Incorporating most of the feedback (I kept a few of the appendNamedArgument() calls) presented over the weekend. * removeVersionNumStr is gone * relpages/reltuples/relallvisible are now char[32] buffers in RelStatsInfo and nowhere else (existing relpages conversion remains, however) * attribute stats export query is now prepared, and queries pg_stats with no joins * version parameter moved to end of both queries for consistency.
From 95127f6fd82bde843e5840de93678ff784750c8a Mon Sep 17 00:00:00 2001 From: Corey Huinker <corey.huin...@gmail.com> Date: Mon, 24 Feb 2025 02:38:22 -0500 Subject: [PATCH v2 1/3] Leverage existing functions for relation stats. Rather than quer pg_class once per relation in order to fetch relation stats (reltuples, relpages, relallvisible), instead just add those fields to the existing queries in getTables() and getIndexes(), then then store their string representations in RelStatsInfo. --- src/bin/pg_dump/pg_dump.c | 117 ++++++++++++++++---------------------- src/bin/pg_dump/pg_dump.h | 3 + 2 files changed, 52 insertions(+), 68 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index afd79287177..a5e7aa73671 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -6814,7 +6814,8 @@ getFuncs(Archive *fout) * */ static RelStatsInfo * -getRelationStatistics(Archive *fout, DumpableObject *rel, char relkind) +getRelationStatistics(Archive *fout, DumpableObject *rel, const char *relpages, + const char *reltuples, const char *relallvisible, char relkind) { if (!fout->dopt->dumpStatistics) return NULL; @@ -6839,6 +6840,9 @@ getRelationStatistics(Archive *fout, DumpableObject *rel, char relkind) dobj->components |= DUMP_COMPONENT_STATISTICS; dobj->name = pg_strdup(rel->name); dobj->namespace = rel->namespace; + strncpy(info->relpages, relpages,sizeof(info->relpages)); + strncpy(info->reltuples, reltuples, sizeof(info->reltuples)); + strncpy(info->relallvisible, relallvisible, sizeof(info->relallvisible)); info->relkind = relkind; info->postponed_def = false; @@ -6874,6 +6878,8 @@ getTables(Archive *fout, int *numTables) int i_relhasindex; int i_relhasrules; int i_relpages; + int i_reltuples; + int i_relallvisible; int i_toastpages; int i_owning_tab; int i_owning_col; @@ -6921,6 +6927,7 @@ getTables(Archive *fout, int *numTables) appendPQExpBufferStr(query, "SELECT c.tableoid, c.oid, c.relname, " "c.relnamespace, c.relkind, c.reltype, " + "c.relpages, c.reltuples, c.relallvisible, " "c.relowner, " "c.relchecks, " "c.relhasindex, c.relhasrules, c.relpages, " @@ -7088,6 +7095,8 @@ getTables(Archive *fout, int *numTables) i_relhasindex = PQfnumber(res, "relhasindex"); i_relhasrules = PQfnumber(res, "relhasrules"); i_relpages = PQfnumber(res, "relpages"); + i_reltuples = PQfnumber(res, "reltuples"); + i_relallvisible = PQfnumber(res, "relallvisible"); i_toastpages = PQfnumber(res, "toastpages"); i_owning_tab = PQfnumber(res, "owning_tab"); i_owning_col = PQfnumber(res, "owning_col"); @@ -7233,7 +7242,14 @@ getTables(Archive *fout, int *numTables) /* Add statistics */ if (tblinfo[i].interesting) - getRelationStatistics(fout, &tblinfo[i].dobj, tblinfo[i].relkind); + { + char *relpages = PQgetvalue(res, i, i_relpages); + char *reltuples = PQgetvalue(res, i, i_reltuples); + char *relallvisible = PQgetvalue(res, i, i_relallvisible); + + getRelationStatistics(fout, &tblinfo[i].dobj, relpages, reltuples, + relallvisible, tblinfo[i].relkind); + } /* * Read-lock target tables to make sure they aren't DROPPED or altered @@ -7499,6 +7515,9 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) i_oid, i_indrelid, i_indexname, + i_relpages, + i_reltuples, + i_relallvisible, i_parentidx, i_indexdef, i_indnkeyatts, @@ -7552,6 +7571,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) appendPQExpBufferStr(query, "SELECT t.tableoid, t.oid, i.indrelid, " "t.relname AS indexname, " + "t.relpages, t.reltuples, t.relallvisible, " "pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, " "i.indkey, i.indisclustered, " "c.contype, c.conname, " @@ -7659,6 +7679,9 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) i_oid = PQfnumber(res, "oid"); i_indrelid = PQfnumber(res, "indrelid"); i_indexname = PQfnumber(res, "indexname"); + i_relpages = PQfnumber(res, "relpages"); + i_reltuples = PQfnumber(res, "reltuples"); + i_relallvisible = PQfnumber(res, "relallvisible"); i_parentidx = PQfnumber(res, "parentidx"); i_indexdef = PQfnumber(res, "indexdef"); i_indnkeyatts = PQfnumber(res, "indnkeyatts"); @@ -7725,6 +7748,9 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) char contype; char indexkind; RelStatsInfo *relstats; + char *relpages; + char *reltuples; + char *relallvisible; indxinfo[j].dobj.objType = DO_INDEX; indxinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid)); @@ -7758,8 +7784,13 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) else indexkind = RELKIND_PARTITIONED_INDEX; + relpages = PQgetvalue(res, j, i_relpages); + reltuples = PQgetvalue(res, j, i_reltuples); + relallvisible = PQgetvalue(res, j, i_relallvisible); + contype = *(PQgetvalue(res, j, i_contype)); - relstats = getRelationStatistics(fout, &indxinfo[j].dobj, indexkind); + relstats = getRelationStatistics(fout, &indxinfo[j].dobj, relpages, + reltuples, relallvisible, indexkind); if (contype == 'p' || contype == 'u' || contype == 'x') { @@ -10383,18 +10414,6 @@ dumpComment(Archive *fout, const char *type, catalogId, subid, dumpId, NULL); } -/* - * Tabular description of the parameters to pg_restore_relation_stats() - * param_name, param_type - */ -static const char *rel_stats_arginfo[][2] = { - {"relation", "regclass"}, - {"version", "integer"}, - {"relpages", "integer"}, - {"reltuples", "real"}, - {"relallvisible", "integer"}, -}; - /* * Tabular description of the parameters to pg_restore_attribute_stats() * param_name, param_type @@ -10419,30 +10438,6 @@ static const char *att_stats_arginfo[][2] = { {"range_bounds_histogram", "text"}, }; -/* - * getRelStatsExportQuery -- - * - * Generate a query that will fetch all relation (e.g. pg_class) - * stats for a given relation. - */ -static void -getRelStatsExportQuery(PQExpBuffer query, Archive *fout, - const char *schemaname, const char *relname) -{ - resetPQExpBuffer(query); - appendPQExpBufferStr(query, - "SELECT c.oid::regclass AS relation, " - "current_setting('server_version_num') AS version, " - "c.relpages, c.reltuples, c.relallvisible " - "FROM pg_class c " - "JOIN pg_namespace n " - "ON n.oid = c.relnamespace " - "WHERE n.nspname = "); - appendStringLiteralAH(query, schemaname, fout); - appendPQExpBufferStr(query, " AND c.relname = "); - appendStringLiteralAH(query, relname, fout); -} - /* * getAttStatsExportQuery -- * @@ -10521,33 +10516,23 @@ appendNamedArgument(PQExpBuffer out, Archive *fout, const char *argname, * Append a formatted pg_restore_relation_stats statement. */ static void -appendRelStatsImport(PQExpBuffer out, Archive *fout, PGresult *res) +appendRelStatsImport(PQExpBuffer out, Archive *fout, const RelStatsInfo *rsinfo) { - const char *sep = ""; + const char *qualname = fmtQualifiedId(rsinfo->dobj.namespace->dobj.name, rsinfo->dobj.name); + char version[32]; - if (PQntuples(res) == 0) - return; + snprintf(version, sizeof(version), "%d", fout->remoteVersion); appendPQExpBufferStr(out, "SELECT * FROM pg_catalog.pg_restore_relation_stats(\n"); - - for (int argno = 0; argno < lengthof(rel_stats_arginfo); argno++) - { - const char *argname = rel_stats_arginfo[argno][0]; - const char *argtype = rel_stats_arginfo[argno][1]; - int fieldno = PQfnumber(res, argname); - - if (fieldno < 0) - pg_fatal("relation stats export query missing field '%s'", - argname); - - if (PQgetisnull(res, 0, fieldno)) - continue; - - appendPQExpBufferStr(out, sep); - appendNamedArgument(out, fout, argname, PQgetvalue(res, 0, fieldno), argtype); - - sep = ",\n"; - } + appendNamedArgument(out, fout, "relation", qualname, "regclass"); + appendPQExpBufferStr(out, ",\n"); + appendNamedArgument(out, fout, "version", version, "integer"); + appendPQExpBufferStr(out, ",\n"); + appendNamedArgument(out, fout, "relpages", rsinfo->relpages, "integer"); + appendPQExpBufferStr(out, ",\n"); + appendNamedArgument(out, fout, "reltuples", rsinfo->reltuples, "real"); + appendPQExpBufferStr(out, ",\n"); + appendNamedArgument(out, fout, "relallvisible", rsinfo->relallvisible, "integer"); appendPQExpBufferStr(out, "\n);\n"); } @@ -10643,15 +10628,11 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo) tag = createPQExpBuffer(); appendPQExpBufferStr(tag, fmtId(dobj->name)); - query = createPQExpBuffer(); out = createPQExpBuffer(); - getRelStatsExportQuery(query, fout, dobj->namespace->dobj.name, - dobj->name); - res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); - appendRelStatsImport(out, fout, res); - PQclear(res); + appendRelStatsImport(out, fout, rsinfo); + query = createPQExpBuffer(); getAttStatsExportQuery(query, fout, dobj->namespace->dobj.name, dobj->name); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index f08f5905aa3..1ab134ae414 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -438,6 +438,9 @@ typedef struct _indexAttachInfo typedef struct _relStatsInfo { DumpableObject dobj; + char relpages[32]; + char reltuples[32]; + char relallvisible[32]; char relkind; /* 'r', 'm', 'i', etc */ bool postponed_def; /* stats must be postponed into post-data */ } RelStatsInfo; base-commit: 2421e9a51d20bb83154e54a16ce628f9249fa907 -- 2.48.1
From 5a03d2935999cac037daeaac566e7709f1824f5e Mon Sep 17 00:00:00 2001 From: Corey Huinker <corey.huin...@gmail.com> Date: Mon, 24 Feb 2025 04:36:16 -0500 Subject: [PATCH v2 2/3] Move attribute statistics fetching to a prepared statement. Simplify the query to pg_stats by removing the joins to namespace and pg_class, these were only needed because we wanted to get the relation oid, but that's information that we already have. Also, create a new prepared statement getAttributeStats for this query, as it will be run once per relation. Additionally, pull the server_version_num out of the export query, as we already have that information. However, because version appeared in the middle of the arginfo array, it has to move to either before the arginfo loop, which would mix it in with the grain of the call (attname and inherited would follow it) or to the last argument pair, which is what was done. Make the same move for the version parameter in the pg_set_relation_stats() calls for consistency. --- src/bin/pg_dump/pg_backup.h | 3 +- src/bin/pg_dump/pg_dump.c | 137 +++++++++++++++++------------------- 2 files changed, 68 insertions(+), 72 deletions(-) diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index 350cf659c41..b78724671c5 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -74,9 +74,10 @@ enum _dumpPreparedQueries PREPQUERY_DUMPTABLEATTACH, PREPQUERY_GETCOLUMNACLS, PREPQUERY_GETDOMAINCONSTRAINTS, + PREPQUERY_ATTRIBUTESTATS, }; -#define NUM_PREP_QUERIES (PREPQUERY_GETDOMAINCONSTRAINTS + 1) +#define NUM_PREP_QUERIES (PREPQUERY_ATTRIBUTESTATS + 1) /* Parameters needed by ConnectDatabase; same for dump and restore */ typedef struct _connParams diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index a5e7aa73671..bbd415d5477 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -10419,10 +10419,8 @@ dumpComment(Archive *fout, const char *type, * param_name, param_type */ static const char *att_stats_arginfo[][2] = { - {"relation", "regclass"}, {"attname", "name"}, {"inherited", "boolean"}, - {"version", "integer"}, {"null_frac", "float4"}, {"avg_width", "integer"}, {"n_distinct", "float4"}, @@ -10438,59 +10436,6 @@ static const char *att_stats_arginfo[][2] = { {"range_bounds_histogram", "text"}, }; -/* - * getAttStatsExportQuery -- - * - * Generate a query that will fetch all attribute (e.g. pg_statistic) - * stats for a given relation. - */ -static void -getAttStatsExportQuery(PQExpBuffer query, Archive *fout, - const char *schemaname, const char *relname) -{ - resetPQExpBuffer(query); - appendPQExpBufferStr(query, - "SELECT c.oid::regclass AS relation, " - "s.attname," - "s.inherited," - "current_setting('server_version_num') AS version, " - "s.null_frac," - "s.avg_width," - "s.n_distinct," - "s.most_common_vals," - "s.most_common_freqs," - "s.histogram_bounds," - "s.correlation," - "s.most_common_elems," - "s.most_common_elem_freqs," - "s.elem_count_histogram,"); - - if (fout->remoteVersion >= 170000) - appendPQExpBufferStr(query, - "s.range_length_histogram," - "s.range_empty_frac," - "s.range_bounds_histogram "); - else - appendPQExpBufferStr(query, - "NULL AS range_length_histogram," - "NULL AS range_empty_frac," - "NULL AS range_bounds_histogram "); - - appendPQExpBufferStr(query, - "FROM pg_stats s " - "JOIN pg_namespace n " - "ON n.nspname = s.schemaname " - "JOIN pg_class c " - "ON c.relname = s.tablename " - "AND c.relnamespace = n.oid " - "WHERE s.schemaname = "); - appendStringLiteralAH(query, schemaname, fout); - appendPQExpBufferStr(query, " AND s.tablename = "); - appendStringLiteralAH(query, relname, fout); - appendPQExpBufferStr(query, " ORDER BY s.attname, s.inherited"); -} - - /* * appendNamedArgument -- * @@ -10516,23 +10461,20 @@ appendNamedArgument(PQExpBuffer out, Archive *fout, const char *argname, * Append a formatted pg_restore_relation_stats statement. */ static void -appendRelStatsImport(PQExpBuffer out, Archive *fout, const RelStatsInfo *rsinfo) +appendRelStatsImport(PQExpBuffer out, Archive *fout, + const RelStatsInfo *rsinfo, const char *qualname, + const char *version) { - const char *qualname = fmtQualifiedId(rsinfo->dobj.namespace->dobj.name, rsinfo->dobj.name); - char version[32]; - - snprintf(version, sizeof(version), "%d", fout->remoteVersion); - appendPQExpBufferStr(out, "SELECT * FROM pg_catalog.pg_restore_relation_stats(\n"); appendNamedArgument(out, fout, "relation", qualname, "regclass"); appendPQExpBufferStr(out, ",\n"); - appendNamedArgument(out, fout, "version", version, "integer"); - appendPQExpBufferStr(out, ",\n"); appendNamedArgument(out, fout, "relpages", rsinfo->relpages, "integer"); appendPQExpBufferStr(out, ",\n"); appendNamedArgument(out, fout, "reltuples", rsinfo->reltuples, "real"); appendPQExpBufferStr(out, ",\n"); appendNamedArgument(out, fout, "relallvisible", rsinfo->relallvisible, "integer"); + appendPQExpBufferStr(out, ",\n"); + appendNamedArgument(out, fout, "version", version, "integer"); appendPQExpBufferStr(out, "\n);\n"); } @@ -10542,13 +10484,16 @@ appendRelStatsImport(PQExpBuffer out, Archive *fout, const RelStatsInfo *rsinfo) * Append a series of formatted pg_restore_attribute_stats statements. */ static void -appendAttStatsImport(PQExpBuffer out, Archive *fout, PGresult *res) +appendAttStatsImport(PQExpBuffer out, Archive *fout, PGresult *res, + const char *qualname, const char *version) { + const char *sep = ",\n"; + for (int rownum = 0; rownum < PQntuples(res); rownum++) { - const char *sep = ""; - appendPQExpBufferStr(out, "SELECT * FROM pg_catalog.pg_restore_attribute_stats(\n"); + appendNamedArgument(out, fout, "relation", qualname, "regclass"); + for (int argno = 0; argno < lengthof(att_stats_arginfo); argno++) { const char *argname = att_stats_arginfo[argno][0]; @@ -10564,8 +10509,9 @@ appendAttStatsImport(PQExpBuffer out, Archive *fout, PGresult *res) appendPQExpBufferStr(out, sep); appendNamedArgument(out, fout, argname, PQgetvalue(res, rownum, fieldno), argtype); - sep = ",\n"; } + appendPQExpBufferStr(out, sep); + appendNamedArgument(out, fout, "version", version, "integer"); appendPQExpBufferStr(out, "\n);\n"); } } @@ -10613,6 +10559,8 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo) DumpableObject *dobj = (DumpableObject *) &rsinfo->dobj; DumpId *deps = NULL; int ndeps = 0; + const char *qualname; + char version[32]; /* nothing to do if we are not dumping statistics */ if (!fout->dopt->dumpStatistics) @@ -10625,18 +10573,64 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo) ndeps = dobj->nDeps; } + qualname = pg_strdup(fmtQualifiedId(rsinfo->dobj.namespace->dobj.name, rsinfo->dobj.name)); + snprintf(version, sizeof(version), "%d", fout->remoteVersion); + tag = createPQExpBuffer(); appendPQExpBufferStr(tag, fmtId(dobj->name)); out = createPQExpBuffer(); - appendRelStatsImport(out, fout, rsinfo); + appendRelStatsImport(out, fout, rsinfo, qualname, version); query = createPQExpBuffer(); - getAttStatsExportQuery(query, fout, dobj->namespace->dobj.name, - dobj->name); + if (!fout->is_prepared[PREPQUERY_ATTRIBUTESTATS]) + { + appendPQExpBufferStr(query, + "PREPARE getAttributeStats(pg_catalog.name, pg_catalog.name) AS\n" + "SELECT " + "s.attname, " + "s.inherited, " + "s.null_frac, " + "s.avg_width, " + "s.n_distinct, " + "s.most_common_vals, " + "s.most_common_freqs, " + "s.histogram_bounds, " + "s.correlation, " + "s.most_common_elems, " + "s.most_common_elem_freqs, " + "s.elem_count_histogram, "); + + if (fout->remoteVersion >= 170000) + appendPQExpBufferStr(query, + "s.range_length_histogram," + "s.range_empty_frac," + "s.range_bounds_histogram "); + else + appendPQExpBufferStr(query, + "NULL AS range_length_histogram," + "NULL AS range_empty_frac," + "NULL AS range_bounds_histogram "); + + appendPQExpBufferStr(query, + "FROM pg_stats s " + "WHERE s.schemaname = $1 " + "AND s.tablename = $2 " + "ORDER BY s.attname, s.inherited"); + + ExecuteSqlStatement(fout, query->data); + + fout->is_prepared[PREPQUERY_ATTRIBUTESTATS] = true; + } + + printfPQExpBuffer(query, "EXECUTE getAttributeStats("); + appendStringLiteralAH(query, dobj->namespace->dobj.name, fout); + appendPQExpBufferStr(query, ", "); + appendStringLiteralAH(query, dobj->name, fout); + appendPQExpBufferStr(query, "); "); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); - appendAttStatsImport(out, fout, res); + appendAttStatsImport(out, fout, res, qualname, version); PQclear(res); ArchiveEntry(fout, nilCatalogId, createDumpId(), @@ -10652,6 +10646,7 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo) destroyPQExpBuffer(query); destroyPQExpBuffer(out); destroyPQExpBuffer(tag); + pg_free((void *) qualname); } /* -- 2.48.1
From 02bb2a98e7e290c53e3e130b330073d56af93f53 Mon Sep 17 00:00:00 2001 From: Corey Huinker <corey.huin...@gmail.com> Date: Mon, 24 Feb 2025 05:01:59 -0500 Subject: [PATCH v2 3/3] Remove nonsense bounds checking of relpages, relallvisible. Change both to type BlockNumber and fetch as PG_GETARG_UINT32 while we're at it. --- src/backend/statistics/relation_stats.c | 49 ++++--------------------- 1 file changed, 8 insertions(+), 41 deletions(-) diff --git a/src/backend/statistics/relation_stats.c b/src/backend/statistics/relation_stats.c index 046661d7c3f..e532c1ef6c7 100644 --- a/src/backend/statistics/relation_stats.c +++ b/src/backend/statistics/relation_stats.c @@ -62,62 +62,29 @@ relation_statistics_update(FunctionCallInfo fcinfo, int elevel, bool inplace) { Oid reloid; Relation crel; - int32 relpages = DEFAULT_RELPAGES; + BlockNumber relpages = DEFAULT_RELPAGES; bool update_relpages = false; float reltuples = DEFAULT_RELTUPLES; bool update_reltuples = false; - int32 relallvisible = DEFAULT_RELALLVISIBLE; + BlockNumber relallvisible = DEFAULT_RELALLVISIBLE; bool update_relallvisible = false; - bool result = true; if (!PG_ARGISNULL(RELPAGES_ARG)) { - relpages = PG_GETARG_INT32(RELPAGES_ARG); - - /* - * Partitioned tables may have relpages=-1. Note: for relations with - * no storage, relpages=-1 is not used consistently, but must be - * supported here. - */ - if (relpages < -1) - { - ereport(elevel, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("relpages cannot be < -1"))); - result = false; - } - else - update_relpages = true; + relpages = PG_GETARG_UINT32(RELPAGES_ARG); + update_relpages = true; } if (!PG_ARGISNULL(RELTUPLES_ARG)) { reltuples = PG_GETARG_FLOAT4(RELTUPLES_ARG); - - if (reltuples < -1.0) - { - ereport(elevel, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("reltuples cannot be < -1.0"))); - result = false; - } - else - update_reltuples = true; + update_reltuples = true; } if (!PG_ARGISNULL(RELALLVISIBLE_ARG)) { - relallvisible = PG_GETARG_INT32(RELALLVISIBLE_ARG); - - if (relallvisible < 0) - { - ereport(elevel, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("relallvisible cannot be < 0"))); - result = false; - } - else - update_relallvisible = true; + relallvisible = PG_GETARG_UINT32(RELALLVISIBLE_ARG); + update_relallvisible = true; } stats_check_required_arg(fcinfo, relarginfo, RELATION_ARG); @@ -237,7 +204,7 @@ relation_statistics_update(FunctionCallInfo fcinfo, int elevel, bool inplace) CommandCounterIncrement(); - return result; + return true; } /* -- 2.48.1