From 18efdde10ebbaab09e8d166e271d4dac01461a68 Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Mon, 30 Mar 2026 17:15:24 +0200
Subject: [PATCH v2] nodeModifyTable: fix generated tables memory leak/perf
 issue

The code assumed that ri_GeneratedExprsU would always contain a list of expressions if the generated colums were checked, but that's not correct.

Reported-by: "Anton A. Melnikov" <a.melnikov@postgrespro.ru>
---
 src/backend/executor/nodeModifyTable.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 4cd5e262e0f..09dd502fb8e 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -531,6 +531,7 @@ ExecInitGenerated(ResultRelInfo *resultRelInfo,
 	{
 		/* Don't call twice */
 		Assert(resultRelInfo->ri_GeneratedExprsU == NULL);
+		Assert(!resultRelInfo->ri_extraUpdatedCols_valid);
 
 		resultRelInfo->ri_GeneratedExprsU = ri_GeneratedExprs;
 		resultRelInfo->ri_NumGeneratedNeededU = ri_NumGeneratedNeeded;
@@ -575,7 +576,7 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
 	 */
 	if (cmdtype == CMD_UPDATE)
 	{
-		if (resultRelInfo->ri_GeneratedExprsU == NULL)
+		if (!resultRelInfo->ri_extraUpdatedCols_valid)
 			ExecInitGenerated(resultRelInfo, estate, cmdtype);
 		if (resultRelInfo->ri_NumGeneratedNeededU == 0)
 			return;
-- 
2.50.1 (Apple Git-155)

