diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2023-04-15 12:01:39 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2023-04-15 12:01:39 -0400 |
commit | 9b104a27c72754e9a6a8043ad7e710c8c386a8db (patch) | |
tree | 6ce329829923ea26af99bffeeffaa1cc4dc87598 /src/backend/executor/execExpr.c | |
parent | e9884e9921862d2470bbccf39e3ed140a325afd3 (diff) | |
download | postgresql-9b104a27c72754e9a6a8043ad7e710c8c386a8db.tar.gz postgresql-9b104a27c72754e9a6a8043ad7e710c8c386a8db.zip |
Fix assignment to array of domain over composite, redux.
Commit 3e310d837 taught isAssignmentIndirectionExpr() to look through
CoerceToDomain nodes. That's not sufficient, because since commit
04fe805a1 it's been possible for the planner to simplify
CoerceToDomain to RelabelType when the domain has no constraints
to enforce. So we need to look through RelabelType too.
Per bug #17897 from Alexander Lakhin. Although 3e310d837 was
back-patched to v11, it seems sufficient to apply this change
to v12 and later, since 04fe805a1 came in in v12.
Dmitry Dolgov
Discussion: https://postgr.es/m/17897-4216c546c3874044@postgresql.org
Diffstat (limited to 'src/backend/executor/execExpr.c')
-rw-r--r-- | src/backend/executor/execExpr.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index e2916e35c81..e6053482834 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -3132,8 +3132,8 @@ ExecInitSubscriptingRef(ExprEvalStep *scratch, SubscriptingRef *sbsref, * trees in which each level of assignment has its own CaseTestExpr, and the * recursive structure appears within the newvals or refassgnexpr field. * There is an exception, though: if the array is an array-of-domain, we will - * have a CoerceToDomain as the refassgnexpr, and we need to be able to look - * through that. + * have a CoerceToDomain or RelabelType as the refassgnexpr, and we need to + * be able to look through that. */ static bool isAssignmentIndirectionExpr(Expr *expr) @@ -3160,6 +3160,12 @@ isAssignmentIndirectionExpr(Expr *expr) return isAssignmentIndirectionExpr(cd->arg); } + else if (IsA(expr, RelabelType)) + { + RelabelType *r = (RelabelType *) expr; + + return isAssignmentIndirectionExpr(r->arg); + } return false; } |