aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/datum.c
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2018-10-03 09:14:09 +0530
committerAmit Kapila <akapila@postgresql.org>2018-10-03 09:14:09 +0530
commitca5ca25d08710d7f5aaf0e390aae284bc594a6da (patch)
tree17a51d82cd1350a90dc11597ef6eddfd465fb8b2 /src/backend/utils/adt/datum.c
parenta051c19c3cf4415b36e6333a83a113de4d90a973 (diff)
downloadpostgresql-ca5ca25d08710d7f5aaf0e390aae284bc594a6da.tar.gz
postgresql-ca5ca25d08710d7f5aaf0e390aae284bc594a6da.zip
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
Diffstat (limited to 'src/backend/utils/adt/datum.c')
-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
{