From 6db6630943be39eee31cb0411e2a849ec97bc66c Mon Sep 17 00:00:00 2001
From: Nikita Glukhov <n.gluhov@postgrespro.ru>
Date: Wed, 12 Jan 2022 01:23:18 +0300
Subject: [PATCH 2/2] Fix alignment of custom TOAST pointers

---
 src/backend/access/common/heaptuple.c | 5 ++++-
 src/include/access/tupmacs.h          | 2 +-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 0b56b0fa5a9..47c808d462f 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -242,7 +242,10 @@ fill_val(Form_pg_attribute att,
 			else
 			{
 				*infomask |= HEAP_HASEXTERNAL;
-				/* no alignment, since it's short by definition */
+				if (VARATT_IS_CUSTOM(val))
+					data = (char *) att_align_nominal(data,
+													  att->attalign);
+				/* else no alignment, since it's short by definition */
 				data_length = VARSIZE_EXTERNAL(val);
 				memcpy(data, val, data_length);
 			}
diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h
index 65ac1ef3fc8..ddb164ef2ba 100644
--- a/src/include/access/tupmacs.h
+++ b/src/include/access/tupmacs.h
@@ -104,7 +104,7 @@
  */
 #define att_align_datum(cur_offset, attalign, attlen, attdatum) \
 ( \
-	((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \
+	((attlen) == -1 && (!VARATT_IS_CUSTOM(DatumGetPointer(attdatum)) && VARATT_IS_SHORT(DatumGetPointer(attdatum)))) ? \
 	(uintptr_t) (cur_offset) : \
 	att_align_nominal(cur_offset, attalign) \
 )
-- 
2.25.1

