When you do "ARRAY[...]::domain", where domain is a domain over an array type,

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.
REL8_4_STABLE
Heikki Linnakangas 16 years ago
parent 66ad0b3a05
commit 959af88533
  1. 16
      src/backend/parser/parse_expr.c

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.241.2.2 2009/10/27 17:11:30 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.241.2.3 2009/11/13 16:09:20 heikki Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -169,6 +169,20 @@ transformExpr(ParseState *pstate, Node *expr)
targetType, targetType,
elementType, elementType,
targetTypmod); 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; break;
} }

Loading…
Cancel
Save