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:04 +0300 | 
| commit | c02e52dfdc18605f263aa67d3b2563551222f719 (patch) | |
| tree | 53ca9c7831978b63b0ae99ac412479ce88e8bec9 /src | |
| parent | b77b6015d84a30caa31977af3667a7e42f6e82a1 (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')
| -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 a0cfad00c2b..5e6daaede5d 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -830,12 +830,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); | 
