Hello. While I looked into a patch, I noticed that check_tuple_attribute does not run the check for compessed data even if a compressed data is given.
check_tuple_attribute() .. struct varatt_external toast_pointer; .. VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr); .. if (VARATT_IS_COMPRESSED(&toast_pointer)) { Since toast_pointer is a varatt_exteral it should be VARATT_EXTERNAL_IS_COMPRESSED instead. Since the just following corss-check is just the reverse of what the macro does, it is useless. What do you think about the attached? The problem code is new in PG15. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
>From 00ae35ca30a6d3168dc4905ab5ba9db1339fe377 Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi <horikyota....@gmail.com> Date: Tue, 17 May 2022 16:19:27 +0900 Subject: [PATCH] Use correct macro to check compressed-ness in amcheck check_tuple_attribute uses VARATT_IS_COMPRESSED() for varatt_external. This should be VARATT_EXTERNAL_IS_COMPRESSED() instead. Remove the following cross check for data size since the ycondition cannot be true. --- contrib/amcheck/verify_heapam.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index c875f3e5a2..e488f5e234 100644 --- a/contrib/amcheck/verify_heapam.c +++ b/contrib/amcheck/verify_heapam.c @@ -1385,19 +1385,11 @@ check_tuple_attribute(HeapCheckContext *ctx) toast_pointer.va_rawsize, VARLENA_SIZE_LIMIT)); - if (VARATT_IS_COMPRESSED(&toast_pointer)) + if (VARATT_EXTERNAL_IS_COMPRESSED(toast_pointer)) { ToastCompressionId cmid; bool valid = false; - /* Compression should never expand the attribute */ - if (VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) > toast_pointer.va_rawsize - VARHDRSZ) - report_corruption(ctx, - psprintf("toast value %u external size %u exceeds maximum expected for rawsize %d", - toast_pointer.va_valueid, - VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer), - toast_pointer.va_rawsize)); - /* Compressed attributes should have a valid compression method */ cmid = TOAST_COMPRESS_METHOD(&toast_pointer); switch (cmid) -- 2.27.0