Philip Semanchuk <philip@americanefficient.com> writes:
> I have a function that isn't being inlined, and I would appreciate help to understand why that's the case.
The example you show *is* inline-able, as you can easily prove with EXPLAIN.
regression=# CREATE OR REPLACE FUNCTION f(foo text)
RETURNS text
AS $$
SELECT substring(foo FROM 1 FOR 2)
$$ LANGUAGE sql IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION
regression=# explain verbose select f(f1) from text_tbl;
QUERY PLAN
----------------------------------------------------------------
Seq Scan on public.text_tbl (cost=0.00..1.02 rows=2 width=32)
Output: "substring"(f1, 1, 2)
(2 rows)
No f() anywhere there.
I think the test methodology you used is faulty, because it does not
distinguish between "inline-able" and "foldable to a constant".
Given an immutable function applied to constant(s), the planner prefers
to fold to a constant by just executing the function. The inline-ing
transformation is considered only when that case doesn't apply.
regards, tom lane