diff options
author | Peter Geoghegan <pg@bowt.ie> | 2020-03-30 12:03:59 -0700 |
---|---|---|
committer | Peter Geoghegan <pg@bowt.ie> | 2020-03-30 12:03:59 -0700 |
commit | 4b42a89938ac9d2ec06e9d831356407040e9094c (patch) | |
tree | 7ac5ec10fa2fd106def3d5fd4ac2d183253a44ee | |
parent | 911e70207703799605f5a0e8aad9f06cff067c63 (diff) | |
download | postgresql-4b42a89938ac9d2ec06e9d831356407040e9094c.tar.gz postgresql-4b42a89938ac9d2ec06e9d831356407040e9094c.zip |
Consistently truncate non-key suffix columns.
INCLUDE indexes failed to have their non-key attributes physically
truncated away in certain rare cases. This led to physically larger
pivot tuples that contained useless non-key attribute values. The
impact on users should be negligible, but this is still clearly a
regression (Postgres 11 supports INCLUDE indexes, and yet was not
affected).
The bug appeared in commit dd299df8, which introduced "true" suffix
truncation of key attributes.
Discussion: https://postgr.es/m/CAH2-Wz=E8pkV9ivRSFHtv812H5ckf8s1-yhx61_WrJbKccGcrQ@mail.gmail.com
Backpatch: 12-, where "true" suffix truncation was introduced.
-rw-r--r-- | src/backend/access/nbtree/nbtutils.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index 54afa6f4176..bbe2fe4bce5 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -2205,7 +2205,8 @@ _bt_truncate(Relation rel, IndexTuple lastleft, IndexTuple firstright, { IndexTuple tidpivot; - pivot = index_truncate_tuple(itupdesc, firstright, keepnatts); + pivot = index_truncate_tuple(itupdesc, firstright, + Min(keepnatts, nkeyatts)); if (BTreeTupleIsPosting(pivot)) { @@ -2250,6 +2251,10 @@ _bt_truncate(Relation rel, IndexTuple lastleft, IndexTuple firstright, /* * No truncation was possible, since key attributes are all equal. * It's necessary to add a heap TID attribute to the new pivot tuple. + * + * This path is only taken when rel is not an INCLUDE index. It + * avoids a second palloc0() by avoiding the index_truncate_tuple() + * call completely. */ Assert(natts == nkeyatts); newsize = IndexTupleSize(firstright) + MAXALIGN(sizeof(ItemPointerData)); |