aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/util/clauses.c30
-rw-r--r--src/test/regress/expected/case.out25
-rw-r--r--src/test/regress/sql/case.sql11
3 files changed, 66 insertions, 0 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index e89571ed40d..bea1cc4d67e 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -2497,6 +2497,36 @@ eval_const_expressions_mutator(Node *node,
newexpr->location = expr->location;
return (Node *) newexpr;
}
+ case T_NullIfExpr:
+ {
+ NullIfExpr *expr;
+ ListCell *arg;
+ bool has_nonconst_input = false;
+
+ /* Copy the node and const-simplify its arguments */
+ expr = (NullIfExpr *) ece_generic_processing(node);
+
+ /* If either argument is NULL they can't be equal */
+ foreach(arg, expr->args)
+ {
+ if (!IsA(lfirst(arg), Const))
+ has_nonconst_input = true;
+ else if (((Const *) lfirst(arg))->constisnull)
+ return (Node *) linitial(expr->args);
+ }
+
+ /*
+ * Need to get OID of underlying function before checking if
+ * the function is OK to evaluate.
+ */
+ set_opfuncid((OpExpr *) expr);
+
+ if (!has_nonconst_input &&
+ ece_function_is_safe(expr->opfuncid, context))
+ return ece_evaluate_expr(expr);
+
+ return (Node *) expr;
+ }
case T_ScalarArrayOpExpr:
{
ScalarArrayOpExpr *saop;
diff --git a/src/test/regress/expected/case.out b/src/test/regress/expected/case.out
index 7fcfe9a7a60..f5136c17abb 100644
--- a/src/test/regress/expected/case.out
+++ b/src/test/regress/expected/case.out
@@ -263,6 +263,31 @@ SELECT *
4 | | 2 | -4
(2 rows)
+-- Tests for constant subexpression simplification
+explain (costs off)
+SELECT * FROM CASE_TBL WHERE NULLIF(1, 2) = 2;
+ QUERY PLAN
+--------------------------
+ Result
+ One-Time Filter: false
+(2 rows)
+
+explain (costs off)
+SELECT * FROM CASE_TBL WHERE NULLIF(1, 1) IS NOT NULL;
+ QUERY PLAN
+--------------------------
+ Result
+ One-Time Filter: false
+(2 rows)
+
+explain (costs off)
+SELECT * FROM CASE_TBL WHERE NULLIF(1, null) = 2;
+ QUERY PLAN
+--------------------------
+ Result
+ One-Time Filter: false
+(2 rows)
+
--
-- Examples of updates involving tables
--
diff --git a/src/test/regress/sql/case.sql b/src/test/regress/sql/case.sql
index 0655d266f60..83fe43be6b8 100644
--- a/src/test/regress/sql/case.sql
+++ b/src/test/regress/sql/case.sql
@@ -137,6 +137,17 @@ SELECT *
FROM CASE_TBL a, CASE2_TBL b
WHERE COALESCE(f,b.i) = 2;
+-- Tests for constant subexpression simplification
+
+explain (costs off)
+SELECT * FROM CASE_TBL WHERE NULLIF(1, 2) = 2;
+
+explain (costs off)
+SELECT * FROM CASE_TBL WHERE NULLIF(1, 1) IS NOT NULL;
+
+explain (costs off)
+SELECT * FROM CASE_TBL WHERE NULLIF(1, null) = 2;
+
--
-- Examples of updates involving tables
--