diff options
author | Amit Langote | 2024-09-09 04:46:58 +0000 |
---|---|---|
committer | Amit Langote | 2024-09-09 04:46:58 +0000 |
commit | dd8bea88abf4794d99270ced884a8bc1e387255d (patch) | |
tree | d1be3ffc41c4ebfec668ec92789a06270661500f /src/backend/executor/execExprInterp.c | |
parent | 87b6c3c0b703c3a71bc640f456a24937744ff30b (diff) |
SQL/JSON: Avoid initializing unnecessary ON ERROR / ON EMPTY steps
When the ON ERROR / ON EMPTY behavior is to return NULL, returning
NULL directly from ExecEvalJsonExprPath() suffices. Therefore, there's
no need to create separate steps to check the error/empty flag or
those to evaluate the the constant NULL expression. This speeds up
common cases because the default ON ERROR / ON EMPTY behavior for
JSON_QUERY() and JSON_VALUE() is to return NULL. However, these steps
are necessary if the RETURNING type is a domain, as constraints on the
domain may need to be checked.
Reported-by: Jian He <[email protected]>
Author: Jian He <[email protected]>
Author: Amit Langote <[email protected]>
Discussion: https://postgr.es/m/CACJufxEo4sUjKCYtda0_qt9tazqqKPmF1cqhW9KBOUeJFqQd2g@mail.gmail.com
Backpatch-through: 17
Diffstat (limited to 'src/backend/executor/execExprInterp.c')
-rw-r--r-- | src/backend/executor/execExprInterp.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index a6c47f61e0d..9fd988cc992 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4550,8 +4550,8 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op, /* Set up to catch coercion errors of the ON EMPTY value. */ jsestate->escontext.error_occurred = false; jsestate->escontext.details_wanted = true; - Assert(jsestate->jump_empty >= 0); - return jsestate->jump_empty; + /* Jump to end if the ON EMPTY behavior is to return NULL */ + return jsestate->jump_empty >= 0 ? jsestate->jump_empty : jsestate->jump_end; } } else if (jsexpr->on_error->btype != JSON_BEHAVIOR_ERROR) @@ -4560,8 +4560,9 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op, /* Set up to catch coercion errors of the ON ERROR value. */ jsestate->escontext.error_occurred = false; jsestate->escontext.details_wanted = true; - Assert(!throw_error && jsestate->jump_error >= 0); - return jsestate->jump_error; + Assert(!throw_error); + /* Jump to end if the ON ERROR behavior is to return NULL */ + return jsestate->jump_error >= 0 ? jsestate->jump_error : jsestate->jump_end; } if (jsexpr->column_name) @@ -4581,14 +4582,15 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op, */ if (error) { - Assert(!throw_error && jsestate->jump_error >= 0); + Assert(!throw_error); *op->resvalue = (Datum) 0; *op->resnull = true; jsestate->error.value = BoolGetDatum(true); /* Set up to catch coercion errors of the ON ERROR value. */ jsestate->escontext.error_occurred = false; jsestate->escontext.details_wanted = true; - return jsestate->jump_error; + /* Jump to end if the ON ERROR behavior is to return NULL */ + return jsestate->jump_error >= 0 ? jsestate->jump_error : jsestate->jump_end; } return jump_eval_coercion >= 0 ? jump_eval_coercion : jsestate->jump_end; |