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
This commit is contained in:
parent
96bdb7e19d
commit
9c5f67fd62
@ -2497,6 +2497,36 @@ eval_const_expressions_mutator(Node *node,
|
|||||||
newexpr->location = expr->location;
|
newexpr->location = expr->location;
|
||||||
return (Node *) newexpr;
|
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:
|
case T_ScalarArrayOpExpr:
|
||||||
{
|
{
|
||||||
ScalarArrayOpExpr *saop;
|
ScalarArrayOpExpr *saop;
|
||||||
|
@ -263,6 +263,31 @@ SELECT *
|
|||||||
4 | | 2 | -4
|
4 | | 2 | -4
|
||||||
(2 rows)
|
(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
|
-- Examples of updates involving tables
|
||||||
--
|
--
|
||||||
|
@ -137,6 +137,17 @@ SELECT *
|
|||||||
FROM CASE_TBL a, CASE2_TBL b
|
FROM CASE_TBL a, CASE2_TBL b
|
||||||
WHERE COALESCE(f,b.i) = 2;
|
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
|
-- Examples of updates involving tables
|
||||||
--
|
--
|
||||||
|
Loading…
x
Reference in New Issue
Block a user