0002-in-JsonExprState-just-store-a-pointer-to-the-input-F.patch

text/x-patch

Filename: 0002-in-JsonExprState-just-store-a-pointer-to-the-input-F.patch
Type: text/x-patch
Part: 0
Message: Re: PG 15 (and to a smaller degree 14) regression due to ExprEvalStep size

Patch

Format: format-patch
Series: patch 0002
Subject: in JsonExprState just store a pointer to the input FmgrInfo
File+
src/backend/executor/execExpr.c 4 1
src/backend/executor/execExprInterp.c 1 1
src/include/executor/execExpr.h 1 1
From ed2118c63e298e5e5872db5003fa342c33aa7505 Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
Date: Wed, 22 Jun 2022 12:00:47 -0400
Subject: [PATCH 2/2] in JsonExprState just store a pointer to the input
 FmgrInfo

---
 src/backend/executor/execExpr.c       | 5 ++++-
 src/backend/executor/execExprInterp.c | 2 +-
 src/include/executor/execExpr.h       | 2 +-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index 1f65daf203..d8608a3c58 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -2623,11 +2623,14 @@ ExecInitExprRec(Expr *node, ExprState *state,
 					(jexpr->result_coercion && jexpr->result_coercion->via_io))
 				{
 					Oid			typinput;
+					FmgrInfo   *finfo;
 
 					/* lookup the result type's input function */
 					getTypeInputInfo(jexpr->returning->typid, &typinput,
 									 &jsestate->input.typioparam);
-					fmgr_info(typinput, &jsestate->input.func);
+					finfo = palloc0(sizeof(FmgrInfo));
+					fmgr_info(typinput, finfo);
+					jsestate->input.finfo = finfo;
 				}
 
 				jsestate->args = NIL;
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 80c5e04dd5..cbdcbbce53 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -4648,7 +4648,7 @@ ExecEvalJsonExprCoercion(ExprEvalStep *op, ExprContext *econtext,
 			/* strip quotes and call typinput function */
 			char	   *str = *isNull ? NULL : JsonbUnquote(jb);
 
-			return InputFunctionCall(&jsestate->input.func, str,
+			return InputFunctionCall(jsestate->input.finfo, str,
 									 jsestate->input.typioparam,
 									 jexpr->returning->typmod);
 		}
diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h
index 15532813ae..c0ba8998f2 100644
--- a/src/include/executor/execExpr.h
+++ b/src/include/executor/execExpr.h
@@ -759,7 +759,7 @@ typedef struct JsonExprState
 
 	struct
 	{
-		FmgrInfo	func;	/* typinput function for output type */
+		FmgrInfo	*finfo;	/* typinput function for output type */
 		Oid			typioparam;
 	}			input;	/* I/O info for output type */
 
-- 
2.34.1