powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разъясните: Компилятор функций в Постгре
9 сообщений из 9, страница 1 из 1
Разъясните: Компилятор функций в Постгре
    #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
Разъясните: Компилятор функций в Постгре
    #39458520
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПаWWWлОдАрЕц,

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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


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