When you do "ARRAY[...]::domain", where domain is a domain over an array type,
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 13 Nov 2009 16:09:10 +0000 (16:09 +0000)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 13 Nov 2009 16:09:10 +0000 (16:09 +0000)
we need to check domain constraints. We used to do it correctly, but 8.4
introduced a separate code path for the "ARRAY[]::arraytype" case to infer
the type of an empty ARRAY construct from the cast target, and forgot to take
domains into account.

Per report from Florian G. Pflug.

src/backend/parser/parse_expr.c

index bae5c7fafadf9e7c126ef5b57eff09464f5d0bd2..8e0172d256eb1dc1cea30b6ad74fd708775a3264 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.248 2009/11/09 02:36:56 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.249 2009/11/13 16:09:10 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -169,6 +169,20 @@ transformExpr(ParseState *pstate, Node *expr)
                                                                                                        targetType,
                                                                                                        elementType,
                                                                                                        targetTypmod);
+
+                                               /*
+                                                * If the target array type is a domain, we still need
+                                                * to check the domain constraint. (coerce_to_domain
+                                                * is a no-op if targetType is not a domain)
+                                                */
+                                               result = coerce_to_domain(result,
+                                                                                                 InvalidOid,
+                                                                                                 -1,
+                                                                                                 targetType,
+                                                                                                 COERCE_IMPLICIT_CAST,
+                                                                                                 tc->location,
+                                                                                                 false,
+                                                                                                 true);
                                                break;
                                        }