powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция PL/pgSQL выдает необъяснимую ошибку
6 сообщений из 6, страница 1 из 1
функция PL/pgSQL выдает необъяснимую ошибку
    #34549961
tier.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, господа.
Помогите, пожалуйста, найти ошибку в функции.
Функция получает на входе число и текстовую строку (которая содержит url) в качестве аргументов. Далее порядок ее работы таков:
-пытается добавить переданный url в первую таблицу, которая имеет уникальный индекс по этому полю. Если такой url уже есть в ней - функция завершается и возвращает 1. Если удачно добавилось - идет дальше.
-пытается добавить url в таблицу, имя которой получаем с пом. переданного числа(она тоже имеет уникальный индекс по этому полю). Если если удачно - выход со статусом 0. Иначе (если уже есть такой url в этой таблице) - приводит значения всех полей в строке первой таблицы, где такой же url, в соответствие со значениями полей в данной таблице. И выход со статусом 1.

Вот сама функция:

CREATE OR REPLACE FUNCTION add_url(INTEGER, TEXT)
RETURNS INTEGER AS $$
DECLARE
NNN ALIAS FOR $1;
URL ALIAS FOR $2;
REZ RECORD;
QUER TEXT;
BEGIN
--add to first table
BEGIN
INSERT INTO first_table (url_field, some_num) VALUES (URL, -11);
EXCEPTION
WHEN unique_violation THEN
RETURN 1;
END;
--add to another table
BEGIN
EXECUTE 'INSERT INTO table_num_' || NNN || ' (url_field, some_num) VALUES (' || quote_literal(URL) || ', -11)';
EXCEPTION
WHEN unique_violation THEN
QUER := 'SELECT field_a, field_b, field_c, field_d FROM table_num_' || NNN || ' WHERE url_field = ' || quote_literal(URL);
EXECUTE QUER INTO REZ;
UPDATE first_table SET field_a = REZ.field_a, field_b = REZ.field_b, field_c = REZ.field_c, field_d = REZ.field_d WHERE url_field = URL;
RETURN 1;
END;
RETURN 0;
END; $$
LANGUAGE 'plpgsql';


------------------

Изредка (несколько раз в сутки) эта функция вылетает с ошибкой (вижу в логе). Вот кусок лога:
ERROR: type of "rez.field_c" does not match that when preparing the plan
CONTEXT: PL/pgSQL function "add_url" line 21 at SQL statement
STATEMENT: SELECT add_url(810, 'http://www.xyz.com/mfhighlife/')

Типы данных в полях такие:
field_a - text
field_b - text
field_c - integer
field_d - timestamp without time zone

Все потестил, функция прекрасно работает при любых вариантах (заходах в любую ветвь), а вот баги лезут изредка...
В чем может быть дело?
Спасибо.
...
Рейтинг: 0 / 0
функция PL/pgSQL выдает необъяснимую ошибку
    #34550033
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Prejde chem predpolagat' chto-to neveroiatnoe, hochetsia sprosit': Vy uvereny chto pole field_c vo vseh tablitsah table_num_XXXXXXXX imeet strogo tip integer ?

Prover'te:
Код: plaintext
1.
select table_name, data_type from information_schema.columns
                    where column_name='field_c' and table_name ~ '^table_num_';
...
Рейтинг: 0 / 0
функция PL/pgSQL выдает необъяснимую ошибку
    #34550595
tier.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уверен на 100%. Проверял руками/глазами.
Похоже, все-таки действительно что-то странное происходит - функция, вызванная вручную с теми же аргументами, что привели к ошибке - отрабатывает прекрасно.
...
Рейтинг: 0 / 0
функция PL/pgSQL выдает необъяснимую ошибку
    #34551339
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tier.ruУверен на 100%. Проверял руками/глазами.
Похоже, все-таки действительно что-то странное происходит - функция, вызванная вручную с теми же аргументами, что привели к ошибке - отрабатывает прекрасно.

Nu tut vazno ne povtoriat' tu je functsiu, a povtorit' posledovatelnost'
1) 1-yy vyzov f-ii, na kotorom preparil'is' plany
2) vyzov vashei f-ii

Eto mojno poprobovat' otsledit' postaviv,
log_statements =all
i v log_prefix dobavit' Session ID, togda mojno uznat' na kakom vyzove proishodilo planirovanie functsii dlia dannoi sessii.

A esli uje dumat' o tom, chto eto vozmojno bug v postgres'e, to mojno v src/pl/plpgsql/src/pl_exec.c
tam gde vyvalivaetsia soobshenie (eto strochka 3713 v pl_exec.c ), dobavit' vydachu
*typeid i expectedtypeid, chtoby poniat' hotia by, chto nepravilnoe, tip v preplanennoi functsii, ili v tip v vyzyvaemoi...
...
Рейтинг: 0 / 0
функция PL/pgSQL выдает необъяснимую ошибку
    #34553516
tier.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СергейКPrejde chem predpolagat' chto-to neveroiatnoe, hochetsia sprosit': Vy uvereny chto pole field_c vo vseh tablitsah table_num_XXXXXXXX imeet strogo tip integer ?

Prover'te:
Код: plaintext
1.
select table_name, data_type from information_schema.columns
                    where column_name='field_c' and table_name ~ '^table_num_';


Прошу прощения - немного соврал.
Поле field_c в половине таблиц table_num_XXX имеет тип smallint, а в половине - integer. В first_table - тоже integer. НО, насколько я понимаю, из-за этого никаких проблем быть не может - типы-то совместимые. Кроме того, значения поля field_c НИКОГДА не выходит за размерность типа smallint.
...
Рейтинг: 0 / 0
функция PL/pgSQL выдает необъяснимую ошибку
    #34553570
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tier.ruПрошу прощения - немного соврал.
Поле field_c в половине таблиц table_num_XXX имеет тип smallint, а в половине - integer. В first_table - тоже integer. НО, насколько я понимаю, из-за этого никаких проблем быть не может - типы-то совместимые. Кроме того, значения поля field_c НИКОГДА не выходит за размерность типа smallint.

Nu...

Nifiga oni ne sovmestimye... v dannom sluchae Postgres prosto formalno sravnivaet OID'y tipov, i esli oni raznye, to posylaet daleko... (ne pytaias' nichego cast'it')

Tak chto esli hotite, chtoby u vas vse rabotalo, to v vashem zaprose:
QUER="SELECT ..."
cast'ite peremennuiu k tipu integer
QUER := 'SELECT field_a, field_b, field_c::integer, field_d FROM table_num_' || NNN || ' WHERE url_field = ' || quote_literal(URL);
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция PL/pgSQL выдает необъяснимую ошибку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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