vAdios-Set-0003-Adapt-some-pg_set_-_stats-calls-to-pg_res.patch
text/x-patch
Filename: vAdios-Set-0003-Adapt-some-pg_set_-_stats-calls-to-pg_res.patch
Type: text/x-patch
Part: 2
Message:
Re: Statistics Import and Export
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0003
Subject: Adapt some pg_set_*_stats() calls to pg_restore_*_stats() to preserve coverage
| File | + | − |
|---|---|---|
| src/test/regress/expected/stats_import.out | 110 | 9 |
| src/test/regress/sql/stats_import.sql | 72 | 7 |
From b23e5bae0c0e650ec76cffa7343cb17b0295e4d5 Mon Sep 17 00:00:00 2001
From: Corey Huinker <corey.huinker@gmail.com>
Date: Tue, 25 Feb 2025 18:32:55 -0500
Subject: [PATCH vAdios-Set 3/3] Adapt some pg_set_*_stats() calls to
pg_restore_*_stats() to preserve coverage
---
src/test/regress/expected/stats_import.out | 119 +++++++++++++++++++--
src/test/regress/sql/stats_import.sql | 79 ++++++++++++--
2 files changed, 182 insertions(+), 16 deletions(-)
diff --git a/src/test/regress/expected/stats_import.out b/src/test/regress/expected/stats_import.out
index 7c7784efaf1..e907d76b1c1 100644
--- a/src/test/regress/expected/stats_import.out
+++ b/src/test/regress/expected/stats_import.out
@@ -125,6 +125,13 @@ SELECT
t
(1 row)
+-- error: regclass not found
+SELECT pg_catalog.pg_restore_relation_stats(
+ 'relation', 0::Oid::regclass,
+ 'relpages', '17'::integer,
+ 'reltuples', '400.0'::real,
+ 'relallvisible', '4'::integer);
+ERROR: could not open relation with OID 0
--
-- Partitioned indexes aren't analyzed but it is possible to set
-- stats. The locking rules are different from normal indexes due to
@@ -177,7 +184,12 @@ SELECT
t
(1 row)
--- error: attribute is system column
+-- error: relation null
+SELECT
+ pg_catalog.pg_restore_relation_stats(
+ 'relation', NULL::regclass,
+ 'relpages', -1::integer);
+ERROR: "relation" cannot be NULL
SELECT pg_catalog.pg_clear_attribute_stats(
relation => 'stats_import.test'::regclass,
attname => 'ctid'::name,
@@ -191,7 +203,7 @@ SELECT pg_catalog.pg_clear_attribute_stats(
ERROR: column "nope" of relation "test" does not exist
-- reject: argument name is NULL
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
NULL, '17'::integer,
'reltuples', 400::real,
@@ -199,7 +211,7 @@ SELECT pg_restore_relation_stats(
ERROR: name at variadic position 5 is NULL
-- reject: argument name is an integer
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
17, '17'::integer,
'reltuples', 400::real,
@@ -207,7 +219,7 @@ SELECT pg_restore_relation_stats(
ERROR: name at variadic position 5 has type "integer", expected type "text"
-- reject: odd number of variadic arguments cannot be pairs
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
'relpages', '17'::integer,
'reltuples', 400::real,
@@ -298,32 +310,46 @@ WHERE oid = 'stats_import.test'::regclass;
-- warn and error: unrecognized argument name
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
'relpages', '17'::integer,
'reltuples', 400::real,
'nope', 4::integer);
WARNING: unrecognized argument name: "nope"
-ERROR: could not open relation with OID 0
+ pg_restore_relation_stats
+---------------------------
+ f
+(1 row)
+
+-- but relpages, reltuples got set anyway
+SELECT relpages, reltuples, relallvisible
+FROM pg_class
+WHERE oid = 'stats_import.test'::regclass;
+ relpages | reltuples | relallvisible
+----------+-----------+---------------
+ 17 | 400 | 5
+(1 row)
+
-- warn: bad relpages type
SELECT pg_restore_relation_stats(
'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
'relpages', 'nope'::text,
- 'reltuples', 400.0::real,
- 'relallvisible', 4::integer);
+ 'reltuples', 401.0::real,
+ 'relallvisible', 7::integer);
WARNING: argument "relpages" has type "text", expected type "integer"
pg_restore_relation_stats
---------------------------
f
(1 row)
+-- but reltuples, relallvisible got set anyway
SELECT relpages, reltuples, relallvisible
FROM pg_class
WHERE oid = 'stats_import.test'::regclass;
relpages | reltuples | relallvisible
----------+-----------+---------------
- 16 | 400 | 4
+ 17 | 401 | 7
(1 row)
-- error: object does not exist
@@ -366,6 +392,12 @@ SELECT pg_catalog.pg_restore_attribute_stats(
'avg_width', 2::integer,
'n_distinct', 0.3::real);
ERROR: column "nope" of relation "test" does not exist
+-- error: attribute is system column
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'ctid'::name,
+ 'inherited', 'false'::boolean);
+ERROR: cannot modify statistics on system column "ctid"
-- error: inherited null
SELECT pg_catalog.pg_restore_attribute_stats(
'relation', 'stats_import.test'::regclass,
@@ -483,6 +515,75 @@ AND attname = 'id';
stats_import | test | id | f | 0.7 | 8 | -0.8 | | | | | | | | | |
(1 row)
+-- scalars can't have mcelem
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'id'::name,
+ 'inherited', false::boolean,
+ 'most_common_elems', '{1,3}'::text,
+ 'most_common_elem_freqs', '{0.3,0.2,0.2,0.3,0.0}'::real[]
+ );
+WARNING: unable to determine element type of attribute "id"
+DETAIL: Cannot set STATISTIC_KIND_MCELEM or STATISTIC_KIND_DECHIST.
+ pg_restore_attribute_stats
+----------------------------
+ f
+(1 row)
+
+-- mcelem / mcelem freqs mismatch (each way)
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'tags'::name,
+ 'inherited', false::boolean,
+ 'most_common_elems', '{one,two}'::text
+ );
+WARNING: "most_common_elem_freqs" must be specified when "most_common_elems" is specified
+ pg_restore_attribute_stats
+----------------------------
+ f
+(1 row)
+
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'tags'::name,
+ 'inherited', false::boolean,
+ 'most_common_elem_freqs', '{0.3,0.2,0.2,0.3}'::real[]
+ );
+WARNING: "most_common_elems" must be specified when "most_common_elem_freqs" is specified
+ pg_restore_attribute_stats
+----------------------------
+ f
+(1 row)
+
+-- scalars can't have elem_count_histogram
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'id'::name,
+ 'inherited', false::boolean,
+ 'elem_count_histogram', '{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}'::real[]
+ );
+WARNING: unable to determine element type of attribute "id"
+DETAIL: Cannot set STATISTIC_KIND_MCELEM or STATISTIC_KIND_DECHIST.
+ pg_restore_attribute_stats
+----------------------------
+ f
+(1 row)
+
+-- range types can't have most_common_elems
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'arange'::name,
+ 'inherited', false::boolean,
+ 'most_common_elems', '{3,1}'::text,
+ 'most_common_elem_freqs', '{0.3,0.2,0.2,0.3,0.0}'::real[]
+ );
+WARNING: unable to determine element type of attribute "arange"
+DETAIL: Cannot set STATISTIC_KIND_MCELEM or STATISTIC_KIND_DECHIST.
+ pg_restore_attribute_stats
+----------------------------
+ f
+(1 row)
+
-- warn: mcv / mcf type mismatch
SELECT pg_catalog.pg_restore_attribute_stats(
'relation', 'stats_import.test'::regclass,
diff --git a/src/test/regress/sql/stats_import.sql b/src/test/regress/sql/stats_import.sql
index f26f7857748..6098fb49b85 100644
--- a/src/test/regress/sql/stats_import.sql
+++ b/src/test/regress/sql/stats_import.sql
@@ -90,6 +90,13 @@ SELECT
'relation', 'stats_import.part_parent'::regclass,
'relpages', 2::integer);
+-- error: regclass not found
+SELECT pg_catalog.pg_restore_relation_stats(
+ 'relation', 0::Oid::regclass,
+ 'relpages', '17'::integer,
+ 'reltuples', '400.0'::real,
+ 'relallvisible', '4'::integer);
+
--
-- Partitioned indexes aren't analyzed but it is possible to set
-- stats. The locking rules are different from normal indexes due to
@@ -124,7 +131,12 @@ SELECT
'relation', 'stats_import.part_parent'::regclass,
'relpages', -1::integer);
--- error: attribute is system column
+-- error: relation null
+SELECT
+ pg_catalog.pg_restore_relation_stats(
+ 'relation', NULL::regclass,
+ 'relpages', -1::integer);
+
SELECT pg_catalog.pg_clear_attribute_stats(
relation => 'stats_import.test'::regclass,
attname => 'ctid'::name,
@@ -138,7 +150,7 @@ SELECT pg_catalog.pg_clear_attribute_stats(
-- reject: argument name is NULL
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
NULL, '17'::integer,
'reltuples', 400::real,
@@ -146,7 +158,7 @@ SELECT pg_restore_relation_stats(
-- reject: argument name is an integer
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
17, '17'::integer,
'reltuples', 400::real,
@@ -154,7 +166,7 @@ SELECT pg_restore_relation_stats(
-- reject: odd number of variadic arguments cannot be pairs
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
'relpages', '17'::integer,
'reltuples', 400::real,
@@ -212,20 +224,26 @@ WHERE oid = 'stats_import.test'::regclass;
-- warn and error: unrecognized argument name
SELECT pg_restore_relation_stats(
- 'relation', '0'::oid::regclass,
+ 'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
'relpages', '17'::integer,
'reltuples', 400::real,
'nope', 4::integer);
+-- but relpages, reltuples got set anyway
+SELECT relpages, reltuples, relallvisible
+FROM pg_class
+WHERE oid = 'stats_import.test'::regclass;
+
-- warn: bad relpages type
SELECT pg_restore_relation_stats(
'relation', 'stats_import.test'::regclass,
'version', 150000::integer,
'relpages', 'nope'::text,
- 'reltuples', 400.0::real,
- 'relallvisible', 4::integer);
+ 'reltuples', 401.0::real,
+ 'relallvisible', 7::integer);
+-- but reltuples, relallvisible got set anyway
SELECT relpages, reltuples, relallvisible
FROM pg_class
WHERE oid = 'stats_import.test'::regclass;
@@ -270,6 +288,12 @@ SELECT pg_catalog.pg_restore_attribute_stats(
'avg_width', 2::integer,
'n_distinct', 0.3::real);
+-- error: attribute is system column
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'ctid'::name,
+ 'inherited', 'false'::boolean);
+
-- error: inherited null
SELECT pg_catalog.pg_restore_attribute_stats(
'relation', 'stats_import.test'::regclass,
@@ -352,6 +376,47 @@ AND tablename = 'test'
AND inherited = false
AND attname = 'id';
+-- scalars can't have mcelem
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'id'::name,
+ 'inherited', false::boolean,
+ 'most_common_elems', '{1,3}'::text,
+ 'most_common_elem_freqs', '{0.3,0.2,0.2,0.3,0.0}'::real[]
+ );
+
+-- mcelem / mcelem freqs mismatch (each way)
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'tags'::name,
+ 'inherited', false::boolean,
+ 'most_common_elems', '{one,two}'::text
+ );
+
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'tags'::name,
+ 'inherited', false::boolean,
+ 'most_common_elem_freqs', '{0.3,0.2,0.2,0.3}'::real[]
+ );
+
+-- scalars can't have elem_count_histogram
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'id'::name,
+ 'inherited', false::boolean,
+ 'elem_count_histogram', '{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}'::real[]
+ );
+
+-- range types can't have most_common_elems
+SELECT pg_catalog.pg_restore_attribute_stats(
+ 'relation', 'stats_import.test'::regclass,
+ 'attname', 'arange'::name,
+ 'inherited', false::boolean,
+ 'most_common_elems', '{3,1}'::text,
+ 'most_common_elem_freqs', '{0.3,0.2,0.2,0.3,0.0}'::real[]
+ );
+
-- warn: mcv / mcf type mismatch
SELECT pg_catalog.pg_restore_attribute_stats(
'relation', 'stats_import.test'::regclass,
--
2.48.1