v32-0012-Disallow-setting-statistics-on-system-columns.patch
text/x-patch
Filename: v32-0012-Disallow-setting-statistics-on-system-columns.patch
Type: text/x-patch
Part: 11
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 v32-0012
Subject: Disallow setting statistics on system columns.
| File | + | − |
|---|---|---|
| src/backend/statistics/attribute_stats.c | 4 | 2 |
| src/test/regress/expected/stats_import.out | 9 | 0 |
| src/test/regress/sql/stats_import.sql | 9 | 0 |
From 936d98c474afcbc33fc85694dd25df70fdec9b5a Mon Sep 17 00:00:00 2001
From: Corey Huinker <corey.huinker@gmail.com>
Date: Wed, 13 Nov 2024 01:00:45 -0500
Subject: [PATCH v32 12/14] Disallow setting statistics on system columns.
ANALYZE can't, so we shouldn't.
---
src/backend/statistics/attribute_stats.c | 6 ++++--
src/test/regress/expected/stats_import.out | 9 +++++++++
src/test/regress/sql/stats_import.sql | 9 +++++++++
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/backend/statistics/attribute_stats.c b/src/backend/statistics/attribute_stats.c
index 4ae0722b78..42f458c280 100644
--- a/src/backend/statistics/attribute_stats.c
+++ b/src/backend/statistics/attribute_stats.c
@@ -161,7 +161,8 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel)
stats_check_required_arg(fcinfo, attarginfo, ATTNAME_ARG);
attname = PG_GETARG_NAME(ATTNAME_ARG);
attnum = get_attnum(reloid, NameStr(*attname));
- if (attnum == InvalidAttrNumber)
+ /* maybe use (!AttrNumberIsForUserDefinedAttr(attnum)) instead? */
+ if (attnum <= InvalidAttrNumber)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_COLUMN),
errmsg("column \"%s\" of relation \"%s\" does not exist",
@@ -870,7 +871,8 @@ pg_clear_attribute_stats(PG_FUNCTION_ARGS)
stats_check_required_arg(fcinfo, attarginfo, ATTNAME_ARG);
attname = PG_GETARG_NAME(ATTNAME_ARG);
attnum = get_attnum(reloid, NameStr(*attname));
- if (attnum == InvalidAttrNumber)
+ /* maybe use (!AttrNumberIsForUserDefinedAttr(attnum)) instead? */
+ if (attnum <= InvalidAttrNumber)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_COLUMN),
errmsg("column \"%s\" of relation \"%s\" does not exist",
diff --git a/src/test/regress/expected/stats_import.out b/src/test/regress/expected/stats_import.out
index 9186fc01ec..9da9e3cbfc 100644
--- a/src/test/regress/expected/stats_import.out
+++ b/src/test/regress/expected/stats_import.out
@@ -228,6 +228,15 @@ SELECT pg_catalog.pg_set_attribute_stats(
avg_width => 2::integer,
n_distinct => 0.3::real);
ERROR: "inherited" cannot be NULL
+-- error: system column
+SELECT pg_catalog.pg_set_attribute_stats(
+ relation => 'stats_import.test'::regclass,
+ attname => 'xmin'::name,
+ inherited => false::boolean,
+ null_frac => 0.1::real,
+ avg_width => 2::integer,
+ n_distinct => 0.3::real);
+ERROR: column "xmin" of relation "test" does not exist
-- ok: no stakinds
SELECT pg_catalog.pg_set_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 c7d5e017d9..3c68b51bcc 100644
--- a/src/test/regress/sql/stats_import.sql
+++ b/src/test/regress/sql/stats_import.sql
@@ -178,6 +178,15 @@ SELECT pg_catalog.pg_set_attribute_stats(
avg_width => 2::integer,
n_distinct => 0.3::real);
+-- error: system column
+SELECT pg_catalog.pg_set_attribute_stats(
+ relation => 'stats_import.test'::regclass,
+ attname => 'xmin'::name,
+ inherited => false::boolean,
+ null_frac => 0.1::real,
+ avg_width => 2::integer,
+ n_distinct => 0.3::real);
+
-- ok: no stakinds
SELECT pg_catalog.pg_set_attribute_stats(
relation => 'stats_import.test'::regclass,
--
2.47.0