From: Jeff Davis Date: Wed, 23 Oct 2024 23:11:45 +0000 (-0700) Subject: Improve pg_set_attribute_stats() error message. X-Git-Tag: REL_18_BETA1~1648 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=4b096c67e0eed81e287094b9692fff72b9ea3eef;p=postgresql.git Improve pg_set_attribute_stats() error message. Previously, an invalid attribute name was caught, but the error message was unhelpful. --- diff --git a/src/backend/statistics/attribute_stats.c b/src/backend/statistics/attribute_stats.c index 086dceaeafe..979fe41a000 100644 --- a/src/backend/statistics/attribute_stats.c +++ b/src/backend/statistics/attribute_stats.c @@ -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); diff --git a/src/test/regress/expected/stats_import.out b/src/test/regress/expected/stats_import.out index 2868cc47f1d..6ab21ca324c 100644 --- a/src/test/regress/expected/stats_import.out +++ b/src/test/regress/expected/stats_import.out @@ -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, diff --git a/src/test/regress/sql/stats_import.sql b/src/test/regress/sql/stats_import.sql index 9b6c9094862..b5689ac8fb3 100644 --- a/src/test/regress/sql/stats_import.sql +++ b/src/test/regress/sql/stats_import.sql @@ -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,