diff options
Diffstat (limited to 'src/backend/optimizer/util/clauses.c')
-rw-r--r-- | src/backend/optimizer/util/clauses.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index d80dfbe5c9f..c615717dea3 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -464,11 +464,15 @@ aggregates_allow_partial_walker(Node *node, partial_agg_context *context) } /* - * If we find any aggs with an internal transtype then we must ensure - * that pointers to aggregate states are not passed to other processes; - * therefore, we set the maximum allowed type to PAT_INTERNAL_ONLY. + * If we find any aggs with an internal transtype then we must check + * that these have a serialization type, serialization func and + * deserialization func; otherwise, we set the maximum allowed type to + * PAT_INTERNAL_ONLY. */ - if (aggform->aggtranstype == INTERNALOID) + if (aggform->aggtranstype == INTERNALOID && + (!OidIsValid(aggform->aggserialtype) || + !OidIsValid(aggform->aggserialfn) || + !OidIsValid(aggform->aggdeserialfn))) context->allowedtype = PAT_INTERNAL_ONLY; ReleaseSysCache(aggTuple); |