|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
Всем привет! 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.
Объясните мне, это действительно такая особенность компилятора в постргресе или это можно подкрутить в настройках? Хочется немного более строгого компилятора, что бы такие банальные ошибки как использование неизвестной переменной или отсутствующей таблицы приводило к ошибкам при компиляции процедуры а не в момент когда ее запускают. Вот нашел в доке https://postgrespro.ru/docs/postgresql/9.4/plpgsql-development-tips.html в самом низу, раздел 40.11.2. Но не могу понять, это относится к моей проблеме или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 06:41 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
ПаWWWлОдАрЕц, Потому что plpgsql - это не встроенный язык для хранимых процедур, а расширение. Т.е. он на равных правах, что например C\C++, python, java и прочие внешние ЯП. Сделан для "совместимости" с PLSQL. А так нативные ЯП для ХП в PostgreSQL это SQL. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 07:12 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
mad_nazgul, Спасибо за ответ. Я тоже так подумал что это плата за универсальность использования нескольких языков для функций, но я предположил что ноги растут от того, что встроенный plpgsql похож на интерпретируемые языки (like php), и в связи с этим он так "снисходительно" относится к необъявленным переменным. Хотя, это не дает ему основания игнорировать переменные, ИМХО. Порой обычного SQL не хватает для обработки данных и приходится писать большие простыни кода на plpgsql, и вот как раз эта особенность, очень усложняет отладку кода. А как вы "боретесь" с такой проблемой? Если конечно она вас тоже не обходит стороной ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 07:39 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 09:40 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
ПаWWWлОдАрЕцmad_nazgul, Спасибо за ответ. Я тоже так подумал что это плата за универсальность использования нескольких языков для функций, но я предположил что ноги растут от того, что встроенный plpgsql похож на интерпретируемые языки (like php), и в связи с этим он так "снисходительно" относится к необъявленным переменным. Хотя, это не дает ему основания игнорировать переменные, ИМХО. Он и не игнорирует. Просто вызов интерпретатора происходит не во время создания ХП, а во время выполнения. А так ну какой-то текст, который должен обработать какой-то внешний обработчик. Понятно это не удобно. Но у команды PostgreSQL в приоритете немного другие задачи. ПаWWWлОдАрЕцПорой обычного SQL не хватает для обработки данных и приходится писать большие простыни кода на plpgsql, и вот как раз эта особенность, очень усложняет отладку кода. Честно с трудом представляю, что не может оператор with, чтобы использовать plpgsql. ПаWWWлОдАрЕцА как вы "боретесь" с такой проблемой? Если конечно она вас тоже не обходит стороной ) Никак. Если что-то нельзя сделать запросом, пишу логику в другом ЯП (java). Т.е. если есть возможность не пользоваться plpgsql, то лучше им не пользоваться. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 10:27 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
как уже сказано, вы путаете поверхностный чек с компиляцией. про plpgsql: левая сторона оператора := всегда переменная -- её почекать просто правая сторона -- всегда SELECT Код: plaintext 1. 2.
и разбирать правую сторону при чеке немного сложнее. к тому же всё равно нет никакой инвалидизации хранимок при смене состава или структуры таблиц (если только типы возвратов и переменных не меняются). т.ч. тут поле и не паханное, и не шибко интересное. тестируйте все свои хранимки ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 11:11 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
mad_nazgulпишу логику в другом ЯП (java).Несомненно, от замены одинарных кавычек на двойные код проблема проверки при компиляции тут же испаряется. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 11:48 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
ПаWWWлОдАрЕц, Для начала pl/pgsql - чистый интерпретатор (компиляции там даже в проекте пока нет). Даже просто парсинг происходит при первом вызове хранимки в контексте коннекта (т.е. 2 разных коннекта имеют две разных версии хранимки в памяти, более того они могут разные вещи делать например в зависимости от search_path). Бороться - pgsql_check который кое что проверяет + check_function_bodies = on как то так. И тестирование. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 11:51 |
|
Разъясните: Компилятор функций в Постгре
|
|||
---|---|---|---|
#18+
p2.mad_nazgulпишу логику в другом ЯП (java).Несомненно, от замены одинарных кавычек на двойные код проблема проверки при компиляции тут же испаряется. Да. Т.к. у java (например) есть куча удобных инструментов для работы с кодом. Что не могу сказать для plpgsql. Поэтому если нужно написать логику, которая не может быть сделана с помощью SQL, то предпочитаю взять более удобный инструмент, по возможности конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2017, 15:04 |
|
|
start [/forum/topic.php?fid=53&msg=39458524&tid=1996496]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 318ms |
total: | 462ms |
0 / 0 |