powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Блок BEGIN - WHEN - END
31 сообщений из 31, показаны все 2 страниц
Блок BEGIN - WHEN - END
    #39200819
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, я уже задавал этот вопрос, но что-то не могу найти ответ...

Вот есть блок BEGIN - END, выполняющийся между другими операторами:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- Что-то выполняется 1
BEGIN
  -- Что-то выполняется 2
  -- Тут возникает исключение
  -- Что-то выполняется 3
WHEN ANY
  -- Тут исключение ловится и обрабатывается
END
-- Что-то выполняется 4


Я правильно понимаю, что эта последовательность должна в конечном итоге выполняться так, будто весь блок BEGIN-END никогда не вызывался, а существовали только действия 1 и 4?
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39200842
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Транзакционно - да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39200873
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39200895
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv http://www.ibase.ru/savepoints/
Отличная статья, но есть два момента:
1) Когда говорится об "ТС блока освобождается" неплохо бы уточнять освобождается она с
откатом изменений внутри неё или таки с применением.
2) Вот в этом
Примечание. Начиная с Firebird 2.0, откат до ТС блока всегда производится с
проверкой идентификатора ТС, что устраняет подобные ошибочные ситуации.
циферку 2.0 следует изменить на 4.0.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39200904
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> неплохо бы уточнять освобождается она с
Dimitry Sibiryakov> откатом изменений внутри неё или таки с применением.

С откатом, конечно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201007
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы уж точно добить тему: сколько записей по идее должен вставить этот блок?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN
    INSERT INTO t VALUES(1);
    BEGIN
        INSERT INTO t VALUES(2);
        EXCEPTION Boom;
    WHEN ANY DO BEGIN END
    END
END


Иногда мне кажется, что две. Иногда что одну. И чем больше я над этим думаю, тем сильнее
съезжает крыша. Прошу помощи клуба.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201017
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы подлить масла в огонь, скажу что Оракул делает так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> declare a number;
   2  begin
   3    insert into t values (1);
   4    begin
   5      insert into t values (2);
   6      a := 1/0;
   7      exception
   8       when others then
   9         insert into t values(-1);
  10    end;
  11   end;
  12   /

PL/SQL procedure successfully completed.

SQL> select * from t;

          A
----------
          1
          2
         -1


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201034
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> Иногда мне кажется, что две. Иногда что одну.

Две. Вроде бы всегда, хоть явный exception, хоть неявный.

Dimitry Sibiryakov> И чем больше я над этим думаю, тем сильнее
Dimitry Sibiryakov> съезжает крыша. Прошу помощи клуба.

Ну, это видимо от твоего несогласия (или непонимания)
с механизмом расстановки ТС - AFAIU, ты считаешь, что
для SQL-операторов внутри BE-блока не должно быть
своих отдельных ТС. А суслик есть. (с)

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201035
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> Чтобы подлить масла в огонь,
Dimitry Sibiryakov> скажу что Оракул делает так:

Так и FB точно так же сделает, AFAIS.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201037
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНу, это видимо от твоего несогласия (или непонимания) с
механизмом расстановки ТС - AFAIU, ты считаешь, что для SQL-операторов внутри BE-блока не
должно быть своих отдельных ТС. А суслик есть. (с)
Мне сугубо всё равно как расставляются сейфпоинты внутри, я исхожу из документированного
поведения: блок begin-end рассматривается как атомарный оператор, который не может
выполниться наполовину.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201065
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovисхожу из документированного поведения
ну ты скажи уже, где это документировано :-) В DataDef.pdf нет такого, насколько я знаю.
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201119
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrну ты скажи уже, где это документировано :-) В DataDef.pdf нет такого,
насколько я знаю.
Languge Reference 3.0, глава "BEGIN ... END":
Операторные скобки BEGIN ... END определяют блок операторов, которые выполняются как
один оператор.
Атомарность - базовое свойство оператора, не так ли?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201161
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

IMHO, тебе очень хочется увидеть то, чего нет. Ну а Дениса попросим аккуратнее со словами :-)
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201165
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrтебе очень хочется увидеть то, чего нет.
Как раз мне - очень не хочется это видеть, ибо в этом случае я буду виноват в поломке
движка и Влад опять начнёт требовать лишить меня права коммита.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201166
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

я тебе уже писал, что думаю по этому поводу. Продолжать толочь воду в ступе не вижу смысла.
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201168
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrя тебе уже писал, что думаю по этому поводу.
Извини, все сервера феникса в дауне, так что всё, что ты писал, я получу (и то если
повезёт) только на следующей неделе.

PS: Кстати, подумалось, может стоит добавить в парсер немного синтаксического сахара для
совместимости с оракулом?.. Чисто чтобы меньше напрягать пифий при миграции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201183
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovLanguge Reference 3.0, глава "BEGIN ... END":
Операторные скобки BEGIN ... END определяют блок операторов, которые выполняются как
один оператор.
Атомарность - базовое свойство оператора, не так ли?..


Хелен поправила это в переводе но не сильно. Термин операторные скобки ей почему-то не нравится.

LR2.5_ENThe BEGIN ... END construct is a two-part statement that wraps a block of statements that are executed as one unit
of code.

Так что правильный вариант должен звучать так

Операторные скобки BEGIN ... END определяют блок операторов, которые выполняются как одна единица кода.

Короче BEGIN...END никакого отношения к атомарности не имеет. Здесь говорится о том что BEGIN..END может заменять один оператор в конструкциях IF (<condition>) THEN <statement> и др.
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201184
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТак что правильный вариант должен звучать так

