Функции, написанные на PL / pgSQL
или SQL
, могут быть определены как RETURNS void
. Недавно я наткнулся на странную разницу в результате.
Рассмотрим следующую демонстрацию:
CREATE OR REPLACE FUNCTION f_sql()
RETURNS void AS
'SELECT NULL::void' -- "do nothing", no special meaning
LANGUAGE sql;
CREATE OR REPLACE FUNCTION f_plpgsql()
RETURNS void AS
$$
BEGIN
NULL; -- "do nothing", no special meaning
END;
$$ LANGUAGE plpgsql;
Функция f_sql ()
использует единственно возможный способ SELECT
(как последняя команда) в функции SQL, которая ВОЗВРАЩАЕТ недействительным
. Я использую его только потому, что это самый простой способ для целей этого теста - любая другая функция, например UPDATE
или DELETE
, показывает такое же поведение.
Итак, void
- это фиктивный тип. В то время как функция plpgsql
, похоже, возвращает эквивалент пустой строки как тип void
, фактически '' :: void
. Кажется, что функция sql
возвращает NULL :: void
.
db=# SELECT f_sql() IS NULL;
?column?
----------
t
db=# SELECT f_sql()::text IS NULL;
?column?
----------
t
db=# SELECT f_plpgsql() IS NULL;
?column?
----------
f
db=# SELECT f_plpgsql()::text = '';
?column?
----------
t
Это может иметь незаметные и сбивающие с толку побочные эффекты.
В чем причина такой разницы?