From 2e1a74e9e793266bf5210964398d6a31b987d0ff Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 13 Aug 2025 18:28:10 +0900 Subject: [PATCH v9 04/15] Renames around varatt_external->varatt_external_oid This impacts a few things: - VARTAG_ONDISK -> VARTAG_ONDISK_OID - TOAST_POINTER_SIZE -> TOAST_OID_POINTER_SIZE - TOAST_MAX_CHUNK_SIZE -> TOAST_OID_MAX_CHUNK_SIZE The "struct" around varatt_external is cleaned up in most places, while on it. This rename is in preparation of a follow-up commit that aims at adding support for multiple types of external on-disk TOAST pointers, where the OID type is only one subset of them. --- src/include/access/detoast.h | 4 +-- src/include/access/heaptoast.h | 6 ++-- src/include/varatt.h | 34 +++++++++++-------- src/backend/access/common/detoast.c | 10 +++--- src/backend/access/common/toast_compression.c | 2 +- src/backend/access/common/toast_internals.c | 14 ++++---- src/backend/access/heap/heaptoast.c | 2 +- src/backend/access/table/toast_helper.c | 4 +-- src/backend/access/transam/xlog.c | 8 ++--- .../replication/logical/reorderbuffer.c | 2 +- src/backend/utils/adt/varlena.c | 2 +- src/bin/pg_resetwal/pg_resetwal.c | 2 +- doc/src/sgml/func/func-info.sgml | 2 +- doc/src/sgml/storage.sgml | 2 +- contrib/amcheck/verify_heapam.c | 10 +++--- 15 files changed, 54 insertions(+), 50 deletions(-) diff --git a/src/include/access/detoast.h b/src/include/access/detoast.h index e603a2276c38..6435597b1127 100644 --- a/src/include/access/detoast.h +++ b/src/include/access/detoast.h @@ -14,7 +14,7 @@ /* * Macro to fetch the possibly-unaligned contents of an EXTERNAL datum - * into a local "struct varatt_external" toast pointer. This should be + * into a local "varatt_external_oid" toast pointer. This should be * just a memcpy, but some versions of gcc seem to produce broken code * that assumes the datum contents are aligned. Introducing an explicit * intermediate "varattrib_1b_e *" variable seems to fix it. @@ -28,7 +28,7 @@ do { \ } while (0) /* Size of an EXTERNAL datum that contains a standard TOAST pointer */ -#define TOAST_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_external)) +#define TOAST_OID_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_external_oid)) /* Size of an EXTERNAL datum that contains an indirection pointer */ #define INDIRECT_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_indirect)) diff --git a/src/include/access/heaptoast.h b/src/include/access/heaptoast.h index de6b3e2212a5..55a6a17b2c0b 100644 --- a/src/include/access/heaptoast.h +++ b/src/include/access/heaptoast.h @@ -69,19 +69,19 @@ /* * When we store an oversize datum externally, we divide it into chunks - * containing at most TOAST_MAX_CHUNK_SIZE data bytes. This number *must* + * containing at most TOAST_OID_MAX_CHUNK_SIZE data bytes. This number *must* * be small enough that the completed toast-table tuple (including the * ID and sequence fields and all overhead) will fit on a page. * The coding here sets the size on the theory that we want to fit * EXTERN_TUPLES_PER_PAGE tuples of maximum size onto a page. * - * NB: Changing TOAST_MAX_CHUNK_SIZE requires an initdb. + * NB: Changing TOAST_OID_MAX_CHUNK_SIZE requires an initdb. */ #define EXTERN_TUPLES_PER_PAGE 4 /* tweak only this */ #define EXTERN_TUPLE_MAX_SIZE MaximumBytesPerTuple(EXTERN_TUPLES_PER_PAGE) -#define TOAST_MAX_CHUNK_SIZE \ +#define TOAST_OID_MAX_CHUNK_SIZE \ (EXTERN_TUPLE_MAX_SIZE - \ MAXALIGN(SizeofHeapTupleHeader) - \ sizeof(Oid) - \ diff --git a/src/include/varatt.h b/src/include/varatt.h index aeeabf9145b5..c873a59bb1c9 100644 --- a/src/include/varatt.h +++ b/src/include/varatt.h @@ -16,7 +16,7 @@ #define VARATT_H /* - * struct varatt_external is a traditional "TOAST pointer", that is, the + * varatt_external_oid is a traditional "TOAST pointer", that is, the * information needed to fetch a Datum stored out-of-line in a TOAST table. * The data is compressed if and only if the external size stored in * va_extinfo is less than va_rawsize - VARHDRSZ. @@ -29,14 +29,14 @@ * you can look at these fields! (The reason we use memcmp is to avoid * having to do that just to detect equality of two TOAST pointers...) */ -typedef struct varatt_external +typedef struct varatt_external_oid { int32 va_rawsize; /* Original data size (includes header) */ uint32 va_extinfo; /* External saved size (without header) and * compression method */ Oid va_valueid; /* Unique ID of value within TOAST table */ Oid va_toastrelid; /* RelID of TOAST table containing it */ -} varatt_external; +} varatt_external_oid; /* * These macros define the "saved size" portion of va_extinfo. Its remaining @@ -51,7 +51,7 @@ typedef struct varatt_external * The creator of such a Datum is entirely responsible that the referenced * storage survives for as long as referencing pointer Datums can exist. * - * Note that just as for struct varatt_external, this struct is stored + * Note that just as for varatt_external_oid, this struct is stored * unaligned within any containing tuple. */ typedef struct varatt_indirect @@ -66,7 +66,7 @@ typedef struct varatt_indirect * storage. APIs for this, in particular the definition of struct * ExpandedObjectHeader, are in src/include/utils/expandeddatum.h. * - * Note that just as for struct varatt_external, this struct is stored + * Note that just as for varatt_external_oid, this struct is stored * unaligned within any containing tuple. */ typedef struct ExpandedObjectHeader ExpandedObjectHeader; @@ -78,15 +78,16 @@ typedef struct varatt_expanded /* * Type tag for the various sorts of "TOAST pointer" datums. The peculiar - * value for VARTAG_ONDISK comes from a requirement for on-disk compatibility - * with a previous notion that the tag field was the pointer datum's length. + * value for VARTAG_ONDISK_OID comes from a requirement for on-disk + * compatibility with a previous notion that the tag field was the pointer + * datum's length. */ typedef enum vartag_external { VARTAG_INDIRECT = 1, VARTAG_EXPANDED_RO = 2, VARTAG_EXPANDED_RW = 3, - VARTAG_ONDISK = 18 + VARTAG_ONDISK_OID = 18 } vartag_external; /* Is a TOAST pointer either type of expanded-object pointer? */ @@ -105,8 +106,8 @@ VARTAG_SIZE(vartag_external tag) return sizeof(varatt_indirect); else if (VARTAG_IS_EXPANDED(tag)) return sizeof(varatt_expanded); - else if (tag == VARTAG_ONDISK) - return sizeof(varatt_external); + else if (tag == VARTAG_ONDISK_OID) + return sizeof(varatt_external_oid); else { Assert(false); @@ -360,7 +361,7 @@ VARATT_IS_EXTERNAL(const void *PTR) static inline bool VARATT_IS_EXTERNAL_ONDISK(const void *PTR) { - return VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_ONDISK; + return VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_ONDISK_OID; } /* Is varlena datum an indirect pointer? */ @@ -502,15 +503,18 @@ 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 */ +/* + * Same for external Datums; but note argument is a struct + * varatt_external_oid. + */ static inline Size -VARATT_EXTERNAL_GET_EXTSIZE(struct varatt_external toast_pointer) +VARATT_EXTERNAL_GET_EXTSIZE(varatt_external_oid toast_pointer) { return toast_pointer.va_extinfo & VARLENA_EXTSIZE_MASK; } static inline uint32 -VARATT_EXTERNAL_GET_COMPRESS_METHOD(struct varatt_external toast_pointer) +VARATT_EXTERNAL_GET_COMPRESS_METHOD(varatt_external_oid toast_pointer) { return toast_pointer.va_extinfo >> VARLENA_EXTSIZE_BITS; } @@ -533,7 +537,7 @@ VARATT_EXTERNAL_GET_COMPRESS_METHOD(struct varatt_external toast_pointer) * actually saves space, so we expect either equality or less-than. */ static inline bool -VARATT_EXTERNAL_IS_COMPRESSED(struct varatt_external toast_pointer) +VARATT_EXTERNAL_IS_COMPRESSED(varatt_external_oid toast_pointer) { return VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) < (Size) (toast_pointer.va_rawsize - VARHDRSZ); diff --git a/src/backend/access/common/detoast.c b/src/backend/access/common/detoast.c index 626517877422..c187c32d96dd 100644 --- a/src/backend/access/common/detoast.c +++ b/src/backend/access/common/detoast.c @@ -225,7 +225,7 @@ detoast_attr_slice(struct varlena *attr, if (VARATT_IS_EXTERNAL_ONDISK(attr)) { - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr); @@ -344,7 +344,7 @@ toast_fetch_datum(struct varlena *attr) { Relation toastrel; struct varlena *result; - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; int32 attrsize; if (!VARATT_IS_EXTERNAL_ONDISK(attr)) @@ -398,7 +398,7 @@ toast_fetch_datum_slice(struct varlena *attr, int32 sliceoffset, { Relation toastrel; struct varlena *result; - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; int32 attrsize; if (!VARATT_IS_EXTERNAL_ONDISK(attr)) @@ -550,7 +550,7 @@ toast_raw_datum_size(Datum value) if (VARATT_IS_EXTERNAL_ONDISK(attr)) { /* va_rawsize is the size of the original datum -- including header */ - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr); result = toast_pointer.va_rawsize; @@ -610,7 +610,7 @@ toast_datum_size(Datum value) * compressed or not. We do not count the size of the toast pointer * ... should we? */ - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr); result = VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer); diff --git a/src/backend/access/common/toast_compression.c b/src/backend/access/common/toast_compression.c index 926f1e4008ab..08f572f31eed 100644 --- a/src/backend/access/common/toast_compression.c +++ b/src/backend/access/common/toast_compression.c @@ -262,7 +262,7 @@ toast_get_compression_id(struct varlena *attr) */ if (VARATT_IS_EXTERNAL_ONDISK(attr)) { - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr); diff --git a/src/backend/access/common/toast_internals.c b/src/backend/access/common/toast_internals.c index f5a50c00c2e3..32eaf37f79a8 100644 --- a/src/backend/access/common/toast_internals.c +++ b/src/backend/access/common/toast_internals.c @@ -124,7 +124,7 @@ toast_save_datum(Relation rel, Datum value, TupleDesc toasttupDesc; CommandId mycid = GetCurrentCommandId(true); struct varlena *result; - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; int32 chunk_seq = 0; char *data_p; int32 data_todo; @@ -225,7 +225,7 @@ toast_save_datum(Relation rel, Datum value, toast_pointer.va_valueid = InvalidOid; if (oldexternal != NULL) { - struct varatt_external old_toast_pointer; + varatt_external_oid old_toast_pointer; Assert(VARATT_IS_EXTERNAL_ONDISK(oldexternal)); /* Must copy to access aligned fields */ @@ -289,7 +289,7 @@ toast_save_datum(Relation rel, Datum value, { alignas(int32) struct varlena hdr; /* this is to make the union big enough for a chunk: */ - char data[TOAST_MAX_CHUNK_SIZE + VARHDRSZ]; + char data[TOAST_OID_MAX_CHUNK_SIZE + VARHDRSZ]; } chunk_data; int32 chunk_size; @@ -298,7 +298,7 @@ toast_save_datum(Relation rel, Datum value, /* * Calculate the size of this chunk */ - chunk_size = Min(TOAST_MAX_CHUNK_SIZE, data_todo); + chunk_size = Min(TOAST_OID_MAX_CHUNK_SIZE, data_todo); /* * Build a tuple and store it @@ -359,8 +359,8 @@ toast_save_datum(Relation rel, Datum value, /* * Create the TOAST pointer value that we'll return */ - result = (struct varlena *) palloc(TOAST_POINTER_SIZE); - SET_VARTAG_EXTERNAL(result, VARTAG_ONDISK); + result = (struct varlena *) palloc(TOAST_OID_POINTER_SIZE); + SET_VARTAG_EXTERNAL(result, VARTAG_ONDISK_OID); memcpy(VARDATA_EXTERNAL(result), &toast_pointer, sizeof(toast_pointer)); return PointerGetDatum(result); @@ -376,7 +376,7 @@ void toast_delete_datum(Relation rel, Datum value, bool is_speculative) { struct varlena *attr = (struct varlena *) DatumGetPointer(value); - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; Relation toastrel; Relation *toastidxs; ScanKeyData toastkey; diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c index d134f0292a6f..11b4fc6487d6 100644 --- a/src/backend/access/heap/heaptoast.c +++ b/src/backend/access/heap/heaptoast.c @@ -647,7 +647,7 @@ heap_fetch_toast_slice(Relation toastrel, Oid8 valueid, int32 attrsize, &toastidxs, &num_indexes); - max_chunk_size = TOAST_MAX_CHUNK_SIZE; + max_chunk_size = TOAST_OID_MAX_CHUNK_SIZE; totalchunks = ((attrsize - 1) / max_chunk_size) + 1; startchunk = sliceoffset / max_chunk_size; diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c index 11f97d65367d..0c58c6c32565 100644 --- a/src/backend/access/table/toast_helper.c +++ b/src/backend/access/table/toast_helper.c @@ -171,7 +171,7 @@ toast_tuple_init(ToastTupleContext *ttc) * The column must have attstorage EXTERNAL or EXTENDED if check_main is * false, and must have attstorage MAIN if check_main is true. * - * The column must have a minimum size of MAXALIGN(TOAST_POINTER_SIZE); + * The column must have a minimum size of MAXALIGN(TOAST_OID_POINTER_SIZE); * if not, no benefit is to be expected by compressing it. * * The return value is the index of the biggest suitable column, or @@ -184,7 +184,7 @@ toast_tuple_find_biggest_attribute(ToastTupleContext *ttc, TupleDesc tupleDesc = ttc->ttc_rel->rd_att; int numAttrs = tupleDesc->natts; int biggest_attno = -1; - int32 biggest_size = MAXALIGN(TOAST_POINTER_SIZE); + int32 biggest_size = MAXALIGN(TOAST_OID_POINTER_SIZE); int32 skip_colflags = TOASTCOL_IGNORE; int i; diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 430a38b1a216..017a0f196c2b 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -4280,7 +4280,7 @@ WriteControlFile(void) ControlFile->nameDataLen = NAMEDATALEN; ControlFile->indexMaxKeys = INDEX_MAX_KEYS; - ControlFile->toast_max_chunk_size = TOAST_MAX_CHUNK_SIZE; + ControlFile->toast_max_chunk_size = TOAST_OID_MAX_CHUNK_SIZE; ControlFile->loblksize = LOBLKSIZE; ControlFile->float8ByVal = true; /* vestigial */ @@ -4533,15 +4533,15 @@ ReadControlFile(void) "INDEX_MAX_KEYS", ControlFile->indexMaxKeys, "INDEX_MAX_KEYS", INDEX_MAX_KEYS), errhint("It looks like you need to recompile or initdb."))); - if (ControlFile->toast_max_chunk_size != TOAST_MAX_CHUNK_SIZE) + if (ControlFile->toast_max_chunk_size != TOAST_OID_MAX_CHUNK_SIZE) ereport(FATAL, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("database files are incompatible with server"), /* translator: %s is a variable name and %d is its value */ errdetail("The database cluster was initialized with %s %d," " but the server was compiled with %s %d.", - "TOAST_MAX_CHUNK_SIZE", ControlFile->toast_max_chunk_size, - "TOAST_MAX_CHUNK_SIZE", (int) TOAST_MAX_CHUNK_SIZE), + "TOAST_OID_MAX_CHUNK_SIZE", ControlFile->toast_max_chunk_size, + "TOAST_OID_MAX_CHUNK_SIZE", (int) TOAST_OID_MAX_CHUNK_SIZE), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->loblksize != LOBLKSIZE) ereport(FATAL, diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 4c59ca2453be..2c9840d4b9cd 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -5136,7 +5136,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn, struct varlena *varlena; /* va_rawsize is the size of the original datum -- including header */ - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; struct varatt_indirect redirect_pointer; struct varlena *new_datum = NULL; struct varlena *reconstructed; diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 8adeb8dadc66..dfcf888c7c43 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -4195,7 +4195,7 @@ pg_column_toast_chunk_id(PG_FUNCTION_ARGS) { int typlen; struct varlena *attr; - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; /* On first call, get the input type's typlen, and save at *fn_extra */ if (fcinfo->flinfo->fn_extra == NULL) diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c index 9bfab8c307bc..deef3261f444 100644 --- a/src/bin/pg_resetwal/pg_resetwal.c +++ b/src/bin/pg_resetwal/pg_resetwal.c @@ -733,7 +733,7 @@ GuessControlValues(void) ControlFile.xlog_seg_size = DEFAULT_XLOG_SEG_SIZE; ControlFile.nameDataLen = NAMEDATALEN; ControlFile.indexMaxKeys = INDEX_MAX_KEYS; - ControlFile.toast_max_chunk_size = TOAST_MAX_CHUNK_SIZE; + ControlFile.toast_max_chunk_size = TOAST_OID_MAX_CHUNK_SIZE; ControlFile.loblksize = LOBLKSIZE; ControlFile.float8ByVal = true; /* vestigial */ diff --git a/doc/src/sgml/func/func-info.sgml b/doc/src/sgml/func/func-info.sgml index d4508114a48e..e51612f1fead 100644 --- a/doc/src/sgml/func/func-info.sgml +++ b/doc/src/sgml/func/func-info.sgml @@ -3533,7 +3533,7 @@ acl | {postgres=arwdDxtm/postgres,foo=r/postgres} - max_toast_chunk_size + max_toast_oid_chunk_size integer diff --git a/doc/src/sgml/storage.sgml b/doc/src/sgml/storage.sgml index 02ddfda834a2..67600fd974d7 100644 --- a/doc/src/sgml/storage.sgml +++ b/doc/src/sgml/storage.sgml @@ -417,7 +417,7 @@ described in more detail below. Out-of-line values are divided (after compression if used) into chunks of at -most TOAST_MAX_CHUNK_SIZE bytes (by default this value is chosen +most TOAST_OID_MAX_CHUNK_SIZE bytes (by default this value is chosen so that four chunk rows will fit on a page, making it about 2000 bytes). Each chunk is stored as a separate row in the TOAST table belonging to the owning table. Every diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index 7b4f83aab012..5f51e8d55153 100644 --- a/contrib/amcheck/verify_heapam.c +++ b/contrib/amcheck/verify_heapam.c @@ -73,7 +73,7 @@ typedef enum SkipPages */ typedef struct ToastedAttribute { - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; BlockNumber blkno; /* block in main table */ OffsetNumber offnum; /* offset in main table */ AttrNumber attnum; /* attribute in main table */ @@ -1566,7 +1566,7 @@ check_toast_tuple(HeapTuple toasttup, HeapCheckContext *ctx, toast_valueid = ta->toast_pointer.va_valueid; - max_chunk_size = TOAST_MAX_CHUNK_SIZE; + max_chunk_size = TOAST_OID_MAX_CHUNK_SIZE; last_chunk_seq = (extsize - 1) / max_chunk_size; /* Sanity-check the sequence number. */ @@ -1672,7 +1672,7 @@ check_tuple_attribute(HeapCheckContext *ctx) uint16 infomask; Oid8 toast_pointer_valueid; CompactAttribute *thisatt; - struct varatt_external toast_pointer; + varatt_external_oid toast_pointer; infomask = ctx->tuphdr->t_infomask; thisatt = TupleDescCompactAttr(RelationGetDescr(ctx->rel), ctx->attnum); @@ -1731,7 +1731,7 @@ check_tuple_attribute(HeapCheckContext *ctx) { uint8 va_tag = VARTAG_EXTERNAL(tp + ctx->offset); - if (va_tag != VARTAG_ONDISK) + if (va_tag != VARTAG_ONDISK_OID) { report_corruption(ctx, psprintf("toasted attribute has unexpected TOAST tag %u", @@ -1876,7 +1876,7 @@ check_toasted_attribute(HeapCheckContext *ctx, ToastedAttribute *ta) int32 expected_chunk_seq = 0; int32 last_chunk_seq; Oid8 toast_valueid; - int32 max_chunk_size = TOAST_MAX_CHUNK_SIZE; + int32 max_chunk_size = TOAST_OID_MAX_CHUNK_SIZE; extsize = VARATT_EXTERNAL_GET_EXTSIZE(ta->toast_pointer); last_chunk_seq = (extsize - 1) / max_chunk_size; -- 2.51.0