On Wed, Jun 5, 2024 at 08:19:04AM +0300, Alexander Pyhalov wrote: > > * Passes unsafe binary data from the foreign server. > > > > Can someone show me where that last item is in the patch, and why can't > > we just pass back values cast to text? > > In finalize_aggregate() when we see partial aggregate with > peragg->aggref->aggtranstype = INTERNALOID > we call aggregate's serialization function and return it as bytea. > > The issue is that this internal representation isn't guaranteed to be > compatible between servers > of different versions (or architectures?). So, likely, we instead should > have called some export function for aggregate > and later - some import function on postgres_fdw side. It doesn't matter > much, what this export function > generates - text, json or some portable binary format, > 1) export/import functions should just "understand" it, > 2) it should be a stable representation.
Okay, so looking at the serialization output functions already defined, I see many zeros, which I assume means just the base data type, and eight more: SELECT DISTINCT aggserialfn from pg_aggregate WHERE aggserialfn::oid != 0; aggserialfn --------------------------- numeric_avg_serialize string_agg_serialize array_agg_array_serialize numeric_serialize int8_avg_serialize array_agg_serialize interval_avg_serialize numeric_poly_serialize I realize we need to return the sum and count for average, so that makes sense. So, we need import/export text representation for the partial aggregate mode for these eight, and call the base data type text import/export functions for the zero ones when in this mode? -- Bruce Momjian <br...@momjian.us> https://momjian.us EDB https://enterprisedb.com Only you can decide what is important to you.