diff options
author | Peter Eisentraut | 2024-03-17 11:22:05 +0000 |
---|---|---|
committer | Peter Eisentraut | 2024-03-17 11:26:26 +0000 |
commit | 012460ee93c304fbc7220e5b55d9d0577fc766ab (patch) | |
tree | af8936fda212e29d7678141691e2ad7e4b3ccd69 /src/backend/commands/statscmds.c | |
parent | 33e729c5148c3a697abc552621b34bdc5fd497ed (diff) |
Make stxstattarget nullable
To match attstattarget change (commit 4f622503d6d). The logic inside
CreateStatistics() is clarified a bit compared to that previous patch,
and so here we also update ATExecSetStatistics() to match.
Reviewed-by: Tomas Vondra <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/[email protected]
Diffstat (limited to 'src/backend/commands/statscmds.c')
-rw-r--r-- | src/backend/commands/statscmds.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index a855f750c75..5f49479832d 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -495,9 +495,9 @@ CreateStatistics(CreateStatsStmt *stmt) values[Anum_pg_statistic_ext_stxrelid - 1] = ObjectIdGetDatum(relid); values[Anum_pg_statistic_ext_stxname - 1] = NameGetDatum(&stxname); values[Anum_pg_statistic_ext_stxnamespace - 1] = ObjectIdGetDatum(namespaceId); - values[Anum_pg_statistic_ext_stxstattarget - 1] = Int16GetDatum(-1); values[Anum_pg_statistic_ext_stxowner - 1] = ObjectIdGetDatum(stxowner); values[Anum_pg_statistic_ext_stxkeys - 1] = PointerGetDatum(stxkeys); + nulls[Anum_pg_statistic_ext_stxstattarget - 1] = true; values[Anum_pg_statistic_ext_stxkind - 1] = PointerGetDatum(stxkind); values[Anum_pg_statistic_ext_stxexprs - 1] = exprsDatum; @@ -606,23 +606,36 @@ AlterStatistics(AlterStatsStmt *stmt) bool repl_null[Natts_pg_statistic_ext]; bool repl_repl[Natts_pg_statistic_ext]; ObjectAddress address; - int newtarget = stmt->stxstattarget; + int newtarget; + bool newtarget_default; - /* Limit statistics target to a sane range */ - if (newtarget < -1) + /* -1 was used in previous versions for the default setting */ + if (stmt->stxstattarget && intVal(stmt->stxstattarget) != -1) { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("statistics target %d is too low", - newtarget))); + newtarget = intVal(stmt->stxstattarget); + newtarget_default = false; } - else if (newtarget > MAX_STATISTICS_TARGET) + else + newtarget_default = true; + + if (!newtarget_default) { - newtarget = MAX_STATISTICS_TARGET; - ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("lowering statistics target to %d", - newtarget))); + /* Limit statistics target to a sane range */ + if (newtarget < 0) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("statistics target %d is too low", + newtarget))); + } + else if (newtarget > MAX_STATISTICS_TARGET) + { + newtarget = MAX_STATISTICS_TARGET; + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lowering statistics target to %d", + newtarget))); + } } /* lookup OID of the statistics object */ @@ -673,7 +686,10 @@ AlterStatistics(AlterStatsStmt *stmt) /* replace the stxstattarget column */ repl_repl[Anum_pg_statistic_ext_stxstattarget - 1] = true; - repl_val[Anum_pg_statistic_ext_stxstattarget - 1] = Int16GetDatum(newtarget); + if (!newtarget_default) + repl_val[Anum_pg_statistic_ext_stxstattarget - 1] = Int16GetDatum(newtarget); + else + repl_null[Anum_pg_statistic_ext_stxstattarget - 1] = true; newtup = heap_modify_tuple(oldtup, RelationGetDescr(rel), repl_val, repl_null, repl_repl); |