Not in all cases
postgres=# create function non_im_immutable_function() returns float as $$
begin
return random();
end;
$$ language plpgsql immutable;
CREATE FUNCTION
postgres=# select proname, provolatile from pg_proc where proname = 'random' or proname = 'non_im_immutable_function';
proname | provolatile
---------------------------+-------------
random | v
non_im_immutable_function | i
postgres=# select non_im_immutable_function();
non_im_immutable_function
---------------------------
0.963812265079468
(1 row)
postgres=# select non_im_immutable_function();
non_im_immutable_function
---------------------------
0.362834882922471
(1 row)
Per definition of immutable functions, the function's output shouldn't depend upon a volatile function e.g. random().