/* Reject if there are any volatile functions in PHVs */ if (contain_volatile_functions(expr)) { list_free(*operators); list_free(*param_exprs); return false; }
The expressions in RelOptInfo.lateral_vars are not necessarily from PHVs. For instance
explain (costs off) select * from t t1 join lateral (select * from t t2 where t1.a = t2.a offset 0) on true; QUERY PLAN ---------------------------------- Nested Loop -> Seq Scan on t t1 -> Memoize Cache Key: t1.a Cache Mode: binary -> Seq Scan on t t2 Filter: (t1.a = a) (7 rows)
The lateral Var 't1.a' comes from the lateral subquery, not PHV.
This seems a typo from 63e4f13d. How about we change it to the below?
- /* Reject if there are any volatile functions in PHVs */ + /* Reject if there are any volatile functions in lateral vars */