Function Attributes

Volatility, strictness, security, parallelism, cost, rows, support, SET, and WINDOW attributes.

All attributes appear on the signature line in PostgreSQL’s own order — exactly as CREATE FUNCTION writes them.

Volatility

FUNCTION rand_label() RETURNS TEXT LANGUAGE sql VOLATILE AS $$ ... $$;
FUNCTION now_tz()     RETURNS TEXT LANGUAGE sql STABLE   AS $$ ... $$;
FUNCTION pi_val()     RETURNS NUMERIC LANGUAGE sql IMMUTABLE AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."rand_label"() RETURNS text LANGUAGE sql VOLATILE AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."now_tz"()     RETURNS text LANGUAGE sql STABLE   AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."pi_val"()     RETURNS numeric LANGUAGE sql IMMUTABLE AS $$ ... $$;
AttributeMeaning
VOLATILEDefault. May modify DB; result may differ per call
STABLEConstant within a transaction for given inputs
IMMUTABLEConstant forever for given inputs; index-eligible

STRICT

FUNCTION safe_div(a NUMERIC, b NUMERIC) RETURNS NUMERIC
LANGUAGE sql IMMUTABLE STRICT
AS $$ SELECT a / b; $$;
CREATE OR REPLACE FUNCTION "public"."safe_div"(a numeric, b numeric)
RETURNS numeric LANGUAGE sql IMMUTABLE STRICT
AS $$ SELECT a / b; $$;

Returns NULL immediately if any argument is NULL.

SECURITY DEFINER

FUNCTION admin_action(p_id UUID) RETURNS VOID
LANGUAGE plpgsql SECURITY DEFINER SET search_path = public
AS $$ BEGIN ... END; $$;
CREATE OR REPLACE FUNCTION "public"."admin_action"(p_id uuid)
RETURNS void LANGUAGE plpgsql SECURITY DEFINER SET search_path = public
AS $$ BEGIN ... END; $$;

SECURITY DEFINER functions execute with the owner’s privileges. The linter warns if search_path is not set. See Linting.

PARALLEL

FUNCTION count_active() RETURNS BIGINT LANGUAGE sql STABLE PARALLEL SAFE AS $$ ... $$;
FUNCTION with_lock()    RETURNS VOID   LANGUAGE sql PARALLEL RESTRICTED  AS $$ ... $$;
FUNCTION mutate()       RETURNS VOID   LANGUAGE plpgsql PARALLEL UNSAFE  AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."count_active"() RETURNS bigint LANGUAGE sql STABLE PARALLEL SAFE AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."with_lock"()    RETURNS void   LANGUAGE sql PARALLEL RESTRICTED  AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."mutate"()       RETURNS void   LANGUAGE plpgsql PARALLEL UNSAFE  AS $$ ... $$;

COST and ROWS

FUNCTION expensive_calc(p_id BIGINT) RETURNS NUMERIC
LANGUAGE plpgsql STABLE COST 500
AS $$ ... $$;

FUNCTION yield_rows(p_n INT) RETURNS SETOF INTEGER
LANGUAGE sql STABLE ROWS 100
AS $$ SELECT generate_series(1, p_n); $$;
CREATE OR REPLACE FUNCTION "public"."expensive_calc"(p_id bigint)
RETURNS numeric LANGUAGE plpgsql STABLE COST 500 AS $$ ... $$;

CREATE OR REPLACE FUNCTION "public"."yield_rows"(p_n integer)
RETURNS SETOF integer LANGUAGE sql STABLE ROWS 100
AS $$ SELECT generate_series(1, p_n); $$;

SET (GUC per call)

FUNCTION tenant_fn(p_tenant_id UUID) RETURNS VOID
LANGUAGE plpgsql
SET search_path = public
SET app.current_tenant = 'default'
AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."tenant_fn"(p_tenant_id uuid)
RETURNS void LANGUAGE plpgsql
SET search_path = public
SET app.current_tenant = 'default'
AS $$ ... $$;

WINDOW

FUNCTION row_num() RETURNS BIGINT LANGUAGE internal WINDOW IMMUTABLE STRICT
AS $$ ... $$;
CREATE OR REPLACE FUNCTION "public"."row_num"()
RETURNS bigint LANGUAGE internal WINDOW IMMUTABLE STRICT AS $$ ... $$;

SUPPORT

FUNCTION fast_fn(p_x NUMERIC) RETURNS NUMERIC
LANGUAGE c IMMUTABLE STRICT SUPPORT fast_fn_support
AS '$libdir/mylib', 'fast_fn';
CREATE OR REPLACE FUNCTION "public"."fast_fn"(p_x numeric)
RETURNS numeric LANGUAGE c IMMUTABLE STRICT SUPPORT fast_fn_support
AS '$libdir/mylib', 'fast_fn';