Есть ли способ сделать Postgres строже при создании функций? - PullRequest
2 голосов
/ 19 июня 2020

Мы начали использовать Postgres гораздо позже, перейдя с SQL Сервера. Я заметил, что парсер / компилятор Postgres позволяет создавать функции, которые (как мне кажется) могут быть отклонены во время создания.

Один из примеров того, о чем я говорю, - это операторы select в блоках plpg. sql:

create or replace function test() returns void as $$
begin
    select * from pg_database;
end; 
$$ language plpgsql;

Эта функция не работает во время выполнения с запросом ", не имеющим место назначения для данных результатов ". Почему эта ошибка не будет обнаружена во время создания функции? Разрешено ли использование select без return в блоке plpg sql?

Другой тип ошибок, которые не всегда обнаруживаются во время компиляции, - это ошибки несоответствия типов между объявленным типом возврата и фактическим тип значения. Они обнаруживаются в простых случаях, но начинают переходить во время выполнения в более сложных функциях. Я подозреваю, что есть некоторые ограничения в выводе / анализе типов Postgres, есть ли дополнительная информация об этом?

tldr: Есть ли способ заставить Postgres анализатор / компилятор больше не работать при создании функции?

1 Ответ

2 голосов
/ 19 июня 2020

Есть ли способ заставить Postgres парсер / компилятор больше не работать при создании функции?

Это цель plpgsql_check расширение. Однако это не помешает созданию функции.

test=# create extension plpgsql_check;
CREATE EXTENSION

test=# create or replace function test() returns void as $$
begin
    select * from pg_database;
end; 
$$ language plpgsql;

test=# select * from plpgsql_check_function('test');
                        plpgsql_check_function                        
----------------------------------------------------------------------
 error:42601:3:SQL statement:query has no destination for result data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...