aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/optimizer/util/clauses.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 60e31279ecc..f0ef1029d10 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -1579,7 +1579,6 @@ contain_leaked_vars_walker(Node *node, void *context)
case T_CaseExpr:
case T_CaseTestExpr:
case T_RowExpr:
- case T_MinMaxExpr:
case T_SQLValueFunction:
case T_NullTest:
case T_BooleanTest:
@@ -1636,6 +1635,36 @@ contain_leaked_vars_walker(Node *node, void *context)
}
break;
+ case T_MinMaxExpr:
+ {
+ /*
+ * MinMaxExpr is leakproof if the comparison function it calls
+ * is leakproof.
+ */
+ MinMaxExpr *minmaxexpr = (MinMaxExpr *) node;
+ TypeCacheEntry *typentry;
+ bool leakproof;
+
+ /* Look up the btree comparison function for the datatype */
+ typentry = lookup_type_cache(minmaxexpr->minmaxtype,
+ TYPECACHE_CMP_PROC);
+ if (OidIsValid(typentry->cmp_proc))
+ leakproof = get_func_leakproof(typentry->cmp_proc);
+ else
+ {
+ /*
+ * The executor will throw an error, but here we just
+ * treat the missing function as leaky.
+ */
+ leakproof = false;
+ }
+
+ if (!leakproof &&
+ contain_var_clause((Node *) minmaxexpr->args))
+ return true;
+ }
+ break;
+
case T_CurrentOfExpr:
/*