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

Начало » Использование СУБД » Firebird, HQbird, InterBase » Проблемное арифметическое выражение
Проблемное арифметическое выражение [сообщение #339] Thu, 18 August 2022 14:10 Переход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 26
Зарегистрирован: July 2022
Junior Member
Приветствую знатоков и разработчиков!

WI-V3.0.8.33535 Firebird 3.0

Безобидное выражение, суммы - несколько миллионов, не более, а выдает ошибку:

SQL> select 5302239.56 + round(22927.000000 * 234.500000, 2) from rdb$database
CON> ;

                  ADD
=====================
Statement failed, SQLSTATE = 22003
Integer overflow.  The result of an integer operation caused the most significant bit of the result to carry.
SQL>
Re: Проблемное арифметическое выражение [сообщение #341 является ответом на сообщение #339] Thu, 18 August 2022 14:24 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 26
Зарегистрирован: July 2022
Junior Member
Извиняюсь, сам разобрался. Ответ есть в примечании к описанию функции round.
Re: Проблемное арифметическое выражение [сообщение #342 является ответом на сообщение #341] Thu, 18 August 2022 15:25 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 53
Зарегистрирован: August 2022
Member
Выражение, приводящее к значению с типом NUMERIC(20,12), не может быть безобидным. Таких монстриков научился жрать только Firebird 4.
Re: Проблемное арифметическое выражение [сообщение #343 является ответом на сообщение #342] Thu, 18 August 2022 16:37 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 26
Зарегистрирован: July 2022
Junior Member
SD писал(а) Thu, 18 August 2022 15:25
Выражение, приводящее к значению с типом NUMERIC(20,12), не может быть безобидным.
Это понятно. Просто я был уверен, что round(.., 2) выдает numeric(..., 2). Выглядит логичнее, чем существующее поведение.
Re: Проблемное арифметическое выражение [сообщение #344 является ответом на сообщение #343] Fri, 19 August 2022 00:10 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 5
Зарегистрирован: June 2022
Географическое положение: Одеса
Junior Member
Рекомендую при сложных умножениях и делениях приводить к float таким способом
select 5302239.56 + round(1e0 * 22927.000000 * 234.500000, 2) from rdb$database
Re: Проблемное арифметическое выражение [сообщение #345 является ответом на сообщение #343] Fri, 19 August 2022 00:43 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 53
Зарегистрирован: August 2022
Member
ggreggory писал(а) Thu, 18 August 2022 15:37
Просто я был уверен, что round(.., 2) выдает numeric(..., 2). Выглядит логичнее, чем существующее поведение.
У тебя до round() дело не доходит, невозможный тип появляется ещё при попытке вычислить первый параметр.
Re: Проблемное арифметическое выражение [сообщение #347 является ответом на сообщение #345] Fri, 19 August 2022 12:09 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 26
Зарегистрирован: July 2022
Junior Member
SD писал(а) Fri, 19 August 2022 00:43
невозможный тип появляется ещё при попытке вычислить первый параметр.
Не.. этот запрос без ошибок проходит:

select 22927.000000 * 234.500000 from rdb$database
Re: Проблемное арифметическое выражение [сообщение #348 является ответом на сообщение #347] Fri, 19 August 2022 15:28 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 53
Зарегистрирован: August 2022
Member
Хм, действительно. В трекер надо бы написать, но версия всё равно уже неактуальная.
Re: Проблемное арифметическое выражение [сообщение #349 является ответом на сообщение #348] Fri, 19 August 2022 15:30 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 137
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
SD
но версия всё равно уже неактуальная.
с чего бы вдруг?
Re: Проблемное арифметическое выражение [сообщение #351 является ответом на сообщение #348] Fri, 19 August 2022 16:16 Переход к предыдущему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 26
Зарегистрирован: July 2022
Junior Member
SD писал(а) Fri, 19 August 2022 15:28
В трекер надо бы написать
Да всё нормально. Функция round() работает не особо логично, но в документации такое поведение описано. Так что трекер пусть отдыхает Smile
Предыдущая тема: Генераторы в FB4
Следующая тема: Изменения оптимизатора?
Переход к форуму:
  


Текущее время: Sun Dec 04 02:09:11 MSK 2022

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