mirror of
https://github.com/postgres/postgres.git
synced 2025-10-16 17:07:43 +03:00
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
This commit is contained in:
@@ -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 *);
|
||||
|
Reference in New Issue
Block a user