From f91260e4b14d11a9189034aed1edcab81da766e8 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 8 Aug 2025 15:40:04 +0900 Subject: [PATCH v4 05/15] Move static inline routines of varatt_external_oid to toast_external.c This isolates most of the knowledge of varatt_external_oid into the local area where it is manipulated through the toast_external transition type, with the backend code not requiring it. Extension code should not need it either, as toast_external should be the layer to use when looking at external on-dist TOAST varlenas. --- src/include/varatt.h | 30 ----------------- src/backend/access/common/toast_external.c | 39 ++++++++++++++++++++-- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/include/varatt.h b/src/include/varatt.h index b791ce7847ed..631aa2ecc494 100644 --- a/src/include/varatt.h +++ b/src/include/varatt.h @@ -513,22 +513,6 @@ VARDATA_COMPRESSED_GET_COMPRESS_METHOD(const void *PTR) return ((varattrib_4b *) PTR)->va_compressed.va_tcinfo >> VARLENA_EXTSIZE_BITS; } -/* - * Same for external Datums; but note argument is a struct - * varatt_external_oid. - */ -static inline Size -VARATT_EXTERNAL_GET_EXTSIZE(struct varatt_external_oid toast_pointer) -{ - return toast_pointer.va_extinfo & VARLENA_EXTSIZE_MASK; -} - -static inline uint32 -VARATT_EXTERNAL_GET_COMPRESS_METHOD(struct varatt_external_oid toast_pointer) -{ - return toast_pointer.va_extinfo >> VARLENA_EXTSIZE_BITS; -} - /* Set size and compress method of an externally-stored varlena datum */ /* This has to remain a macro; beware multiple evaluations! */ #define VARATT_EXTERNAL_SET_SIZE_AND_COMPRESS_METHOD(toast_pointer, len, cm) \ @@ -539,18 +523,4 @@ VARATT_EXTERNAL_GET_COMPRESS_METHOD(struct varatt_external_oid toast_pointer) (len) | ((uint32) (cm) << VARLENA_EXTSIZE_BITS)); \ } while (0) -/* - * Testing whether an externally-stored value is compressed now requires - * comparing size stored in va_extinfo (the actual length of the external data) - * to rawsize (the original uncompressed datum's size). The latter includes - * VARHDRSZ overhead, the former doesn't. We never use compression unless it - * actually saves space, so we expect either equality or less-than. - */ -static inline bool -VARATT_EXTERNAL_IS_COMPRESSED(struct varatt_external_oid toast_pointer) -{ - return VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) < - (Size) (toast_pointer.va_rawsize - VARHDRSZ); -} - #endif diff --git a/src/backend/access/common/toast_external.c b/src/backend/access/common/toast_external.c index 96ea7be8966e..79ae02873748 100644 --- a/src/backend/access/common/toast_external.c +++ b/src/backend/access/common/toast_external.c @@ -22,6 +22,39 @@ static void ondisk_oid_to_external_data(struct varlena *attr, toast_external_data *data); static struct varlena *ondisk_oid_create_external_data(toast_external_data data); +/* + * Decompressed size of an on-disk varlena; but note argument is a struct + * varatt_external_oid. + */ +static inline Size +varatt_external_oid_get_extsize(struct varatt_external_oid toast_pointer) +{ + return toast_pointer.va_extinfo & VARLENA_EXTSIZE_MASK; +} + +/* + * Compression method of an on-disk varlena; but note argument is a struct + * varatt_external_oid. + */ +static inline uint32 +varatt_external_oid_get_compress_method(struct varatt_external_oid toast_pointer) +{ + return toast_pointer.va_extinfo >> VARLENA_EXTSIZE_BITS; +} + +/* + * Testing whether an externally-stored TOAST value is compressed now requires + * comparing size stored in va_extinfo (the actual length of the external data) + * to rawsize (the original uncompressed datum's size). The latter includes + * VARHDRSZ overhead, the former doesn't. We never use compression unless it + * actually saves space, so we expect either equality or less-than. + */ +static inline bool +varatt_external_oid_is_compressed(struct varatt_external_oid toast_pointer) +{ + return varatt_external_oid_get_extsize(toast_pointer) < + (Size) (toast_pointer.va_rawsize - VARHDRSZ); +} /* * Size of an EXTERNAL datum that contains a standard TOAST pointer (OID @@ -117,10 +150,10 @@ ondisk_oid_to_external_data(struct varlena *attr, toast_external_data *data) * External size and compression methods are stored in the same field, * extract. */ - if (VARATT_EXTERNAL_IS_COMPRESSED(external)) + if (varatt_external_oid_is_compressed(external)) { - data->extsize = VARATT_EXTERNAL_GET_EXTSIZE(external); - data->compression_method = VARATT_EXTERNAL_GET_COMPRESS_METHOD(external); + data->extsize = varatt_external_oid_get_extsize(external); + data->compression_method = varatt_external_oid_get_compress_method(external); } else { -- 2.50.0