SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » coalesce() как реализована? (лишнего нам не надо)
coalesce() как реализована? [сообщение #3146] Wed, 20 September 2023 19:08 Переход к предыдущему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 142
Зарегистрирован: August 2022
Senior Member
coalesce( x, long_read() )
Можно представить 2 способа реализации, лобовой с предварительным вычислением аргументов
result = x;
y      = long_read();
if( result is null ) then begin
    result = y;
end
и оптимизированный без лишних действий
result = x;
if( result is null ) then begin
    result = long_read();
end
Второй способ, ясен пень, требует от компилятора понимания, что он в случае coalesce() имеет дело не с обычной функцией, а по сути с некой особой языковой конструкцией. Но зато в некоторых случаях может существенно ускорить процесс исполнения, избежав никому не нужных вычислений.

Так как оно работает? Интересует прежде всего Firebird 4.0.

P.S.
Если же вычисления аргументов имеют еще и побочные эффекты, отличаться будет не только скорость, но и логика.
Предполагаю сам, что работает по первому варианту (с предварительными вычислениями). Но вдруг.

P.P.S.
Да, проверить экспериментально могу. Провоцирую на обсуждение. А как хотелось бы? А как правильно?
 
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Предыдущая тема: Ubuntu 22.04 Firebird 3.0 & Firebird 2.5
Следующая тема: isc_prepare_transaction() , isc_prepare_transaction2()
Переход к форуму:
  


Текущее время: Sat May 11 14:20:47 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00677 секунд