Improve pg_set_attribute_stats() error message.
authorJeff Davis <[email protected]>
Wed, 23 Oct 2024 23:11:45 +0000 (16:11 -0700)
committerJeff Davis <[email protected]>
Wed, 23 Oct 2024 23:16:39 +0000 (16:16 -0700)
Previously, an invalid attribute name was caught, but the error
message was unhelpful.

src/backend/statistics/attribute_stats.c
src/test/regress/expected/stats_import.out
src/test/regress/sql/stats_import.sql

index 086dceaeafee10a4c91ca5db191dd62ebed8287c..979fe41a0001e6a9fc209c53dcc90d92ebb4d2a0 100644 (file)
@@ -161,6 +161,11 @@ 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)
+       ereport(ERROR,
+               (errcode(ERRCODE_UNDEFINED_COLUMN),
+                errmsg("column \"%s\" of relation \"%s\" does not exist",
+                       NameStr(*attname), get_rel_name(reloid))));
 
    stats_check_required_arg(fcinfo, attarginfo, INHERITED_ARG);
    inherited = PG_GETARG_BOOL(INHERITED_ARG);
@@ -860,6 +865,11 @@ 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)
+       ereport(ERROR,
+               (errcode(ERRCODE_UNDEFINED_COLUMN),
+                errmsg("column \"%s\" of relation \"%s\" does not exist",
+                       NameStr(*attname), get_rel_name(reloid))));
 
    stats_check_required_arg(fcinfo, attarginfo, INHERITED_ARG);
    inherited = PG_GETARG_BOOL(INHERITED_ARG);
index 2868cc47f1dad7235941b5b21ec685174cbe0122..6ab21ca324c9413c3c268c89323f74f0cec36c05 100644 (file)
@@ -180,6 +180,12 @@ SELECT pg_catalog.pg_set_attribute_stats(
     avg_width => 2::integer,
     n_distinct => 0.3::real);
 ERROR:  could not open relation with OID 0
+-- error: object doesn't exist
+SELECT pg_catalog.pg_clear_attribute_stats(
+    relation => '0'::oid,
+    attname => 'id'::name,
+    inherited => false::boolean);
+ERROR:  could not open relation with OID 0
 -- error: relation null
 SELECT pg_catalog.pg_set_attribute_stats(
     relation => NULL::oid,
@@ -189,6 +195,21 @@ SELECT pg_catalog.pg_set_attribute_stats(
     avg_width => 2::integer,
     n_distinct => 0.3::real);
 ERROR:  "relation" cannot be NULL
+-- error: attname doesn't exist
+SELECT pg_catalog.pg_set_attribute_stats(
+    relation => 'stats_import.test'::regclass,
+    attname => 'nope'::name,
+    inherited => false::boolean,
+    null_frac => 0.1::real,
+    avg_width => 2::integer,
+    n_distinct => 0.3::real);
+ERROR:  column "nope" of relation "test" does not exist
+-- error: attname doesn't exist
+SELECT pg_catalog.pg_clear_attribute_stats(
+    relation => 'stats_import.test'::regclass,
+    attname => 'nope'::name,
+    inherited => false::boolean);
+ERROR:  column "nope" of relation "test" does not exist
 -- error: attname null
 SELECT pg_catalog.pg_set_attribute_stats(
     relation => 'stats_import.test'::regclass,
@@ -301,7 +322,7 @@ SELECT pg_catalog.pg_set_attribute_stats(
     most_common_freqs => '{0.2,0.1}'::real[]
     );
 ERROR:  invalid input syntax for type integer: "2023-09-30"
--- warning: mcv cast failure
+-- error: mcv cast failure
 SELECT pg_catalog.pg_set_attribute_stats(
     relation => 'stats_import.test'::regclass,
     attname => 'id'::name,
index 9b6c9094862757439e2731ac01d7b4f5e8fd5964..b5689ac8fb35bc77b7264c569e7105eb89442d73 100644 (file)
@@ -130,6 +130,12 @@ SELECT pg_catalog.pg_set_attribute_stats(
     avg_width => 2::integer,
     n_distinct => 0.3::real);
 
+-- error: object doesn't exist
+SELECT pg_catalog.pg_clear_attribute_stats(
+    relation => '0'::oid,
+    attname => 'id'::name,
+    inherited => false::boolean);
+
 -- error: relation null
 SELECT pg_catalog.pg_set_attribute_stats(
     relation => NULL::oid,
@@ -139,6 +145,21 @@ SELECT pg_catalog.pg_set_attribute_stats(
     avg_width => 2::integer,
     n_distinct => 0.3::real);
 
+-- error: attname doesn't exist
+SELECT pg_catalog.pg_set_attribute_stats(
+    relation => 'stats_import.test'::regclass,
+    attname => 'nope'::name,
+    inherited => false::boolean,
+    null_frac => 0.1::real,
+    avg_width => 2::integer,
+    n_distinct => 0.3::real);
+
+-- error: attname doesn't exist
+SELECT pg_catalog.pg_clear_attribute_stats(
+    relation => 'stats_import.test'::regclass,
+    attname => 'nope'::name,
+    inherited => false::boolean);
+
 -- error: attname null
 SELECT pg_catalog.pg_set_attribute_stats(
     relation => 'stats_import.test'::regclass,
@@ -231,7 +252,7 @@ SELECT pg_catalog.pg_set_attribute_stats(
     most_common_freqs => '{0.2,0.1}'::real[]
     );
 
--- warning: mcv cast failure
+-- error: mcv cast failure
 SELECT pg_catalog.pg_set_attribute_stats(
     relation => 'stats_import.test'::regclass,
     attname => 'id'::name,