Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разъясните: Компилятор функций в Постгре / 9 сообщений из 9, страница 1 из 1
24.05.2017, 06:41
    #39458517
Разъясните: Компилятор функций в Постгре
Всем привет!
PG Version: PostgreSQL 9.4.8 on i686-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 32-bit

Ситуация следующая:
При разработке функций столкнулся с интересным поведением компилятора, а именно, он "не видит" необъявленные переменные и отсутствующие таблицы в базе. Такие ошибки выявляется только при запуске функции.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE OR REPLACE FUNCTION akdlo.foo ()
RETURNS bigint AS
$body$
DECLARE
  variable1 bigint;
  
BEGIN

-- Все нормально  
variable1 = 2;

-- (Компилируется, но при выполнении ошибка) Неизвестная переменная справа от знака равно  
variable1 = variable2;

-- (Не компилируется, сразу ошибка) Неизвестная переменная слева от знака равно 
--variable2 = 5;

return variable1;  

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;



Объясните мне, это действительно такая особенность компилятора в постргресе или это можно подкрутить в настройках?

Хочется немного более строгого компилятора, что бы такие банальные ошибки как использование неизвестной переменной или отсутствующей таблицы приводило к ошибкам при компиляции процедуры а не в момент когда ее запускают.


Вот нашел в доке https://postgrespro.ru/docs/postgresql/9.4/plpgsql-development-tips.html в самом низу, раздел 40.11.2.
Но не могу понять, это относится к моей проблеме или нет.
...
Рейтинг: 0 / 0
24.05.2017, 07:12
    #39458520
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разъясните: Компилятор функций в Постгре
ПаWWWлОдАрЕц,

Потому что plpgsql - это не встроенный язык для хранимых процедур, а расширение.
Т.е. он на равных правах, что например C\C++, python, java и прочие внешние ЯП.
Сделан для "совместимости" с PLSQL.
А так нативные ЯП для ХП в PostgreSQL это SQL. :-)
...
Рейтинг: 0 / 0
24.05.2017, 07:39
    #39458524
Разъясните: Компилятор функций в Постгре
mad_nazgul,

Спасибо за ответ.
Я тоже так подумал что это плата за универсальность использования нескольких языков для функций, но я предположил что ноги растут от того, что встроенный plpgsql похож на интерпретируемые языки (like php), и в связи с этим он так "снисходительно" относится к необъявленным переменным.

Хотя, это не дает ему основания игнорировать переменные, ИМХО.

Порой обычного SQL не хватает для обработки данных и приходится писать большие простыни кода на plpgsql, и вот как раз эта особенность, очень усложняет отладку кода.

А как вы "боретесь" с такой проблемой? Если конечно она вас тоже не обходит стороной )
...
Рейтинг: 0 / 0
24.05.2017, 09:40
    #39458588
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разъясните: Компилятор функций в Постгре
ПаWWWлОдАрЕц,

Есть вот такая штука: plpgsql_check
...
Рейтинг: 0 / 0
24.05.2017, 10:27
    #39458630
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разъясните: Компилятор функций в Постгре
ПаWWWлОдАрЕцmad_nazgul,

Спасибо за ответ.
Я тоже так подумал что это плата за универсальность использования нескольких языков для функций, но я предположил что ноги растут от того, что встроенный plpgsql похож на интерпретируемые языки (like php), и в связи с этим он так "снисходительно" относится к необъявленным переменным.

Хотя, это не дает ему основания игнорировать переменные, ИМХО.


Он и не игнорирует.
Просто вызов интерпретатора происходит не во время создания ХП, а во время выполнения.
А так ну какой-то текст, который должен обработать какой-то внешний обработчик.
Понятно это не удобно.
Но у команды PostgreSQL в приоритете немного другие задачи.

ПаWWWлОдАрЕцПорой обычного SQL не хватает для обработки данных и приходится писать большие простыни кода на plpgsql, и вот как раз эта особенность, очень усложняет отладку кода.


Честно с трудом представляю, что не может оператор with, чтобы использовать plpgsql.

ПаWWWлОдАрЕцА как вы "боретесь" с такой проблемой? Если конечно она вас тоже не обходит стороной )

Никак.
Если что-то нельзя сделать запросом, пишу логику в другом ЯП (java).
Т.е. если есть возможность не пользоваться plpgsql, то лучше им не пользоваться. :-)
...
Рейтинг: 0 / 0
24.05.2017, 11:11
    #39458688
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разъясните: Компилятор функций в Постгре
как уже сказано, вы путаете поверхностный чек с компиляцией.

про plpgsql:
левая сторона оператора := всегда переменная -- её почекать просто
правая сторона -- всегда SELECT
Код: plaintext
1.
2.
v:=2; 
это
v:= (SELECT 2);

и разбирать правую сторону при чеке немного сложнее. к тому же всё равно нет никакой инвалидизации хранимок при смене состава или структуры таблиц (если только типы возвратов и переменных не меняются). т.ч. тут поле и не паханное, и не шибко интересное. тестируйте все свои хранимки
...
Рейтинг: 0 / 0
24.05.2017, 11:48
    #39458732
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разъясните: Компилятор функций в Постгре
mad_nazgulпишу логику в другом ЯП (java).Несомненно, от замены одинарных кавычек на двойные код проблема проверки при компиляции тут же испаряется.
...
Рейтинг: 0 / 0
24.05.2017, 11:51
    #39458733
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разъясните: Компилятор функций в Постгре
ПаWWWлОдАрЕц,

Для начала pl/pgsql - чистый интерпретатор (компиляции там даже в проекте пока нет).
Даже просто парсинг происходит при первом вызове хранимки в контексте коннекта (т.е. 2 разных коннекта имеют две разных версии хранимки в памяти, более того они могут разные вещи делать например в зависимости от search_path).

Бороться - pgsql_check который кое что проверяет + check_function_bodies = on как то так. И тестирование.
...
Рейтинг: 0 / 0
24.05.2017, 15:04
    #39458929
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разъясните: Компилятор функций в Постгре
p2.mad_nazgulпишу логику в другом ЯП (java).Несомненно, от замены одинарных кавычек на двойные код проблема проверки при компиляции тут же испаряется.

Да.
Т.к. у java (например) есть куча удобных инструментов для работы с кодом.
Что не могу сказать для plpgsql.
Поэтому если нужно написать логику, которая не может быть сделана с помощью SQL, то предпочитаю взять более удобный инструмент, по возможности конечно.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разъясните: Компилятор функций в Постгре / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]