@@ -9858,10 +9858,8 @@ dumpComment(Archive *fout, const char *type,
9858
9858
* param_name, param_type
9859
9859
*/
9860
9860
static const char *att_stats_arginfo[][2] = {
9861
- {"relation", "regclass"},
9862
9861
{"attname", "name"},
9863
9862
{"inherited", "boolean"},
9864
- {"version", "integer"},
9865
9863
{"null_frac", "float4"},
9866
9864
{"avg_width", "integer"},
9867
9865
{"n_distinct", "float4"},
@@ -9877,60 +9875,6 @@ static const char *att_stats_arginfo[][2] = {
9877
9875
{"range_bounds_histogram", "text"},
9878
9876
};
9879
9877
9880
- /*
9881
- * getAttStatsExportQuery --
9882
- *
9883
- * Generate a query that will fetch all attribute (e.g. pg_statistic)
9884
- * stats for a given relation.
9885
- */
9886
- static void
9887
- getAttStatsExportQuery(PQExpBuffer query, Archive *fout,
9888
- const char *schemaname, const char *relname)
9889
- {
9890
- resetPQExpBuffer(query);
9891
- appendPQExpBuffer(query,
9892
- "SELECT c.oid::regclass AS relation, "
9893
- "s.attname,"
9894
- "s.inherited,"
9895
- "'%u'::integer AS version, "
9896
- "s.null_frac,"
9897
- "s.avg_width,"
9898
- "s.n_distinct,"
9899
- "s.most_common_vals,"
9900
- "s.most_common_freqs,"
9901
- "s.histogram_bounds,"
9902
- "s.correlation,"
9903
- "s.most_common_elems,"
9904
- "s.most_common_elem_freqs,"
9905
- "s.elem_count_histogram,",
9906
- fout->remoteVersion);
9907
-
9908
- if (fout->remoteVersion >= 170000)
9909
- appendPQExpBufferStr(query,
9910
- "s.range_length_histogram,"
9911
- "s.range_empty_frac,"
9912
- "s.range_bounds_histogram ");
9913
- else
9914
- appendPQExpBufferStr(query,
9915
- "NULL AS range_length_histogram,"
9916
- "NULL AS range_empty_frac,"
9917
- "NULL AS range_bounds_histogram ");
9918
-
9919
- appendPQExpBufferStr(query,
9920
- "FROM pg_stats s "
9921
- "JOIN pg_namespace n "
9922
- "ON n.nspname = s.schemaname "
9923
- "JOIN pg_class c "
9924
- "ON c.relname = s.tablename "
9925
- "AND c.relnamespace = n.oid "
9926
- "WHERE s.schemaname = ");
9927
- appendStringLiteralAH(query, schemaname, fout);
9928
- appendPQExpBufferStr(query, " AND s.tablename = ");
9929
- appendStringLiteralAH(query, relname, fout);
9930
- appendPQExpBufferStr(query, " ORDER BY s.attname, s.inherited");
9931
- }
9932
-
9933
-
9934
9878
/*
9935
9879
* appendNamedArgument --
9936
9880
*
@@ -9956,17 +9900,17 @@ appendNamedArgument(PQExpBuffer out, Archive *fout, const char *argname,
9956
9900
* Append a formatted pg_restore_relation_stats statement.
9957
9901
*/
9958
9902
static void
9959
- appendRelStatsImport(PQExpBuffer out, Archive *fout, const RelStatsInfo *rsinfo)
9903
+ appendRelStatsImport(PQExpBuffer out, Archive *fout, const RelStatsInfo *rsinfo,
9904
+ const char *qualified_name)
9960
9905
{
9961
- const char *qualname = fmtQualifiedId(rsinfo->dobj.namespace->dobj.name, rsinfo->dobj.name);
9962
9906
char reltuples_str[FLOAT_SHORTEST_DECIMAL_LEN];
9963
9907
9964
9908
float_to_shortest_decimal_buf(rsinfo->reltuples, reltuples_str);
9965
9909
9966
9910
appendPQExpBufferStr(out, "SELECT * FROM pg_catalog.pg_restore_relation_stats(\n");
9967
- appendPQExpBuffer(out, "\t'relation', '%s'::regclass,\n", qualname);
9968
9911
appendPQExpBuffer(out, "\t'version', '%u'::integer,\n",
9969
9912
fout->remoteVersion);
9913
+ appendPQExpBuffer(out, "\t'relation', '%s'::regclass,\n", qualified_name);
9970
9914
appendPQExpBuffer(out, "\t'relpages', '%d'::integer,\n", rsinfo->relpages);
9971
9915
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", reltuples_str);
9972
9916
appendPQExpBuffer(out, "\t'relallvisible', '%d'::integer\n);\n",
@@ -9979,13 +9923,18 @@ appendRelStatsImport(PQExpBuffer out, Archive *fout, const RelStatsInfo *rsinfo)
9979
9923
* Append a series of formatted pg_restore_attribute_stats statements.
9980
9924
*/
9981
9925
static void
9982
- appendAttStatsImport(PQExpBuffer out, Archive *fout, PGresult *res)
9926
+ appendAttStatsImport(PQExpBuffer out, Archive *fout, PGresult *res,
9927
+ const char *qualified_name)
9983
9928
{
9984
9929
for (int rownum = 0; rownum < PQntuples(res); rownum++)
9985
9930
{
9986
9931
const char *sep = "";
9987
9932
9988
9933
appendPQExpBufferStr(out, "SELECT * FROM pg_catalog.pg_restore_attribute_stats(\n");
9934
+ appendPQExpBuffer(out, "\t'version', '%u'::integer,\n",
9935
+ fout->remoteVersion);
9936
+ appendPQExpBuffer(out, "\t'relation', '%s'::regclass,\n",
9937
+ qualified_name);
9989
9938
for (int argno = 0; argno < lengthof(att_stats_arginfo); argno++)
9990
9939
{
9991
9940
const char *argname = att_stats_arginfo[argno][0];
@@ -10050,6 +9999,7 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo)
10050
9999
DumpableObject *dobj = (DumpableObject *) &rsinfo->dobj;
10051
10000
DumpId *deps = NULL;
10052
10001
int ndeps = 0;
10002
+ const char *qualified_name;
10053
10003
10054
10004
/* nothing to do if we are not dumping statistics */
10055
10005
if (!fout->dopt->dumpStatistics)
@@ -10065,15 +10015,56 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo)
10065
10015
tag = createPQExpBuffer();
10066
10016
appendPQExpBufferStr(tag, fmtId(dobj->name));
10067
10017
10068
- out = createPQExpBuffer();
10018
+ query = createPQExpBuffer();
10019
+ if (!fout->is_prepared[PREPQUERY_GETATTRIBUTESTATS])
10020
+ {
10021
+ appendPQExpBufferStr(query,
10022
+ "PREPARE getAttributeStats(pg_catalog.name, pg_catalog.name) AS\n"
10023
+ "SELECT s.attname, s.inherited, "
10024
+ "s.null_frac, s.avg_width, s.n_distinct, "
10025
+ "s.most_common_vals, s.most_common_freqs, "
10026
+ "s.histogram_bounds, s.correlation, "
10027
+ "s.most_common_elems, s.most_common_elem_freqs, "
10028
+ "s.elem_count_histogram, ");
10029
+
10030
+ if (fout->remoteVersion >= 170000)
10031
+ appendPQExpBufferStr(query,
10032
+ "s.range_length_histogram, s.range_empty_frac, "
10033
+ "s.range_bounds_histogram ");
10034
+ else
10035
+ appendPQExpBufferStr(query,
10036
+ "NULL AS range_length_histogram,"
10037
+ "NULL AS range_empty_frac,"
10038
+ "NULL AS range_bounds_histogram ");
10069
10039
10070
- appendRelStatsImport(out, fout, rsinfo);
10040
+ appendPQExpBufferStr(query,
10041
+ "FROM pg_stats s "
10042
+ "WHERE s.schemaname = $1 "
10043
+ "AND s.tablename = $2 "
10044
+ "ORDER BY s.attname, s.inherited");
10045
+
10046
+ ExecuteSqlStatement(fout, query->data);
10047
+
10048
+ fout->is_prepared[PREPQUERY_GETATTRIBUTESTATS] = true;
10049
+ resetPQExpBuffer(query);
10050
+ }
10051
+
10052
+ appendPQExpBufferStr(query, "EXECUTE getAttributeStats(");
10053
+ appendStringLiteralAH(query, dobj->namespace->dobj.name, fout);
10054
+ appendPQExpBufferStr(query, ", ");
10055
+ appendStringLiteralAH(query, dobj->name, fout);
10056
+ appendPQExpBufferStr(query, "); ");
10071
10057
10072
- query = createPQExpBuffer();
10073
- getAttStatsExportQuery(query, fout, dobj->namespace->dobj.name,
10074
- dobj->name);
10075
10058
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
10076
- appendAttStatsImport(out, fout, res);
10059
+
10060
+ out = createPQExpBuffer();
10061
+
10062
+ qualified_name = fmtQualifiedId(rsinfo->dobj.namespace->dobj.name,
10063
+ rsinfo->dobj.name);
10064
+
10065
+ appendRelStatsImport(out, fout, rsinfo, qualified_name);
10066
+ appendAttStatsImport(out, fout, res, qualified_name);
10067
+
10077
10068
PQclear(res);
10078
10069
10079
10070
ArchiveEntry(fout, nilCatalogId, createDumpId(),
0 commit comments