Операторные скобки BEGIN ... END определяют блок операторов, которые выполняются как одна
единица кода.

Обычно в книгах по программированию это называется "составной оператор".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201186
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

поправлю, оно так не в одном месте описано.

Кстати про саму обработку ошибок вроде бы написано правильно, и даже примечание по поводу CORE-4483 есть
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201192
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдаже примечание по поводу CORE-4483 есть
Можешь ещё и 4424 упомянуть, раз уж ДЕ считает, что это правильное поведение, а не мой глюк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201265
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovdimitrтебе очень хочется увидеть то, чего нет.
Как раз мне - очень не хочется это видеть, ибо в этом случае я буду виноват в поломке
движка и Влад опять начнёт требовать лишить меня права коммита. а) не будешь, а уже (не я поднял этот вопрос, кстати)
б) я никогда не требовал лишить тебя права коммита, разуй глазки и перечитай почту
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201270
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladа) не будешь, а уже (не я поднял этот вопрос, кстати)
Для заявления об "уже" нужен тест регрессии. Он есть у тебя?
Срабатывание мною же расставленных ассертов - не в счёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201306
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСрабатывание мною же расставленных ассертов - не в счёт.Очередное заблуждение.
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201309
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladОчередное заблуждение.
Ты ещё скажи, что то, что сейфпоинт внутренних WHEN-блоков освобождается позже чем внешних
это тоже мой баг, а вовсе не кривая архитектура...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201485
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<Таблоид mode on>
И вот он, новый тесткейс:
Код: 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.
27.
28.
29.
30.
31.
shell del s_test;
create database "s_test";
set echo on;
create table s_test (f integer);
create table errs(f integer, msg varchar(30));
insert into s_test values (1);
commit;
set term ^;
execute block as
declare variable a integer;
begin
  update s_test set f=2;

  begin
    update s_test set f=3;
    update s_test set f=1/0;
  when gdscode arith_except do insert into errs (f, msg) select f, 'gdscode '||gdscode from s_test;
  when sqlcode -802 do insert into errs (f, msg) select f, 'sqlcode '||sqlcode from s_test;
  when any do insert into errs (f, msg) select f, 'any' from s_test;
  when any do a=1/0;
  when any do insert into errs (f, msg) select f, 'any-1' from s_test;
  end

  insert into s_test values (-1);
  when any do begin insert into errs (f, msg) select f, 'any2' from s_test; end
end^
commit^
select f from s_test^
select * from errs^
commit^
set term ;^


Кто-нибудь может объяснить логику в результате которой получается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select f from s_test^
           F
============
           1
          -1

select * from errs^
           F MSG
============ ==============================
           1 any2
           1 any-1


?

Как в таблицу s_test попало -1, когда оно должно было пропуститься из-за выкинутого в четвёртом внутреннем обработчике исключения?
Почему пятый обработчик не только выполнился, но и его результат выжил (а первый и третий при этом умерли)?
Про то почему в результате вообще единица - не спрашиваю, это CORE-4424/4484.
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201489
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКак в таблицу s_test попало -1, когда оно должно было пропуститься из-за выкинутого в четвёртом внутреннем обработчике исключения?
Почему пятый обработчик не только выполнился, но и его результат выжил (а первый и третий при этом умерли)?
это один и тот же вопрос на самом деле. Получается, что исключение из WHEN ловится следующим же WHEN того же уровня? Прелестно!
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201495
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrПолучается, что исключение из WHEN ловится следующим же WHEN того же уровня?
Прелестно!
Увы, нет. Всё гораздо хуже и прямо связано с твоим комментом к пулл-реквесту на CORE-5173.
Обрати внимание на порядок записей в таблице errs.

Работает это так: обработчики исключений вызываются рекурсивно. (Ага!)
Четвёртый внутренний обработчик вызвал внешний обработчик, тот откатил что откатить мог
(всё что было сделано внутренним блоком плюс работу первого и третьего обработчиков), и
вернулся. А уже потом управление пошло дальше - к пятому обработчику, вставке -1 и далее
везде.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201498
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня давно уже сидит подозрение, что рекурсия обработчикам нафиг не нужна. Но глубоко эту мысль я не копал...
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201501
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если я правильно понимаю, то вызов обработчика вместо:

temp = EXE_looper(tdbb, request, temp);

должен быть:

EXE_looper(tdbb, request, temp);

и ниже возврат parentStmt. Тогда по выходу из текущего обработчика управление всегда перейдет на END того же блока, а не туда, откуда пришло исключение. И я даже показывал тебе патч с этим изменением. Только ХЗ, что еще это может сломать...
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201504
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrу меня давно уже сидит подозрение, что рекурсия обработчикам нафиг не нужна.
Но глубоко эту мысль я не копал...
Меня тоже удивляет чего надо накуриться чтобы сделать итерационный лупер с элементами
рекурсии в самых неподходящих местах.

dimitrИ я даже показывал тебе патч с этим изменением. Только ХЗ, что еще это может
сломать...
Точно не мне. И таки да, это может наломать разных дров. Но четвёрка-то ещё в пелёнках,
она и без этого иногда падает, так что хуже стать не должно по идее.

Имеет смысл этот тесткейс загнать в трекер как бага или он таки as designed?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блок BEGIN - WHEN - END
    #39201505
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возврат из внешнего обработчика обратно во внутренний - явно бага, можно занести в трекер
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Блок BEGIN - WHEN - END
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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