summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Kapila2018-10-03 03:34:54 +0000
committerAmit Kapila2018-10-03 03:45:03 +0000
commit9bc9f72b28fe4d2c22244f3443af8f1b98b56474 (patch)
tree2688cc240c37bdf0b2f1fa26b8a779c5e9f72786
parenta33245a8537f8ecbd2cd50c67b2b234f65e8fe14 (diff)
MAXALIGN the target address where we store flattened value.
The API (EOH_flatten_into) that flattens the expanded value representation expects the target address to be maxaligned. All it's usage adhere to that principle except when serializing datums for parallel query. Fix that usage. Diagnosed-by: Tom Lane Author: Tom Lane and Amit Kapila Backpatch-through: 9.6 Discussion: https://postgr.es/m/11629.1536550032@sss.pgh.pa.us
-rw-r--r--src/backend/utils/adt/datum.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c
index f02a5e77aee..495768275db 100644
--- a/src/backend/utils/adt/datum.c
+++ b/src/backend/utils/adt/datum.c
@@ -338,8 +338,19 @@ datumSerialize(Datum value, bool isnull, bool typByVal, int typLen,
}
else if (eoh)
{
- EOH_flatten_into(eoh, (void *) *start_address, header);
+ char *tmp;
+
+ /*
+ * EOH_flatten_into expects the target address to be maxaligned,
+ * so we can't store directly to *start_address.
+ */
+ tmp = (char *) palloc(header);
+ EOH_flatten_into(eoh, (void *) tmp, header);
+ memcpy(*start_address, tmp, header);
*start_address += header;
+
+ /* be tidy. */
+ pfree(tmp);
}
else
{