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)

Reply via email to