diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-10-08 11:17:40 +0300 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-10-08 11:21:08 +0300 |
commit | 0a906009765bac2042d3cbd7907c0ad833ab14bb (patch) | |
tree | bc49b1148410f22dbd1d4987289f08dfa147deb9 /src/backend/parser/parse_expr.c | |
parent | 976bad043382ec87f35fb8d1143a45e47781d017 (diff) |
Don't let transform_null_equals=on affect CASE foo WHEN NULL ... constructs.
transform_null_equals is only supposed to affect "foo = NULL" expressions
given directly by the user, not the internal "foo = NULL" expression
generated from CASE-WHEN.
This fixes bug #6242, reported by Sergey. Backpatch to all supported
branches.
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r-- | src/backend/parser/parse_expr.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 9f68d262dc4..90ff8d8268b 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -719,12 +719,15 @@ transformAExprOp(ParseState *pstate, A_Expr *a) /* * Special-case "foo = NULL" and "NULL = foo" for compatibility with * standards-broken products (like Microsoft's). Turn these into IS NULL - * exprs. + * exprs. (If either side is a CaseTestExpr, then the expression was + * generated internally from a CASE-WHEN expression, and + * transform_null_equals does not apply.) */ if (Transform_null_equals && list_length(a->name) == 1 && strcmp(strVal(linitial(a->name)), "=") == 0 && - (exprIsNullConstant(lexpr) || exprIsNullConstant(rexpr))) + (exprIsNullConstant(lexpr) || exprIsNullConstant(rexpr)) && + (!IsA(lexpr, CaseTestExpr) && !IsA(rexpr, CaseTestExpr))) { NullTest *n = makeNode(NullTest); |