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

