если функция возвращает NULL мы имеем тот же самый 1 row как если она заполненный row бы вернула. А как "не вернуть ничего" (по аналогии со вторым SELECT'ом)?
Такого быть не может. Функция обязана вернуть значение, даже типа void. Если написать SELECT f() WHERE false, то функция f() просто не выполниться, а значит и не возвратит значения.