diff options
author | Jeff Davis | 2025-02-26 00:15:47 +0000 |
---|---|---|
committer | Jeff Davis | 2025-02-26 00:15:47 +0000 |
commit | a5cbdeb98af9a8d4f683fbffa69cd74be1f4a084 (patch) | |
tree | e138c9760fd5bc8e10a2373fb4e3434ddc3fe173 /src/backend/statistics | |
parent | ecbff4378beecb0b1d12fc758538005a69821db1 (diff) |
Remove redundant pg_set_*_stats() variants.
After commit f3dae2ae58, the primary purpose of separating the
pg_set_*_stats() from the pg_restore_*_stats() variants was
eliminated.
Leave pg_restore_relation_stats() and pg_restore_attribute_stats(),
which satisfy both purposes, and remove pg_set_relation_stats() and
pg_set_attribute_stats().
Reviewed-by: Corey Huinker <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Diffstat (limited to 'src/backend/statistics')
-rw-r--r-- | src/backend/statistics/attribute_stats.c | 98 | ||||
-rw-r--r-- | src/backend/statistics/relation_stats.c | 24 | ||||
-rw-r--r-- | src/backend/statistics/stat_utils.c | 30 |
3 files changed, 54 insertions, 98 deletions
diff --git a/src/backend/statistics/attribute_stats.c b/src/backend/statistics/attribute_stats.c index c0c398a4bb2..66a5676c810 100644 --- a/src/backend/statistics/attribute_stats.c +++ b/src/backend/statistics/attribute_stats.c @@ -76,16 +76,16 @@ static struct StatsArgInfo attarginfo[] = [NUM_ATTRIBUTE_STATS_ARGS] = {0} }; -static bool attribute_statistics_update(FunctionCallInfo fcinfo, int elevel); +static bool attribute_statistics_update(FunctionCallInfo fcinfo); static Node *get_attr_expr(Relation rel, int attnum); -static void get_attr_stat_type(Oid reloid, AttrNumber attnum, int elevel, +static void get_attr_stat_type(Oid reloid, AttrNumber attnum, Oid *atttypid, int32 *atttypmod, char *atttyptype, Oid *atttypcoll, Oid *eq_opr, Oid *lt_opr); -static bool get_elem_stat_type(Oid atttypid, char atttyptype, int elevel, +static bool get_elem_stat_type(Oid atttypid, char atttyptype, Oid *elemtypid, Oid *elem_eq_opr); static Datum text_to_stavalues(const char *staname, FmgrInfo *array_in, Datum d, - Oid typid, int32 typmod, int elevel, bool *ok); + Oid typid, int32 typmod, bool *ok); static void set_stats_slot(Datum *values, bool *nulls, bool *replaces, int16 stakind, Oid staop, Oid stacoll, Datum stanumbers, bool stanumbers_isnull, @@ -109,11 +109,11 @@ static void init_empty_stats_tuple(Oid reloid, int16 attnum, bool inherited, * * Major errors, such as the table not existing, the attribute not existing, * or a permissions failure are always reported at ERROR. Other errors, such - * as a conversion failure on one statistic kind, are reported at 'elevel', + * as a conversion failure on one statistic kind, are reported as a WARNING * and other statistic kinds may still be updated. */ static bool -attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) +attribute_statistics_update(FunctionCallInfo fcinfo) { Oid reloid; Name attname; @@ -184,33 +184,29 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) inherited = PG_GETARG_BOOL(INHERITED_ARG); /* - * Check argument sanity. If some arguments are unusable, emit at elevel + * Check argument sanity. If some arguments are unusable, emit a WARNING * and set the corresponding argument to NULL in fcinfo. */ - if (!stats_check_arg_array(fcinfo, attarginfo, MOST_COMMON_FREQS_ARG, - elevel)) + if (!stats_check_arg_array(fcinfo, attarginfo, MOST_COMMON_FREQS_ARG)) { do_mcv = false; result = false; } - if (!stats_check_arg_array(fcinfo, attarginfo, MOST_COMMON_ELEM_FREQS_ARG, - elevel)) + if (!stats_check_arg_array(fcinfo, attarginfo, MOST_COMMON_ELEM_FREQS_ARG)) { do_mcelem = false; result = false; } - if (!stats_check_arg_array(fcinfo, attarginfo, ELEM_COUNT_HISTOGRAM_ARG, - elevel)) + if (!stats_check_arg_array(fcinfo, attarginfo, ELEM_COUNT_HISTOGRAM_ARG)) { do_dechist = false; result = false; } if (!stats_check_arg_pair(fcinfo, attarginfo, - MOST_COMMON_VALS_ARG, MOST_COMMON_FREQS_ARG, - elevel)) + MOST_COMMON_VALS_ARG, MOST_COMMON_FREQS_ARG)) { do_mcv = false; result = false; @@ -218,7 +214,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) if (!stats_check_arg_pair(fcinfo, attarginfo, MOST_COMMON_ELEMS_ARG, - MOST_COMMON_ELEM_FREQS_ARG, elevel)) + MOST_COMMON_ELEM_FREQS_ARG)) { do_mcelem = false; result = false; @@ -226,14 +222,14 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) if (!stats_check_arg_pair(fcinfo, attarginfo, RANGE_LENGTH_HISTOGRAM_ARG, - RANGE_EMPTY_FRAC_ARG, elevel)) + RANGE_EMPTY_FRAC_ARG)) { do_range_length_histogram = false; result = false; } /* derive information from attribute */ - get_attr_stat_type(reloid, attnum, elevel, + get_attr_stat_type(reloid, attnum, &atttypid, &atttypmod, &atttyptype, &atttypcoll, &eq_opr, <_opr); @@ -241,10 +237,10 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) /* if needed, derive element type */ if (do_mcelem || do_dechist) { - if (!get_elem_stat_type(atttypid, atttyptype, elevel, + if (!get_elem_stat_type(atttypid, atttyptype, &elemtypid, &elem_eq_opr)) { - ereport(elevel, + ereport(WARNING, (errmsg("unable to determine element type of attribute \"%s\"", NameStr(*attname)), errdetail("Cannot set STATISTIC_KIND_MCELEM or STATISTIC_KIND_DECHIST."))); elemtypid = InvalidOid; @@ -259,7 +255,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) /* histogram and correlation require less-than operator */ if ((do_histogram || do_correlation) && !OidIsValid(lt_opr)) { - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine less-than operator for attribute \"%s\"", NameStr(*attname)), errdetail("Cannot set STATISTIC_KIND_HISTOGRAM or STATISTIC_KIND_CORRELATION."))); @@ -273,7 +269,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) if ((do_range_length_histogram || do_bounds_histogram) && !(atttyptype == TYPTYPE_RANGE || atttyptype == TYPTYPE_MULTIRANGE)) { - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("attribute \"%s\" is not a range type", NameStr(*attname)), errdetail("Cannot set STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM or STATISTIC_KIND_BOUNDS_HISTOGRAM."))); @@ -322,7 +318,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) &array_in_fn, PG_GETARG_DATUM(MOST_COMMON_VALS_ARG), atttypid, atttypmod, - elevel, &converted); + &converted); if (converted) { @@ -344,7 +340,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) stavalues = text_to_stavalues("histogram_bounds", &array_in_fn, PG_GETARG_DATUM(HISTOGRAM_BOUNDS_ARG), - atttypid, atttypmod, elevel, + atttypid, atttypmod, &converted); if (converted) @@ -382,7 +378,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) &array_in_fn, PG_GETARG_DATUM(MOST_COMMON_ELEMS_ARG), elemtypid, atttypmod, - elevel, &converted); + &converted); if (converted) { @@ -422,7 +418,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) &array_in_fn, PG_GETARG_DATUM(RANGE_BOUNDS_HISTOGRAM_ARG), atttypid, atttypmod, - elevel, &converted); + &converted); if (converted) { @@ -449,7 +445,7 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) stavalues = text_to_stavalues("range_length_histogram", &array_in_fn, PG_GETARG_DATUM(RANGE_LENGTH_HISTOGRAM_ARG), - FLOAT8OID, 0, elevel, &converted); + FLOAT8OID, 0, &converted); if (converted) { @@ -517,7 +513,7 @@ get_attr_expr(Relation rel, int attnum) * Derive type information from the attribute. */ static void -get_attr_stat_type(Oid reloid, AttrNumber attnum, int elevel, +get_attr_stat_type(Oid reloid, AttrNumber attnum, Oid *atttypid, int32 *atttypmod, char *atttyptype, Oid *atttypcoll, Oid *eq_opr, Oid *lt_opr) @@ -599,7 +595,7 @@ get_attr_stat_type(Oid reloid, AttrNumber attnum, int elevel, * Derive element type information from the attribute type. */ static bool -get_elem_stat_type(Oid atttypid, char atttyptype, int elevel, +get_elem_stat_type(Oid atttypid, char atttyptype, Oid *elemtypid, Oid *elem_eq_opr) { TypeCacheEntry *elemtypcache; @@ -634,13 +630,13 @@ get_elem_stat_type(Oid atttypid, char atttyptype, int elevel, /* * Cast a text datum into an array with element type elemtypid. * - * If an error is encountered, capture it and re-throw at elevel, and set ok - * to false. If the resulting array contains NULLs, raise an error at elevel - * and set ok to false. Otherwise, set ok to true. + * If an error is encountered, capture it and re-throw a WARNING, and set ok + * to false. If the resulting array contains NULLs, raise a WARNING and set ok + * to false. Otherwise, set ok to true. */ static Datum text_to_stavalues(const char *staname, FmgrInfo *array_in, Datum d, Oid typid, - int32 typmod, int elevel, bool *ok) + int32 typmod, bool *ok) { LOCAL_FCINFO(fcinfo, 8); char *s; @@ -667,8 +663,7 @@ text_to_stavalues(const char *staname, FmgrInfo *array_in, Datum d, Oid typid, if (escontext.error_occurred) { - if (elevel != ERROR) - escontext.error_data->elevel = elevel; + escontext.error_data->elevel = WARNING; ThrowErrorData(escontext.error_data); *ok = false; return (Datum) 0; @@ -676,7 +671,7 @@ text_to_stavalues(const char *staname, FmgrInfo *array_in, Datum d, Oid typid, if (array_contains_nulls(DatumGetArrayTypeP(result))) { - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"%s\" array cannot contain NULL values", staname))); *ok = false; @@ -852,33 +847,6 @@ init_empty_stats_tuple(Oid reloid, int16 attnum, bool inherited, } /* - * Import statistics for a given relation attribute. - * - * Inserts or replaces a row in pg_statistic for the given relation and - * attribute name. It takes input parameters that correspond to columns in the - * view pg_stats. - * - * Parameters null_frac, avg_width, and n_distinct all correspond to NOT NULL - * columns in pg_statistic. The remaining parameters all belong to a specific - * stakind. Some stakinds require multiple parameters, which must be specified - * together (or neither specified). - * - * Parameters are only superficially validated. Omitting a parameter or - * passing NULL leaves the statistic unchanged. - * - * Parameters corresponding to ANYARRAY columns are instead passed in as text - * values, which is a valid input string for an array of the type or element - * type of the attribute. Any error generated by the array_in() function will - * in turn fail the function. - */ -Datum -pg_set_attribute_stats(PG_FUNCTION_ARGS) -{ - attribute_statistics_update(fcinfo, ERROR); - PG_RETURN_VOID(); -} - -/* * Delete statistics for the given attribute. */ Datum @@ -933,10 +901,10 @@ pg_restore_attribute_stats(PG_FUNCTION_ARGS) InvalidOid, NULL, NULL); if (!stats_fill_fcinfo_from_arg_pairs(fcinfo, positional_fcinfo, - attarginfo, WARNING)) + attarginfo)) result = false; - if (!attribute_statistics_update(positional_fcinfo, WARNING)) + if (!attribute_statistics_update(positional_fcinfo)) result = false; PG_RETURN_BOOL(result); diff --git a/src/backend/statistics/relation_stats.c b/src/backend/statistics/relation_stats.c index 66731290a3e..11b1ef2dbc2 100644 --- a/src/backend/statistics/relation_stats.c +++ b/src/backend/statistics/relation_stats.c @@ -48,13 +48,13 @@ static struct StatsArgInfo relarginfo[] = [NUM_RELATION_STATS_ARGS] = {0} }; -static bool relation_statistics_update(FunctionCallInfo fcinfo, int elevel); +static bool relation_statistics_update(FunctionCallInfo fcinfo); /* * Internal function for modifying statistics for a relation. */ static bool -relation_statistics_update(FunctionCallInfo fcinfo, int elevel) +relation_statistics_update(FunctionCallInfo fcinfo) { bool result = true; Oid reloid; @@ -83,7 +83,7 @@ relation_statistics_update(FunctionCallInfo fcinfo, int elevel) reltuples = PG_GETARG_FLOAT4(RELTUPLES_ARG); if (reltuples < -1.0) { - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("reltuples cannot be < -1.0"))); result = false; @@ -118,7 +118,7 @@ relation_statistics_update(FunctionCallInfo fcinfo, int elevel) ctup = SearchSysCache1(RELOID, ObjectIdGetDatum(reloid)); if (!HeapTupleIsValid(ctup)) { - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_OBJECT_IN_USE), errmsg("pg_class entry for relid %u not found", reloid))); table_close(crel, RowExclusiveLock); @@ -170,16 +170,6 @@ relation_statistics_update(FunctionCallInfo fcinfo, int elevel) } /* - * Set statistics for a given pg_class entry. - */ -Datum -pg_set_relation_stats(PG_FUNCTION_ARGS) -{ - relation_statistics_update(fcinfo, ERROR); - PG_RETURN_VOID(); -} - -/* * Clear statistics for a given pg_class entry; that is, set back to initial * stats for a newly-created table. */ @@ -199,7 +189,7 @@ pg_clear_relation_stats(PG_FUNCTION_ARGS) newfcinfo->args[3].value = UInt32GetDatum(0); newfcinfo->args[3].isnull = false; - relation_statistics_update(newfcinfo, ERROR); + relation_statistics_update(newfcinfo); PG_RETURN_VOID(); } @@ -214,10 +204,10 @@ pg_restore_relation_stats(PG_FUNCTION_ARGS) InvalidOid, NULL, NULL); if (!stats_fill_fcinfo_from_arg_pairs(fcinfo, positional_fcinfo, - relarginfo, WARNING)) + relarginfo)) result = false; - if (!relation_statistics_update(positional_fcinfo, WARNING)) + if (!relation_statistics_update(positional_fcinfo)) result = false; PG_RETURN_BOOL(result); diff --git a/src/backend/statistics/stat_utils.c b/src/backend/statistics/stat_utils.c index e70ea1ce738..54ead90b5bb 100644 --- a/src/backend/statistics/stat_utils.c +++ b/src/backend/statistics/stat_utils.c @@ -48,13 +48,13 @@ stats_check_required_arg(FunctionCallInfo fcinfo, * Check that argument is either NULL or a one dimensional array with no * NULLs. * - * If a problem is found, emit at elevel, and return false. Otherwise return + * If a problem is found, emit a WARNING, and return false. Otherwise return * true. */ bool stats_check_arg_array(FunctionCallInfo fcinfo, struct StatsArgInfo *arginfo, - int argnum, int elevel) + int argnum) { ArrayType *arr; @@ -65,7 +65,7 @@ stats_check_arg_array(FunctionCallInfo fcinfo, if (ARR_NDIM(arr) != 1) { - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"%s\" cannot be a multidimensional array", arginfo[argnum].argname))); @@ -74,7 +74,7 @@ stats_check_arg_array(FunctionCallInfo fcinfo, if (array_contains_nulls(arr)) { - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"%s\" array cannot contain NULL values", arginfo[argnum].argname))); @@ -89,13 +89,13 @@ stats_check_arg_array(FunctionCallInfo fcinfo, * a particular stakind, such as most_common_vals and most_common_freqs for * STATISTIC_KIND_MCV. * - * If a problem is found, emit at elevel, and return false. Otherwise return + * If a problem is found, emit a WARNING, and return false. Otherwise return * true. */ bool stats_check_arg_pair(FunctionCallInfo fcinfo, struct StatsArgInfo *arginfo, - int argnum1, int argnum2, int elevel) + int argnum1, int argnum2) { if (PG_ARGISNULL(argnum1) && PG_ARGISNULL(argnum2)) return true; @@ -105,7 +105,7 @@ stats_check_arg_pair(FunctionCallInfo fcinfo, int nullarg = PG_ARGISNULL(argnum1) ? argnum1 : argnum2; int otherarg = PG_ARGISNULL(argnum1) ? argnum2 : argnum1; - ereport(elevel, + ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("\"%s\" must be specified when \"%s\" is specified", arginfo[nullarg].argname, @@ -216,7 +216,7 @@ stats_lock_check_privileges(Oid reloid) * found. */ static int -get_arg_by_name(const char *argname, struct StatsArgInfo *arginfo, int elevel) +get_arg_by_name(const char *argname, struct StatsArgInfo *arginfo) { int argnum; @@ -224,7 +224,7 @@ get_arg_by_name(const char *argname, struct StatsArgInfo *arginfo, int elevel) if (pg_strcasecmp(argname, arginfo[argnum].argname) == 0) return argnum; - ereport(elevel, + ereport(WARNING, (errmsg("unrecognized argument name: \"%s\"", argname))); return -1; @@ -234,11 +234,11 @@ get_arg_by_name(const char *argname, struct StatsArgInfo *arginfo, int elevel) * Ensure that a given argument matched the expected type. */ static bool -stats_check_arg_type(const char *argname, Oid argtype, Oid expectedtype, int elevel) +stats_check_arg_type(const char *argname, Oid argtype, Oid expectedtype) { if (argtype != expectedtype) { - ereport(elevel, + ereport(WARNING, (errmsg("argument \"%s\" has type \"%s\", expected type \"%s\"", argname, format_type_be(argtype), format_type_be(expectedtype)))); @@ -260,8 +260,7 @@ stats_check_arg_type(const char *argname, Oid argtype, Oid expectedtype, int ele bool stats_fill_fcinfo_from_arg_pairs(FunctionCallInfo pairs_fcinfo, FunctionCallInfo positional_fcinfo, - struct StatsArgInfo *arginfo, - int elevel) + struct StatsArgInfo *arginfo) { Datum *args; bool *argnulls; @@ -319,11 +318,10 @@ stats_fill_fcinfo_from_arg_pairs(FunctionCallInfo pairs_fcinfo, if (pg_strcasecmp(argname, "version") == 0) continue; - argnum = get_arg_by_name(argname, arginfo, elevel); + argnum = get_arg_by_name(argname, arginfo); if (argnum < 0 || !stats_check_arg_type(argname, types[i + 1], - arginfo[argnum].argtype, - elevel)) + arginfo[argnum].argtype)) { result = false; continue; |