Commit 9c5f67fd authored by Peter Eisentraut's avatar Peter Eisentraut

Add support for NullIfExpr in eval_const_expressions

Author: Hou Zhijie <houzj.fnst@cn.fujitsu.com>
Discussion: https://www.postgresql.org/message-id/flat/7ea5ce773bbc4eea9ff1a381acd3b102@G08CNEXMBPEKD05.g08.fujitsu.local
parent 96bdb7e1
......@@ -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;
......
......@@ -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
--
......
......@@ -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
--
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment