From 78d5952dd0e66afc4447eec07f770991fa406cce Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 16 Apr 2023 14:16:40 -0400 Subject: Ensure result of an aggregate's finalfunc is made read-only. The finalfunc might return a read-write expanded object. If we de-duplicate multiple call sites for the aggregate, any function(s) receiving the aggregate result earlier could alter or destroy the value that reaches the ones called later. This is a brown-paper-bag bug in commit 42b746d4c, because we actually considered the need for read-only-ness but failed to realize that it applied to the case with a finalfunc as well as the case without. Per report from Justin Pryzby. New error in HEAD, no need for back-patch. Discussion: https://postgr.es/m/ZDm5TuKsh3tzoEjz@telsasoft.com --- src/backend/executor/nodeWindowAgg.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/backend/executor/nodeWindowAgg.c') diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 7c07fb06848..3ac581a7113 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -623,10 +623,15 @@ finalize_windowaggregate(WindowAggState *winstate, } else { + Datum res; + winstate->curaggcontext = peraggstate->aggcontext; - *result = FunctionCallInvoke(fcinfo); + res = FunctionCallInvoke(fcinfo); winstate->curaggcontext = NULL; *isnull = fcinfo->isnull; + *result = MakeExpandedObjectReadOnly(res, + fcinfo->isnull, + peraggstate->resulttypeLen); } } else -- cgit v1.2.3