v4-0003-varatt_external-varatt_external_oid-and-VARTAG_ON.patch
text/x-diff
Filename: v4-0003-varatt_external-varatt_external_oid-and-VARTAG_ON.patch
Type: text/x-diff
Part: 2
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v4-0003
Subject: varatt_external->varatt_external_oid and VARTAG_ONDISK->VARTAG_ONDISK_OID
| File | + | − |
|---|---|---|
| contrib/amcheck/verify_heapam.c | 3 | 3 |
| src/backend/access/common/detoast.c | 5 | 5 |
| src/backend/access/common/toast_compression.c | 1 | 1 |
| src/backend/access/common/toast_internals.c | 4 | 4 |
| src/backend/replication/logical/reorderbuffer.c | 1 | 1 |
| src/backend/utils/adt/varlena.c | 1 | 1 |
| src/include/access/detoast.h | 2 | 2 |
| src/include/varatt.h | 19 | 15 |
From 742631089dfe7f2f247ee2cd652e749081d68c47 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Fri, 8 Aug 2025 14:50:06 +0900
Subject: [PATCH v4 03/15] varatt_external->varatt_external_oid and
VARTAG_ONDISK->VARTAG_ONDISK_OID
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/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 | 8 ++---
.../replication/logical/reorderbuffer.c | 2 +-
src/backend/utils/adt/varlena.c | 2 +-
contrib/amcheck/verify_heapam.c | 6 ++--
8 files changed, 36 insertions(+), 32 deletions(-)
diff --git a/src/include/access/detoast.h b/src/include/access/detoast.h
index e603a2276c38..d80a62e64fd5 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 "struct 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_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/varatt.h b/src/include/varatt.h
index aeeabf9145b5..fcf2dffaa2fd 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
+ * struct 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 struct 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 struct 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(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 toast_pointer)
+VARATT_EXTERNAL_GET_COMPRESS_METHOD(struct 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(struct 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..04eedb474c74 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;
+ struct 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;
+ struct 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;
+ struct 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;
+ struct 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;
+ struct 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..26aad84d367a 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;
+ struct 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 0016a16afc95..d555c02e908e 100644
--- a/src/backend/access/common/toast_internals.c
+++ b/src/backend/access/common/toast_internals.c
@@ -127,7 +127,7 @@ toast_save_datum(Relation rel, Datum value,
bool t_isnull[3];
CommandId mycid = GetCurrentCommandId(true);
struct varlena *result;
- struct varatt_external toast_pointer;
+ struct varatt_external_oid toast_pointer;
union
{
struct varlena hdr;
@@ -237,7 +237,7 @@ toast_save_datum(Relation rel, Datum value,
toast_pointer.va_valueid = InvalidOid;
if (oldexternal != NULL)
{
- struct varatt_external old_toast_pointer;
+ struct varatt_external_oid old_toast_pointer;
Assert(VARATT_IS_EXTERNAL_ONDISK(oldexternal));
/* Must copy to access aligned fields */
@@ -369,7 +369,7 @@ 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);
+ SET_VARTAG_EXTERNAL(result, VARTAG_ONDISK_OID);
memcpy(VARDATA_EXTERNAL(result), &toast_pointer, sizeof(toast_pointer));
return PointerGetDatum(result);
@@ -385,7 +385,7 @@ void
toast_delete_datum(Relation rel, Datum value, bool is_speculative)
{
struct varlena *attr = (struct varlena *) DatumGetPointer(value);
- struct varatt_external toast_pointer;
+ struct varatt_external_oid toast_pointer;
Relation toastrel;
Relation *toastidxs;
ScanKeyData toastkey;
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 36e2a4360e18..0eb99b4f1377 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -5102,7 +5102,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;
+ struct 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 ffae8c23abfa..38d4e6d45f28 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -4219,7 +4219,7 @@ pg_column_toast_chunk_id(PG_FUNCTION_ARGS)
{
int typlen;
struct varlena *attr;
- struct varatt_external toast_pointer;
+ struct 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/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 3b2bdced4cdc..030f9fb64b51 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;
+ struct varatt_external_oid toast_pointer;
BlockNumber blkno; /* block in main table */
OffsetNumber offnum; /* offset in main table */
AttrNumber attnum; /* attribute in main table */
@@ -1672,7 +1672,7 @@ check_tuple_attribute(HeapCheckContext *ctx)
uint16 infomask;
uint64 toast_pointer_valueid;
CompactAttribute *thisatt;
- struct varatt_external toast_pointer;
+ struct 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",
--
2.50.0