diff options
author | Amit Langote <amitlan@postgresql.org> | 2024-06-28 21:58:13 +0900 |
---|---|---|
committer | Amit Langote <amitlan@postgresql.org> | 2024-06-28 21:58:13 +0900 |
commit | 716bd12d22c53d1943d41309f2dd061ec601dd5e (patch) | |
tree | 93a8030f6b2c690795c0d8bdb405206f476ee7b7 /src/backend/nodes/nodeFuncs.c | |
parent | c2d93c3802b205d135d1ae1d7ac167d74e08a274 (diff) | |
download | postgresql-716bd12d22c53d1943d41309f2dd061ec601dd5e.tar.gz postgresql-716bd12d22c53d1943d41309f2dd061ec601dd5e.zip |
SQL/JSON: Always coerce JsonExpr result at runtime
Instead of looking up casts at parse time for converting the result
of JsonPath* query functions to the specified or the default
RETURNING type, always perform the conversion at runtime using either
the target type's input function or the function
json_populate_type().
There are two motivations for this change:
1. json_populate_type() coerces to types with typmod such that any
string values that exceed length limit cause an error instead of
silent truncation, which is necessary to be standard-conforming.
2. It was possible to end up with a cast expression that doesn't
support soft handling of errors causing bugs in the of handling
ON ERROR clause.
JsonExpr.coercion_expr which would store the cast expression is no
longer necessary, so remove.
Bump catversion because stored rules change because of the above
removal.
Reported-by: Alvaro Herrera <alvherre@alvh.no-ip.org>
Reviewed-by: Jian He <jian.universality@gmail.com>
Discussion: Discussion: https://postgr.es/m/202405271326.5a5rprki64aw%40alvherre.pgsql
Diffstat (limited to 'src/backend/nodes/nodeFuncs.c')
-rw-r--r-- | src/backend/nodes/nodeFuncs.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index 89ee4b61f2f..d2e2af4f811 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -1006,10 +1006,7 @@ exprCollation(const Node *expr) { const JsonExpr *jsexpr = (JsonExpr *) expr; - if (jsexpr->coercion_expr) - coll = exprCollation(jsexpr->coercion_expr); - else - coll = jsexpr->collation; + coll = jsexpr->collation; } break; case T_JsonBehavior: @@ -1265,10 +1262,7 @@ exprSetCollation(Node *expr, Oid collation) { JsonExpr *jexpr = (JsonExpr *) expr; - if (jexpr->coercion_expr) - exprSetCollation((Node *) jexpr->coercion_expr, collation); - else - jexpr->collation = collation; + jexpr->collation = collation; } break; case T_JsonBehavior: @@ -2368,8 +2362,6 @@ expression_tree_walker_impl(Node *node, return true; if (WALK(jexpr->path_spec)) return true; - if (WALK(jexpr->coercion_expr)) - return true; if (WALK(jexpr->passing_values)) return true; /* we assume walker doesn't care about passing_names */ @@ -3411,7 +3403,6 @@ expression_tree_mutator_impl(Node *node, FLATCOPY(newnode, jexpr, JsonExpr); MUTATE(newnode->formatted_expr, jexpr->formatted_expr, Node *); MUTATE(newnode->path_spec, jexpr->path_spec, Node *); - MUTATE(newnode->coercion_expr, jexpr->coercion_expr, Node *); MUTATE(newnode->passing_values, jexpr->passing_values, List *); /* assume mutator does not care about passing_names */ MUTATE(newnode->on_empty, jexpr->on_empty, JsonBehavior *); |