From 882b2cdc08c4100e273f24742e2118be98708a07 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sun, 21 Mar 2021 00:28:13 +0100 Subject: [PATCH] Use valid compression method in brin_form_tuple When compressing the BRIN summary, we can't simply use the compression method from the indexed attribute. The summary may use a different data type, e.g. fixed-length attribute may have varlena summary, leading to compression failures. For the built-in BRIN opclasses this happens to work, because the summary uses the same data type as the attribute. When the data types match, we can inherit use the compression method specified for the attribute (it's copied into the index descriptor). Otherwise we don't have much choice and have to use the default one. Author: Tomas Vondra Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/e0367f27-392c-321a-7411-a58e1a7e4817%40enterprisedb.com --- src/backend/access/brin/brin_tuple.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c index 0ab5712c71..8d03e609a3 100644 --- a/src/backend/access/brin/brin_tuple.c +++ b/src/backend/access/brin/brin_tuple.c @@ -213,10 +213,22 @@ brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno, BrinMemTuple *tuple, (atttype->typstorage == TYPSTORAGE_EXTENDED || atttype->typstorage == TYPSTORAGE_MAIN)) { + Datum cvalue; + char compression; Form_pg_attribute att = TupleDescAttr(brdesc->bd_tupdesc, keyno); - Datum cvalue = toast_compress_datum(value, - att->attcompression); + + /* + * If the BRIN summary and indexed attribute use the same data + * type, we can use the same compression method. Otherwise we + * have to use the default method. + */ + if (att->atttypid == atttype->type_id) + compression = att->attcompression; + else + compression = GetDefaultToastCompression(); + + cvalue = toast_compress_datum(value, compression); if (DatumGetPointer(cvalue) != NULL) {