]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix assignment to array of domain over composite, redux.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 15 Apr 2023 16:01:39 +0000 (12:01 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 15 Apr 2023 16:01:39 +0000 (12:01 -0400)
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
src/test/regress/expected/domain.out
src/test/regress/sql/domain.sql

index ac9a3004fe022b485b1b4b85352fe77f861e0c11..e2d1d101ba1b4040a0b8551949e7aecbcede8578 100644 (file)
@@ -2839,8 +2839,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)
@@ -2867,6 +2867,12 @@ isAssignmentIndirectionExpr(Expr *expr)
 
                return isAssignmentIndirectionExpr(cd->arg);
        }
+       else if (IsA(expr, RelabelType))
+       {
+               RelabelType *r = (RelabelType *) expr;
+
+               return isAssignmentIndirectionExpr(r->arg);
+       }
        return false;
 }
 
index d0ead069a42ad0efb88095d12eb8111d20221b7d..ced3fbf7bfbca2e7dcd289dd68e5481625c45990 100644 (file)
@@ -562,6 +562,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
index ad3edcf4067bdd32fc4d46c7743a5db30f80a0ea..9e9f72ab52762f81ca5df46e9758241c5fbf5865 100644 (file)
@@ -289,6 +289,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;