aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_expr.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2001-09-20 14:20:28 +0000
committerPeter Eisentraut <peter_e@gmx.net>2001-09-20 14:20:28 +0000
commita1ee06625c268a10ce572e72af07ac082626eeb0 (patch)
treed7baf560585c0ccd83ae0e4d374c62bf08e27103 /src/backend/parser/parse_expr.c
parentfd5e95971e7a2bc32fcb7f2b39798c51648a225f (diff)
downloadpostgresql-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.c42
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: