postgres.git / summary / log / commit / refs

commit    c53ed26ea46e425c1a78bd0e72b74a541eb08a93
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sat Apr 15 16:01:39 2023 +0000
First released in: 16.0, 12.15, 13.11, 14.8, 15.3

    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


src/backend/executor/execExpr.c | 10 ++++++++-- src/test/regress/expected/domain.out | 9 +++++++++ src/test/regress/sql/domain.sql | 4 ++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index d89445ee7ba..26d7972f837 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -3131,8 +3131,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) @@ -3159,6 +3159,12 @@ isAssignmentIndirectionExpr(Expr *expr) return isAssignmentIndirectionExpr(cd->arg); } + else if (IsA(expr, RelabelType)) + { + RelabelType *r = (RelabelType *) expr; + + return isAssignmentIndirectionExpr(r->arg); + } return false; } diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 73b010f6ed2..46a26353301 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -556,6 +556,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 diff --git a/src/test/regress/sql/domain.sql b/src/test/regress/sql/domain.sql index f2ca1fb675a..b735d9bfe19 100644 --- a/src/test/regress/sql/domain.sql +++ b/src/test/regress/sql/domain.sql @@ -288,6 +288,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; [parent: de575c78e14c]