diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 845b1bf96a25aacfd2ed04ac897e9793e9488860..f05e6a2cb938c675cbaa0194d14ac0021d32d768 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.295 2009/01/07 13:44:36 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.296 2009/02/25 18:00:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -4575,24 +4575,29 @@ get_rule_expr(Node *node, deparse_context *context,
 						 * which we have to show "TRUE" or "FALSE".  Also,
 						 * depending on context the original CaseTestExpr
 						 * might have been reduced to a Const (but we won't
-						 * see "WHEN Const").
+						 * see "WHEN Const").  We have also to consider the
+						 * possibility that an implicit coercion was inserted
+						 * between the CaseTestExpr and the operator.
 						 */
 						if (IsA(w, OpExpr))
 						{
+							List	   *args = ((OpExpr *) w)->args;
+							Node	   *lhs;
 							Node	   *rhs;
 
-							Assert(IsA(linitial(((OpExpr *) w)->args),
-									   CaseTestExpr) ||
-								   IsA(linitial(((OpExpr *) w)->args),
-									   Const));
-							rhs = (Node *) lsecond(((OpExpr *) w)->args);
+							Assert(list_length(args) == 2);
+							lhs = strip_implicit_coercions(linitial(args));
+							Assert(IsA(lhs, CaseTestExpr) ||
+								   IsA(lhs, Const));
+							rhs = (Node *) lsecond(args);
 							get_rule_expr(rhs, context, false);
 						}
-						else if (IsA(w, CaseTestExpr))
+						else if (IsA(strip_implicit_coercions(w),
+									 CaseTestExpr))
 							appendStringInfo(buf, "TRUE");
 						else if (not_clause(w))
 						{
-							Assert(IsA(get_notclausearg((Expr *) w),
+							Assert(IsA(strip_implicit_coercions((Node *) get_notclausearg((Expr *) w)),
 									   CaseTestExpr));
 							appendStringInfo(buf, "FALSE");
 						}