diff options
author | Tomas Vondra <tomas.vondra@postgresql.org> | 2021-09-20 00:34:57 +0200 |
---|---|---|
committer | Tomas Vondra <tomas.vondra@postgresql.org> | 2021-09-20 00:45:29 +0200 |
commit | 66061077155d68463ec00604ba7d6f0ae69716e8 (patch) | |
tree | 8d9950a1e70e63e78b5b531522279744ca65f5e7 | |
parent | 2a9a34c3100d8c0311c63baaa435be38a7d7aae5 (diff) | |
download | postgresql-66061077155d68463ec00604ba7d6f0ae69716e8.tar.gz postgresql-66061077155d68463ec00604ba7d6f0ae69716e8.zip |
Disallow extended statistics on system columns
Since introduction of extended statistics, we've disallowed references
to system columns. So for example
CREATE STATISTICS s ON ctid FROM t;
would fail. But with extended statistics on expressions, it was possible
to work around this limitation quite easily
CREATE STATISTICS s ON (ctid::text) FROM t;
This is an oversight in a4d75c86bf, fixed by adding a simple check.
Backpatch to PostgreSQL 14, where support for extended statistics on
expressions was introduced.
Backpatch-through: 14
Discussion: https://postgr.es/m/20210816013255.GS10479%40telsasoft.com
-rw-r--r-- | src/backend/commands/statscmds.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index 651b85ccc91..c4b9bd29ec9 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -287,9 +287,24 @@ CreateStatistics(CreateStatsStmt *stmt) Node *expr = selem->expr; Oid atttype; TypeCacheEntry *type; + Bitmapset *attnums = NULL; + int k; Assert(expr != NULL); + /* Disallow expressions referencing system attributes. */ + pull_varattnos(expr, 1, &attnums); + + k = -1; + while ((k = bms_next_member(attnums, k)) >= 0) + { + AttrNumber attnum = k + FirstLowInvalidHeapAttributeNumber; + if (attnum <= 0) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("statistics creation on system columns is not supported"))); + } + /* * Disallow data types without a less-than operator. * |