Index: src/backend/parser/parse_expr.c =================================================================== RCS file: /opt/src/cvs/pgsql-server/src/backend/parser/parse_expr.c,v retrieving revision 1.160 diff -c -r1.160 parse_expr.c *** src/backend/parser/parse_expr.c 4 Aug 2003 02:40:01 -0000 1.160 --- src/backend/parser/parse_expr.c 8 Aug 2003 21:53:25 -0000 *************** *** 45,51 **** static Node *transformColumnRef(ParseState *pstate, ColumnRef *cref); static Node *transformIndirection(ParseState *pstate, Node *basenode, List *indirection); ! /* * Initialize for parsing a new query. --- 44,50 ---- static Node *transformColumnRef(ParseState *pstate, ColumnRef *cref); static Node *transformIndirection(ParseState *pstate, Node *basenode, List *indirection); ! static bool exprIsNullConstantTypeCast(Node *arg); /* * Initialize for parsing a new query. *************** *** 394,421 **** Node *lexpr = transformExpr(pstate, a->lexpr); - ltype = exprType(lexpr); - foreach(telem, (List *) a->rexpr) - { - rtype = LookupTypeName(lfirst(telem)); - matched = (rtype == ltype); - if (matched) - break; - } - - /* - * Expect two forms: equals or not equals. - * Flip the sense of the result for not - * equals. - */ - if (strcmp(strVal(lfirst(a->name)), "!=") == 0) - matched = (!matched); - n = makeNode(A_Const); n->val.type = T_String; - n->val.val.str = (matched ? "t" : "f"); n->typename = SystemTypeName("bool"); result = transformExpr(pstate, (Node *) n); } break; --- 393,426 ---- Node *lexpr = transformExpr(pstate, a->lexpr); n = makeNode(A_Const); n->val.type = T_String; n->typename = SystemTypeName("bool"); + if (exprIsNullConstantTypeCast(a->lexpr)) + n->val.val.str = "f"; + else + { + ltype = exprType(lexpr); + foreach(telem, (List *) a->rexpr) + { + rtype = LookupTypeName(lfirst(telem)); + matched = (rtype == ltype); + if (matched) + break; + } + + /* + * Expect two forms: equals or not equals. + * Flip the sense of the result for not + * equals. + */ + if (strcmp(strVal(lfirst(a->name)), "!=") == 0) + matched = (!matched); + + n->val.val.str = (matched ? "t" : "f"); + } + result = transformExpr(pstate, (Node *) n); } break; *************** *** 1567,1570 **** --- 1572,1588 ---- format_type_be(targetType)))); return expr; + } + + + /* exprIsNullConstantTypeCast() + * Recursively test whether an a_expr is a typecast NULL constant or not. + */ + static bool + exprIsNullConstantTypeCast(Node *arg) + { + if (arg && IsA(arg, TypeCast)) + return exprIsNullConstantTypeCast(((TypeCast *) arg)->arg); + + return exprIsNullConstant(arg); }