From dd8bea88abf4794d99270ced884a8bc1e387255d Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Mon, 9 Sep 2024 13:46:58 +0900 Subject: 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 Author: Jian He Author: Amit Langote Discussion: https://postgr.es/m/CACJufxEo4sUjKCYtda0_qt9tazqqKPmF1cqhW9KBOUeJFqQd2g@mail.gmail.com Backpatch-through: 17 --- src/backend/executor/execExprInterp.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src/backend/executor/execExprInterp.c') 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; -- cgit v1.2.3