diff options
| author | Amit Langote | 2023-10-02 02:52:28 +0000 |
|---|---|---|
| committer | Amit Langote | 2023-10-02 02:52:28 +0000 |
| commit | 7fbc75b26ed8ec70c729c5e7f8233896c54c900f (patch) | |
| tree | c0b389d0970bf286e99e8f558c83dd2394f5f99c /src/include | |
| parent | 2940f1c8373cb3b43b3b42d40786b05d6e901de1 (diff) | |
Add soft error handling to some expression nodes
This adjusts the expression evaluation code for CoerceViaIO and
CoerceToDomain to handle errors softly if needed.
For CoerceViaIo, this means using InputFunctionCallSafe(), which
provides the option to handle errors softly, instead of calling the
type input function directly.
For CoerceToDomain, this simply entails replacing the ereport() in
ExecEvalConstraintCheck() by errsave().
In both cases, the ErrorSaveContext to be used when evaluating the
expression is stored by ExecInitExprRec() in the expression's struct
in the expression's ExprEvalStep. The ErrorSaveContext is passed by
setting ExprState.escontext to point to it when calling
ExecInitExprRec() on the expression whose errors are to be handled
softly.
Note that no call site of ExecInitExprRec() has been changed in this
commit, so there's no functional change. This is intended for
implementing new SQL/JSON expression nodes in future commits that
will use to it suppress errors that may occur during type coercions.
Reviewed-by: Álvaro Herrera
Discussion: https://postgr.es/m/CA+HiwqE4XTdfb1nW=Ojoy_tQSRhYt-q_kb6i5d4xcKyrLC1Nbg@mail.gmail.com
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/executor/execExpr.h | 5 | ||||
| -rw-r--r-- | src/include/jit/llvmjit.h | 2 | ||||
| -rw-r--r-- | src/include/jit/llvmjit_emit.h | 9 | ||||
| -rw-r--r-- | src/include/nodes/execnodes.h | 7 |
4 files changed, 22 insertions, 1 deletions
diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 048573c2bcb..59f3b043c6b 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -16,6 +16,7 @@ #include "executor/nodeAgg.h" #include "nodes/execnodes.h" +#include "nodes/miscnodes.h" /* forward references to avoid circularity */ struct ExprEvalStep; @@ -416,7 +417,8 @@ typedef struct ExprEvalStep FunctionCallInfo fcinfo_data_out; /* lookup and call info for result type's input function */ FmgrInfo *finfo_in; - FunctionCallInfo fcinfo_data_in; + Oid typioparam; + ErrorSaveContext *escontext; } iocoerce; /* for EEOP_SQLVALUEFUNCTION */ @@ -547,6 +549,7 @@ typedef struct ExprEvalStep bool *checknull; /* OID of domain type */ Oid resulttype; + ErrorSaveContext *escontext; } domaincheck; /* for EEOP_CONVERT_ROWTYPE */ diff --git a/src/include/jit/llvmjit.h b/src/include/jit/llvmjit.h index 6d90a16f792..5b7681eba90 100644 --- a/src/include/jit/llvmjit.h +++ b/src/include/jit/llvmjit.h @@ -75,6 +75,7 @@ extern PGDLLIMPORT LLVMTypeRef StructTupleTableSlot; extern PGDLLIMPORT LLVMTypeRef StructHeapTupleTableSlot; extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleTableSlot; extern PGDLLIMPORT LLVMTypeRef StructMemoryContextData; +extern PGDLLIMPORT LLVMTypeRef StructFmgrInfo; extern PGDLLIMPORT LLVMTypeRef StructFunctionCallInfoData; extern PGDLLIMPORT LLVMTypeRef StructExprContext; extern PGDLLIMPORT LLVMTypeRef StructExprEvalStep; @@ -82,6 +83,7 @@ extern PGDLLIMPORT LLVMTypeRef StructExprState; extern PGDLLIMPORT LLVMTypeRef StructAggState; extern PGDLLIMPORT LLVMTypeRef StructAggStatePerTransData; extern PGDLLIMPORT LLVMTypeRef StructAggStatePerGroupData; +extern PGDLLIMPORT LLVMTypeRef StructErrorSaveContext; extern PGDLLIMPORT LLVMValueRef AttributeTemplate; diff --git a/src/include/jit/llvmjit_emit.h b/src/include/jit/llvmjit_emit.h index 5e74543be47..ead46a64ae2 100644 --- a/src/include/jit/llvmjit_emit.h +++ b/src/include/jit/llvmjit_emit.h @@ -86,6 +86,15 @@ l_sizet_const(size_t i) } /* + * Emit constant oid. + */ +static inline LLVMValueRef +l_oid_const(LLVMContextRef lc, Oid i) +{ + return LLVMConstInt(LLVMInt32TypeInContext(lc), i, false); +} + +/* * Emit constant boolean, as used for storage (e.g. global vars, structs). */ static inline LLVMValueRef diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 869465d6f80..b9b08f0f62b 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -34,6 +34,7 @@ #include "fmgr.h" #include "lib/ilist.h" #include "lib/pairingheap.h" +#include "nodes/miscnodes.h" #include "nodes/params.h" #include "nodes/plannodes.h" #include "nodes/tidbitmap.h" @@ -129,6 +130,12 @@ typedef struct ExprState Datum *innermost_domainval; bool *innermost_domainnull; + + /* + * For expression nodes that support soft errors. Should be set to NULL + * before calling ExecInitExprRec() if the caller wants errors thrown. + */ + ErrorSaveContext *escontext; } ExprState; |
