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"); }