суббота, 28 ноября 2009 г.

STRICT-функции в Postgres

STRICT, он же RETURNS NULL ON NULL INPUT, параметр, указываемый при создании функций в Postgres, означает, что функция возвращает NULL, если ей передается хотя бы один NULL. Благодаря этому можно экономить на вызовах функций - сразу использовать NULL вместо вызова функции с нулевыми аргументами.


create or replace function test_strict(str text)
returns text as
$$
begin
if str is NULL then
raise info 'str is NULL';
else
raise info 'str is %', str;
end if;
return str;
end;
$$
-- По умолчанию функция CALLED ON NULL INPUT
language 'plpgsql'

При вызове этой функции со значением str равным NULL увидим сообщение "INFO: str is NULL". Если в последнюю строку функции добавить STRICT, то сообщение выведено не будет - функция не вызывается:
language 'plpgsql' strict

Такое поведение strict-функций сразу наводит на мысль, что в некоторых случаях можно получить не совсем очевидные результаты. Например, если фукнция возвращает тип boolean, то вместо двух ожидаемых true и false, можно получить еще и NULL:

create or replace function is_equal(v text, t text)
returns boolean as
$$
begin
if v = t then
return true;
end if;
return false;
end;
$$
language 'plpgsql' strict;

select is_equal('test', 'test'), -- true
is_equal('test', 'test2'), -- false
is_equal(null, 'test'); -- NULL

Про полезность такой оптимизации пока ничего сказать не могу. Теоретически, в сложных запросах это может влиять на результат работы планировщика, но такие ситуации мне еще не встречались.

Комментариев нет: