Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / nullif и повторное вычиление expr1 - баг? / 10 сообщений из 10, страница 1 из 1
06.09.2017, 11:45
    #39516298
AnyUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
Код: plsql
1.
2.
3.
4.
create sequence gen$test;
alter sequence gen$test restart with 0;

select nullif(gen_id(gen$test, 1),0) from rdb$database


Если выполнять этот запрос - то приращение всегда будет 2. Тоесть происходит повторное вычисление expr1, чего из описания не следует. Баг?
...
Рейтинг: 0 / 0
06.09.2017, 11:55
    #39516317
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
AnyUser,

нет. Это особенность работы с выражениями
Выражения не кешируются а вычисляются заново при каждом использовании

Код: sql
1.
nullif(gen_id(gen$test, 1),0) = case when gen_id(gen$test, 1)=0 then null else  gen_id(gen$test, 1) end
...
Рейтинг: 0 / 0
06.09.2017, 12:19
    #39516352
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
AnyUser> Баг?

Нет, не баг. Я точно помню, что описывал это где-то.
В релизнотах, скорее всего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.09.2017, 12:20
    #39516354
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
P.S. При чём это относится не только к генераторам,
и приращение вовсе не всегда будет 2. За давностью
лет я уже не вспомню, но 3 - точно было; может, и 4 тоже.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.09.2017, 12:38
    #39516371
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
возможно, тут было бы лучше заводить временную невидимую переменную до передачи в case

иначе действительно контр-интуитивно получается.

Пусть не баг, но вполне себе грабли, "gotcha"


С другой стороны, nullif это же для совместимости ввели, кажется еще Олегом Лоа, с каким-то другим сервером, скорее всего MS SQL
Надо проверить, как в нём это отрабатывает.
...
Рейтинг: 0 / 0
06.09.2017, 13:40
    #39516439
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
...
Рейтинг: 0 / 0
06.09.2017, 13:49
    #39516448
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
AnyUser,

кстати зачем это
Код: sql
1.
nullif(gen_id(gen$test, 1),0)



вы там что генераторы в -1 сбрасываете? Трюк сам по себе глючный
...
Рейтинг: 0 / 0
06.09.2017, 13:58
    #39516460
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
Это касалось не только nullif, AFAIR.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.09.2017, 14:41
    #39516491
AnyUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
Симонов Денисвы там что генераторы в -1 сбрасываете? Трюк сам по себе глючный
Нет, это синтетический пример. Просто нужна была функция с подобным поведением (если бы не этот "тонкий момент").
...
Рейтинг: 0 / 0
06.09.2017, 14:47
    #39516504
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nullif и повторное вычиление expr1 - баг?
Naf Oracle и NULLIF — подводные камни

Аргумент...

Там, ксттаи, хорошая вещь упоминается, кэш результатов выражений
если вы укажете в качестве первого аргумента тяжелую (и не объявленную как DETERMINISTIC) функцию
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / nullif и повторное вычиление expr1 - баг? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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