Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Don't let transform_null_equals=on affect CASE foo WHEN NULL ... constructs.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sat, 8 Oct 2011 08:17:40 +0000 (11:17 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sat, 8 Oct 2011 08:21:08 +0000 (11:21 +0300)
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.

src/backend/parser/parse_expr.c

index 9f68d262dc4b0d019150d575278ba74eb8d031e5..90ff8d8268bbfe58e717f885f41a41b848964611 100644 (file)
@@ -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);