On Fri, Jun 28, 2024 at 3:14 PM jian he <jian.universal...@gmail.com> wrote: > On Thu, Jun 27, 2024 at 7:48 PM Amit Langote <amitlangot...@gmail.com> wrote: > > > > > > I've attempted that in the attached 0001, which removes > > > JsonExpr.coercion_expr and a bunch of code around it. > > > > > > 0002 is now the original patch minus the changes to make > > > JSON_EXISTS(), JSON_QUERY(), and JSON_VALUE() behave as we would like, > > > because the changes in 0001 covers them. The changes for JsonBehavior > > > expression coercion as they were in the last version of the patch are > > > still needed, but I decided to move those into 0001 so that the > > > changes for query functions are all in 0001 and those for constructors > > > in 0002. It would be nice to get rid of that coerce_to_target_type() > > > call to coerce the "behavior expression" to RETURNING type, but I'm > > > leaving that as a task for another day. > > > > Updated 0001 to remove outdated references, remove some more unnecessary > > code. > > > > i found some remaining references of "coercion_expr" should be removed. > > src/include/nodes/primnodes.h > /* JsonExpr's collation, if coercion_expr is NULL. */ > > > src/include/nodes/execnodes.h > /* > * Address of the step to coerce the result value of jsonpath evaluation > * to the RETURNING type using JsonExpr.coercion_expr. -1 if no coercion > * is necessary or if either JsonExpr.use_io_coercion or > * JsonExpr.use_json_coercion is true. > */ > int jump_eval_coercion; > > src/backend/jit/llvm/llvmjit_expr.c > /* coercion_expr code */ > LLVMPositionBuilderAtEnd(b, b_coercion); > if (jsestate->jump_eval_coercion >= 0) > LLVMBuildBr(b, opblocks[jsestate->jump_eval_coercion]); > else > LLVMBuildUnreachable(b); > > > src/backend/executor/execExprInterp.c > /* > * Checks if an error occurred either when evaluating JsonExpr.coercion_expr > or > * in ExecEvalJsonCoercion(). If so, this sets JsonExprState.error to trigger > * the ON ERROR handling steps. > */ > void > ExecEvalJsonCoercionFinish(ExprState *state, ExprEvalStep *op) > { > } > > if (jbv == NULL) > { > /* Will be coerced with coercion_expr, if any. */ > *op->resvalue = (Datum) 0; > *op->resnull = true; > } > > > src/backend/executor/execExpr.c > /* > * Jump to coerce the NULL using coercion_expr if present. Coercing NULL > * is only interesting when the RETURNING type is a domain whose > * constraints must be checked. jsexpr->coercion_expr containing a > * CoerceToDomain node must have been set in that case. > */ > > /* > * Jump to coerce the NULL using coercion_expr if present. Coercing NULL > * is only interesting when the RETURNING type is a domain whose > * constraints must be checked. jsexpr->coercion_expr containing a > * CoerceToDomain node must have been set in that case. > */
Thanks for checking. Will push the attached 0001 and 0002 shortly. -- Thanks, Amit Langote
v5-0001-SQL-JSON-Fix-coercion-of-constructor-outputs-to-t.patch
Description: Binary data
v5-0002-SQL-JSON-Always-coerce-JsonExpr-result-at-runtime.patch
Description: Binary data