On Tue, Mar 24, 2026 at 08:44:29AM -0700, Jianghua Yang wrote:
> I found a small bug in commit e2f289e5b9b ("Make many cast functions
> error safe").
Nice find. For future reference, since this was just committed, it
might've been better to report it directly in the thread where the change
was discussed.
> The fix is a one-line change: fcinfo->args → fcinfo->context.
LGTM. To prevent this from happening in the future, I think we ought to
change SOFT_ERROR_OCCURRED to a static inline function. I tried that, and
I got the following warnings:
execExprInterp.c:4964:27: warning: incompatible pointer types passing
'ErrorSaveContext *' (aka 'struct ErrorSaveContext *') to parameter of type
'Node *' (aka 'struct Node *') [-Wincompatible-pointer-types]
4964 | if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
| ^~~~~~~~~~~~~~~~~~~~
../../../src/include/nodes/miscnodes.h:54:27: note: passing argument to
parameter 'escontext' here
54 | SOFT_ERROR_OCCURRED(Node *escontext)
| ^
execExprInterp.c:5200:26: warning: incompatible pointer types passing
'ErrorSaveContext *' (aka 'struct ErrorSaveContext *') to parameter of type
'Node *' (aka 'struct Node *') [-Wincompatible-pointer-types]
5200 | if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
| ^~~~~~~~~~~~~~~~~~~~
../../../src/include/nodes/miscnodes.h:54:27: note: passing argument to
parameter 'escontext' here
54 | SOFT_ERROR_OCCURRED(Node *escontext)
| ^
I think we just need to add casts to "Node *" for those. AFAICT there
isn't an actual bug.
[... looks for past discussions ...]
Ah, I noticed this thread, where the same lines of code were discussed:
https://postgr.es/m/flat/20240724.155525.366150353176322967.ishii%40postgresql.org
--
nathan
>From 7871ce1fb8293ecdbd6917fa70857d5674100d31 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <[email protected]>
Date: Tue, 24 Mar 2026 15:51:58 -0500
Subject: [PATCH v2 1/1] change SOFT_ERROR_OCCURRED to a static inline function
---
src/backend/executor/execExprInterp.c | 4 ++--
src/backend/utils/adt/date.c | 2 +-
src/include/nodes/miscnodes.h | 16 ++++++++++++----
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/src/backend/executor/execExprInterp.c
b/src/backend/executor/execExprInterp.c
index 43116431edf..bdb8037ba66 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -4961,7 +4961,7 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op,
fcinfo->isnull = false;
*op->resvalue = FunctionCallInvoke(fcinfo);
- if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
+ if (SOFT_ERROR_OCCURRED((Node *) &jsestate->escontext))
error = true;
}
@@ -5197,7 +5197,7 @@ ExecEvalJsonCoercionFinish(ExprState *state, ExprEvalStep
*op)
{
JsonExprState *jsestate = op->d.jsonexpr.jsestate;
- if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
+ if (SOFT_ERROR_OCCURRED((Node *) &jsestate->escontext))
{
/*
* jsestate->error or jsestate->empty being set means that the
error
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index 71ea048d251..c3327440380 100644
--- a/src/backend/utils/adt/date.c
+++ b/src/backend/utils/adt/date.c
@@ -1402,7 +1402,7 @@ timestamptz_date(PG_FUNCTION_ARGS)
DateADT result;
result = timestamptz2date_safe(timestamp, fcinfo->context);
- if (SOFT_ERROR_OCCURRED(fcinfo->args))
+ if (SOFT_ERROR_OCCURRED(fcinfo->context))
PG_RETURN_NULL();
PG_RETURN_DATEADT(result);
diff --git a/src/include/nodes/miscnodes.h b/src/include/nodes/miscnodes.h
index ec833001ab0..72dc885069f 100644
--- a/src/include/nodes/miscnodes.h
+++ b/src/include/nodes/miscnodes.h
@@ -49,9 +49,17 @@ typedef struct ErrorSaveContext
ErrorData *error_data; /* details of error, if so */
} ErrorSaveContext;
-/* Often-useful macro for checking if a soft error was reported */
-#define SOFT_ERROR_OCCURRED(escontext) \
- ((escontext) != NULL && IsA(escontext, ErrorSaveContext) && \
- ((ErrorSaveContext *) (escontext))->error_occurred)
+/* Often-useful function for checking if a soft error was reported */
+static inline bool
+SOFT_ERROR_OCCURRED(const Node *escontext)
+{
+ if (escontext == NULL)
+ return false;
+
+ if (!IsA(escontext, ErrorSaveContext))
+ return false;
+
+ return ((const ErrorSaveContext *) escontext)->error_occurred;
+}
#endif /* MISCNODES_H */
--
2.50.1 (Apple Git-155)