Функции PostgreSQL, возвращающие void

Функции, написанные на 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

Это может иметь незаметные и сбивающие с толку побочные эффекты.
В чем причина такой разницы?

17
задан Erwin Brandstetter 17 May 2014 в 21:14
поделиться