OSDN Git Service

Allow binary-coercible cases in ri_HashCompareOp; there are some such cases
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 Nov 2009 04:38:29 +0000 (04:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 Nov 2009 04:38:29 +0000 (04:38 +0000)
that are not handled by find_coercion_pathway, notably composite->RECORD.
Now that 8.4 supports composites as primary keys, it's worth dealing with
this case.

src/backend/utils/adt/ri_triggers.c

index c89553c..d108d07 100644 (file)
@@ -15,7 +15,7 @@
  *
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/utils/adt/ri_triggers.c,v 1.114 2009/08/01 19:59:41 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/ri_triggers.c,v 1.115 2009/11/05 04:38:29 tgl Exp $
  *
  * ----------
  */
@@ -3963,10 +3963,12 @@ ri_HashCompareOp(Oid eq_opr, Oid typeid)
                        {
                                /*
                                 * The declared input type of the eq_opr might be a
-                                * polymorphic type such as ANYARRAY or ANYENUM.  If so,
-                                * assume the coercion is valid; otherwise complain.
+                                * polymorphic type such as ANYARRAY or ANYENUM, or other
+                                * special cases such as RECORD; find_coercion_pathway
+                                * currently doesn't subsume these special cases.
                                 */
-                               if (!IsPolymorphicType(lefttype))
+                               if (!IsPolymorphicType(lefttype) &&
+                                       !IsBinaryCoercible(typeid, lefttype))
                                        elog(ERROR, "no conversion function from %s to %s",
                                                 format_type_be(typeid),
                                                 format_type_be(lefttype));