Skip to content

Commit

Permalink
Fix assignment to array of domain over composite, redux.
Browse files Browse the repository at this point in the history
Commit 3e310d8 taught isAssignmentIndirectionExpr() to look through
CoerceToDomain nodes.  That's not sufficient, because since commit
04fe805 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 3e310d8 was
back-patched to v11, it seems sufficient to apply this change
to v12 and later, since 04fe805 came in in v12.

Dmitry Dolgov

Discussion: https://postgr.es/m/17897-4216c546c3874044@postgresql.org
  • Loading branch information
tglsfdc committed Apr 15, 2023
1 parent d6b5dee commit 064eb89
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/backend/executor/execExpr.c
Expand Up @@ -3225,8 +3225,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)
Expand All @@ -3253,6 +3253,12 @@ isAssignmentIndirectionExpr(Expr *expr)

return isAssignmentIndirectionExpr(cd->arg);
}
else if (IsA(expr, RelabelType))
{
RelabelType *r = (RelabelType *) expr;

return isAssignmentIndirectionExpr(r->arg);
}
return false;
}

Expand Down
9 changes: 9 additions & 0 deletions src/test/regress/expected/domain.out
Expand Up @@ -606,6 +606,15 @@ table dcomptable;
{"(1,5)"}
(1 row)

-- if there's no constraints, a different code path is taken:
alter domain dcomptype drop constraint dcomptype_check;
update dcomptable set f1[1].cf1 = -1; -- now ok
table dcomptable;
f1
------------
{"(-1,5)"}
(1 row)

drop table dcomptable;
drop type comptype cascade;
NOTICE: drop cascades to type dcomptype
Expand Down
4 changes: 4 additions & 0 deletions src/test/regress/sql/domain.sql
Expand Up @@ -307,6 +307,10 @@ table dcomptable;
update dcomptable set f1[1].cf1 = -1; -- fail
update dcomptable set f1[1].cf1 = 1;
table dcomptable;
-- if there's no constraints, a different code path is taken:
alter domain dcomptype drop constraint dcomptype_check;
update dcomptable set f1[1].cf1 = -1; -- now ok
table dcomptable;

drop table dcomptable;
drop type comptype cascade;
Expand Down

0 comments on commit 064eb89

Please sign in to comment.