A PostgreSQL function is meant to return zero or more rows, but on some inputs it has nothing to return. Inside a SETOF function body it simply finishes without ever calling RETURN NEXT. What does a caller see from SELECT * FROM f(...)?
CREATE FUNCTION f(p int) RETURNS SETOF int AS $$
BEGIN
IF p > 0 THEN
RETURN NEXT p;
END IF;
-- no RETURN NEXT when p <= 0
END;
$$ LANGUAGE plpgsql;
-- called as: SELECT * FROM f(-5);