summaryrefslogtreecommitdiff
path: root/src/backend/executor/execExprInterp.c
diff options
context:
space:
mode:
authorAmit Langote2024-09-09 04:46:58 +0000
committerAmit Langote2024-09-09 04:46:58 +0000
commitdd8bea88abf4794d99270ced884a8bc1e387255d (patch)
treed1be3ffc41c4ebfec668ec92789a06270661500f /src/backend/executor/execExprInterp.c
parent87b6c3c0b703c3a71bc640f456a24937744ff30b (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.c14
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;