From 6bf77a630dc619a896b3d0f1623e8b4fa15c370d Mon Sep 17 00:00:00 2001 From: Alexandra Wang Date: Mon, 3 Aug 2026 15:59:52 -0700 Subject: [PATCH v9 1/4] Fix memory leak in make_build_data() --- src/backend/statistics/extended_stats.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index 332e7423bd8..e6e483ceea0 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -2637,13 +2637,12 @@ make_build_data(Relation rel, StatExtEntry *stat, int numrows, HeapTuple *rows, ExprState *exprstate = (ExprState *) lfirst(lc); /* - * XXX This probably leaks memory. Maybe we should use - * ExecEvalExprSwitchContext but then we need to copy the result - * somewhere else. + * Avoid accumulating per-row evaluation memory in the + * long-lived build context. */ - datum = ExecEvalExpr(exprstate, - GetPerTupleExprContext(estate), - &isnull); + datum = ExecEvalExprSwitchContext(exprstate, + GetPerTupleExprContext(estate), + &isnull); if (isnull) { result->values[idx][i] = (Datum) 0; @@ -2651,7 +2650,10 @@ make_build_data(Relation rel, StatExtEntry *stat, int numrows, HeapTuple *rows, } else { - result->values[idx][i] = datum; + result->values[idx][i] = + datumCopy(datum, + result->stats[idx]->attrtype->typbyval, + result->stats[idx]->attrtype->typlen); result->nulls[idx][i] = false; } -- 2.50.1 (Apple Git-155)