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