Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Ошибка при перекомпиляции пакета с вложенными функциями / 10 сообщений из 10, страница 1 из 1
07.05.2021, 00:26
    #40068837
L_VV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
Обнаружилась проблема с перекомпиляцией пакета при некотором сочетании вложенных функций.
Firebird 4 текущий снапшот (на предыдущих было так же), IBExpert 2021.3.29.1

Удалось сделать простой пример, воспроизводится всегда.

Пакет:
Код: sql
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
SET TERM ^ ;

CREATE OR ALTER PACKAGE USR_PKG_TEST
AS
begin
  function get_usr_name()
   returns varchar(30);

  function get_usr_id()
   returns numeric;

  procedure create_usr(p_user_name varchar(30))
    returns (p_id numeric);

end^

RECREATE PACKAGE BODY USR_PKG_TEST
AS
begin
  function get_usr_name()
   returns varchar(30)
  as
  begin
    return 'TEST_USER';
  end

  function get_usr_id()
   returns numeric
  as
    declare variable v_sess_usr_name varchar(30);
  begin
    v_sess_usr_name = get_usr_name(); -- Здесь хоть с именем пакета, хоть без имени пакета,
                                      -- ошибки при перекомпиляции в редакторе пакетов нет
    -- ...

    return 123;

  end

  procedure create_usr(p_user_name varchar(30))
    returns (p_id numeric)
  as
    declare variable v_sess_usr_id numeric;
  begin
    v_sess_usr_id = USR_PKG_TEST.get_usr_id(); -- Если здесь имя данного пакета, или функция вызывается без имени пакета,
                                               -- то на второй перекомпиляции пакета в редакторе пакетов происходит ошибка,
                                               -- приводящая к закрытию соединения с БД.
                                               -- Если здесь имя другого пакета с такой же функцией (например, просто копия этого пакета),
                                               -- то пакет можно перекомпилировать много раз, ошибки при перекомпиляции нет
    -- ...
  end

end
^

SET TERM ; ^



Первая компиляция в редакторе пакетов происходит успешно,
при повторной перекомпиляции пакета происходит ошибка, приводящая к закрытию соединения с БД:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Error Message:
----------------------------------------
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Error reading data from the connection.
-------------------------------------------------------------------------------------------------------------
SQLCODE: -902
SQLSTATE: 08006
GDSCODE: 335544726
Connection will be closed immediately.

[0054827B] FIB.IBError (Line 588, "FIB.pas" + 82) + $2
[00545771] FIBDatabase.TFIBTransaction.StartTransaction (Line 2953, "FIBDatabase.pas" + 62) + $C
[0110FA82] IBEDatabases.TIBEDatabase.GetMaxRdbFormat (Line 9599, "IBEDatabases.pas" + 14) + $5
[00FF72D9] Main.UpdateMaxRdbFormat (Line 5919, "Main.pas" + 4) + $B
[00EF146C] CompileForm.ExecuteSequence (Line 458, "CompileForm.pas" + 80) + $0
[00E5AEB8] PackageEditorF.TPackageEditorForm.Compile (Line 495, "PackageEditorF.pas" + 121) + $26



После этого соединение с БД закрывается, и нет возможности сохранить пакет, при перекомпиляции которого произошла ошибка.

В Script Executive пакет можно пересоздавать множество раз, ошибки не происходит.
...
Рейтинг: 0 / 0
09.05.2021, 12:45
    #40069085
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
L_VVПервая компиляция в редакторе пакетов происходит успешно,
при повторной перекомпиляции пакета происходит ошибка, приводящая к закрытию соединения с БД:

а вот это уже не похоже на ошибку Эксперта. Если Firebird рвёт соединение на своей стороне, значит там что-то нехорошее произошло.

Смущает использование numeric без указания точности/масштаба.
...
Рейтинг: 0 / 0
09.05.2021, 13:01
    #40069089
L_VV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
Насчёт numeric - там были 'type of column usr.id' и т.п., ошибка была та же.
Просто заменил для упрощения примера. Должно и так работать.

А вот почему рвётся соединение на повторной компиляции именно в редакторе пакетов IBExpert, непонятно.
Если прогоняешь этот скрипт в окне Script Executive в эксперте, или просто через isql, то можно множество раз его выполнять, ошибки нет.

Кстати, в некоторых случаях после переконнекта после ошибки, тело пакета оказывается пустым. Закономерности не нашёл, но, кажется, это иногда происходит, если после ошибки не закрывать эксперт полностью, а только переподключиться к БД и продолжить работать.
...
Рейтинг: 0 / 0
10.05.2021, 08:30
    #40069129
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
Ну я тут вины эксперта не вижу.
...
Рейтинг: 0 / 0
10.05.2021, 08:47
    #40069133
L_VV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
Но ошибка возникает только в редакторе пакетов IBExpert.

И в редакторе скриптов IBExpert, и в isql ошибка не появляется, а в редакторе пакетов в 100% случаев на повторной компиляции падает.

Может под дебаггером в коде эксперта будет что-то понятнее?
...
Рейтинг: 0 / 0
10.05.2021, 09:17
    #40069136
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
Там после коммита транзакции соединение рвется. Больше ничего не видно.

Ну и тот факт, что при замене проблемного куска кода на другой все нормально, как бы намекает, что дело не в эксперте.
...
Рейтинг: 0 / 0
10.05.2021, 09:29
    #40069139
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
В редакторе скриптов у меня тоже воспроизводится.
И в SQL-редакторе воспроизводится.
...
Рейтинг: 0 / 0
10.05.2021, 09:40
    #40069140
L_VV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
Сейчас в редакторе скриптов у меня тоже воспроизвелось.
Странно, почему раньше в нём не падало.

И в isql тоже на второй компиляции в этом же соединении падает.
В прошлый раз я, оказывается, в разных подключениях проверял.

Перенесу тогда этот тест в основной форум со ссылкой на эту тему, видимо, надо в самом FB смотреть.
...
Рейтинг: 0 / 0
10.05.2021, 10:01
    #40069144
Dimbuch®
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
L_VV,

Соединение так же обрывается в пакете, если во вложенной процедуре/функции пакета происходит исключение и обрабатывается через WHEN <error> DO …
Но обрыв соединения происходит уже при запуске процедуры/функции.
Приходится то же самое делать в вызывающей процедуре пакета: повторять блок WHEN <error> DO …
Не раз на такое натыкался. Видимо, это какая-то недоделка в Firebird насчёт вызовов собственных для пакета процедур/функций
...
Рейтинг: 0 / 0
10.05.2021, 10:41
    #40069147
L_VV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при перекомпиляции пакета с вложенными функциями
Ссылка на обсуждение в форуме "Firebird, Interbase":
https://www.sql.ru/forum/1335975/oshibka-pri-perekompilyacii-paketa-s-vlozhennymi-funkciyami
...
Рейтинг: 0 / 0
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Ошибка при перекомпиляции пакета с вложенными функциями / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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