diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 0418972..7101499 100644
*** a/src/backend/parser/parse_coerce.c
--- b/src/backend/parser/parse_coerce.c
*************** find_coercion_pathway(Oid targetTypeId,
*** 1873,1885 ****
  
  	*funcid = InvalidOid;
  
! 	/* Perhaps the types are domains; if so, look at their base types */
! 	if (OidIsValid(sourceTypeId))
! 		sourceTypeId = getBaseType(sourceTypeId);
! 	if (OidIsValid(targetTypeId))
! 		targetTypeId = getBaseType(targetTypeId);
! 
! 	/* Domains are always coercible to and from their base type */
  	if (sourceTypeId == targetTypeId)
  		return COERCION_PATH_RELABELTYPE;
  
--- 1873,1879 ----
  
  	*funcid = InvalidOid;
  
! 	/* If they are the same type will always be coercible */
  	if (sourceTypeId == targetTypeId)
  		return COERCION_PATH_RELABELTYPE;
  
*************** find_coercion_pathway(Oid targetTypeId,
*** 1888,1893 ****
--- 1882,1913 ----
  							ObjectIdGetDatum(sourceTypeId),
  							ObjectIdGetDatum(targetTypeId));
  
+ 	if (!HeapTupleIsValid(tuple))
+ 	{
+ 		Oid sourceBaseTypeId;
+ 		Oid targetBaseTypeId;
+ 
+ 		/* Perhaps the types are domains; if so, look at their base types */
+ 		if (OidIsValid(sourceTypeId))
+ 			sourceBaseTypeId = getBaseType(sourceTypeId);
+ 		if (OidIsValid(targetTypeId))
+ 			targetBaseTypeId = getBaseType(targetTypeId);
+ 
+ 		if ((sourceBaseTypeId != sourceTypeId) || (targetBaseTypeId != targetTypeId))
+ 		{
+ 			sourceTypeId = sourceBaseTypeId;
+ 			targetTypeId = targetBaseTypeId;
+ 
+ 			/* Domains are always coercible to and from their base type */
+ 			if (sourceTypeId == targetTypeId)
+ 				return COERCION_PATH_RELABELTYPE;
+ 
+ 			tuple = SearchSysCache2(CASTSOURCETARGET,
+ 								ObjectIdGetDatum(sourceTypeId),
+ 								ObjectIdGetDatum(targetTypeId));
+ 		}
+ 	}
+ 
  	if (HeapTupleIsValid(tuple))
  	{
  		Form_pg_cast castForm = (Form_pg_cast) GETSTRUCT(tuple);
