]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
amcheck: Use correct varlena size accessor in bt_normalize_tuple()
authorAlexander Korotkov <akorotkov@postgresql.org>
Sat, 13 Jun 2026 23:49:05 +0000 (02:49 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Sun, 14 Jun 2026 01:04:48 +0000 (04:04 +0300)
bt_normalize_tuple() uses VARSIZE() to get the size of varlena, even though
it's not yet known, that it has a 4-byte header.  Fix this by replacing a
accessor with a universal VARSIZE_ANY().

Backpatch to all supported versions.

Reported-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/7ckc7oka4bvafkf5bwlqs6ygrhlsbhz25ppozfch7zbuxcx3rf%40e4pr4oqenalc
Author: Andrey Borodin <x4mmm@yandex-team.ru>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 14

contrib/amcheck/verify_nbtree.c

index a5c62f2cb5c714c728edd0b668a1c337635db7f1..3ef2d66f82675cd80a56353727f207f66321fa22 100644 (file)
@@ -2891,7 +2891,7 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup)
                                                        ItemPointerGetOffsetNumber(&(itup->t_tid)),
                                                        RelationGetRelationName(state->rel))));
                else if (!VARATT_IS_COMPRESSED(DatumGetPointer(normalized[i])) &&
-                                VARSIZE(DatumGetPointer(normalized[i])) > TOAST_INDEX_TARGET &&
+                                VARSIZE_ANY(DatumGetPointer(normalized[i])) > TOAST_INDEX_TARGET &&
                                 (att->attstorage == TYPSTORAGE_EXTENDED ||
                                  att->attstorage == TYPSTORAGE_MAIN))
                {