diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2001-09-20 14:20:28 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2001-09-20 14:20:28 +0000 |
commit | a1ee06625c268a10ce572e72af07ac082626eeb0 (patch) | |
tree | d7baf560585c0ccd83ae0e4d374c62bf08e27103 /src/backend/parser/parse_expr.c | |
parent | fd5e95971e7a2bc32fcb7f2b39798c51648a225f (diff) | |
download | postgresql-a1ee06625c268a10ce572e72af07ac082626eeb0.tar.gz postgresql-a1ee06625c268a10ce572e72af07ac082626eeb0.zip |
Provide tunable knob for x = NULL -> x IS NULL transformation, default to off.
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r-- | src/backend/parser/parse_expr.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 7639fd2db5c..badbe60f75a 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.99 2001/08/09 18:28:17 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.100 2001/09/20 14:20:27 petere Exp $ * *------------------------------------------------------------------------- */ @@ -34,9 +34,10 @@ int max_expr_depth = DEFAULT_MAX_EXPR_DEPTH; - static int expr_depth_counter = 0; +bool Transform_null_equals = false; + static Node *parser_typecast_constant(Value *expr, TypeName *typename); static Node *parser_typecast_expression(ParseState *pstate, Node *expr, TypeName *typename); @@ -157,14 +158,35 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) { case OP: { - Node *lexpr = transformExpr(pstate, - a->lexpr, - precedence); - Node *rexpr = transformExpr(pstate, - a->rexpr, - precedence); - - result = (Node *) make_op(a->opname, lexpr, rexpr); + /* + * Special-case "foo = NULL" and "NULL = foo" for + * compatibility with standards-broken products + * (like Microsoft's). Turn these into IS NULL exprs. + */ + if (Transform_null_equals && strcmp(a->opname, "=")==0 + && (exprIsNullConstant(a->lexpr) || exprIsNullConstant(a->rexpr))) + { + NullTest *n = makeNode(NullTest); + n->nulltesttype = IS_NULL; + + if (exprIsNullConstant(a->lexpr)) + n->arg = a->rexpr; + else + n->arg = a->lexpr; + + result = transformExpr(pstate, n, precedence); + } + else + { + Node *lexpr = transformExpr(pstate, + a->lexpr, + precedence); + Node *rexpr = transformExpr(pstate, + a->rexpr, + precedence); + + result = (Node *) make_op(a->opname, lexpr, rexpr); + } } break; case AND: |