Philip Semanchuk <philip@xxxxxxxxxxxxxxxxxxxxx> 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