diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c index f02a5e77ae..6970e6b90a 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 *res; + + /* + * EOH_flatten_into expects the target address to be maxaligned so + * can't directly pass start_address. + */ + res = (char *) palloc(header); + EOH_flatten_into(eoh, (void *) res, header); + memcpy(*start_address, res, header); *start_address += header; + + /* be tidy. */ + pfree(res); } else {