powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Integer overflow <== coalesce & numeric-Int64
13 сообщений из 13, страница 1 из 1
Integer overflow <== coalesce & numeric-Int64
    #39866987
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reportedfor Friebird 2.5.8
Tested in Firebird 2.1.7 Win32, SQL Dialect 3
Также судя по всему присутсвует в Firebird 3.0.5 Debian

https://stackoverflow.com/questions/58096187 •If any (of the 4) coalesces are replaced by a fixed value it's ok
•If any coalesce is removed, the result is also ok
•If for any field another is used, the error remains

Replacing the '/' with '-' also gives a result but not the correct value.



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table t58096187 (
 f1 numeric(10,4),
 f2 numeric(10,4),
 f3 numeric(10,4),
 f4 numeric(10,4)
);

insert into t58096187 values ( 50, 50, 50, 50 );

select
 coalesce(F1, 0) * coalesce(F2, 0) * ((100 - coalesce(F3, 0)) / 100) * ((100 + coalesce(F4, 0)) / 100)
from t58096187;



ERROR: Unsuccesful execution ... integer overflow ... cause the most significant bit of the result to carry

Меняем определение таблицы (остальные две команды те же).

Код: sql
1.
2.
3.
4.
5.
6.
recreate table t58096187 (
 f1 numeric(9,4),
 f2 numeric(9,4),
 f3 numeric(9,4),
 f4 numeric(9,4)
)



ERROR

Код: sql
1.
2.
3.
4.
5.
6.
recreate table t58096187 (
 f1 numeric(14,4),
 f2 numeric(14,4),
 f3 numeric(14,4),
 f4 numeric(14,4)
)



ERROR

Код: sql
1.
2.
3.
4.
5.
6.
recreate table t58096187 (
 f1 float,
 f2 float,
 f3 float,
 f4 float
)



OK, 1875

Код: sql
1.
2.
3.
4.
5.
6.
recreate table t58096187 (
 f1 numeric(6,2),
 f2 numeric(6,2),
 f3 numeric(6,2),
 f4 numeric(6,2)
)



OK, 1875

Firebird 3.0.5 проверялся по https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=57729b31e0a5019aea68a136638d9f50
Ошибка там не показывается, но и результата тоже нет.

Для сравнения, https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=c4a4230e855b0ce4fd2b0c7b3b697cda
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39866994
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
   recreate table t58096187 (
     f1 numeric(10,4),
     f2 numeric(10,4),
     f3 numeric(10,4),
     f4 numeric(10,3)
    )


Still works.

https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=29a6c15d6e1854be230d29aea30307cf
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39866996
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
select
 F1 * F2 * F3 * F4
from t58096187



https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=1f29aff4102ace57e8fa27d83e59b93f

Ошибка.

Интересно, какой тип он пытается создать при перемножении numeric'ов?..

Coalesce видимо не при чём
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867009
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochИнтересно, какой тип он пытается создать при перемножении numeric'ов?..

Как и описано в документации: с точностью, равной сумме точностей операндов. Сколько будет
4+4+4+4 посчитать на пальцах сумеешь? А сравнить с максимально возможной точностью для
numeric в тройке?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867020
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё равно не сходится

18 - (4+4+4+3) = 3

но результат 1875 выдаёт

повезло?
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867023
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще было бы хорошо, если бы в этой ошибке Firebird проговаривал тип, к которому пытается привести значение....
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867037
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochхорошо, если бы в этой ошибке Firebird проговаривал тип, к которому пытается привести
значение....

А " integer overflow" тебе ни на что не намекает?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867058
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

сообщения, которые намекают, хороши в квестах. Пляжный Ларри там, Monkey Island и прочие.
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867181
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochсообщения, которые намекают, хороши в квестах. Пляжный Ларри там, Monkey Island и прочие.
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867188
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
select
 F1 * F2 * Cast(((100 - F3) / 100) * ((100 + F4) / 100) AS TYPE OF COLUMN t58096187.F3)
from t58096187;
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867192
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
-- Это выражение имеет тип NUMERIC(18,8)
SELECT ((100 - F3) / 100) * ((100 + F4) / 100) FROM t58096187;

-- а это уже NUMERIC(18,12)
SELECT F2 * ((100 - F3) / 100) * ((100 + F4) / 100) FROM t58096187;
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867202
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochВсё равно не сходится
18 - (4+4+4+3) = 3
но результат 1875 выдаёт
повезло?
Код: plsql
1.
2.
3.
4.
5.
-- Работает
SELECT Cast(1875 AS NUMERIC(18,15)) FROM oneRow

-- Не работает
SELECT Cast(9224 AS NUMERIC(18,15)) FROM oneRow
...
Рейтинг: 0 / 0
Integer overflow <== coalesce & numeric-Int64
    #39867206
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максимальное положительное для BIGINT = 9 223 372 036 854 775 807
Соответственно, для NUMERIC(18,15) максимальное положительное = 9 223.372 036 854 775 807
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
-- Работает
SELECT Cast(9223.372036854775807 AS NUMERIC(18,15)) FROM oneRow

-- Не работает
SELECT Cast(9223.372036854775808 AS NUMERIC(18,15)) FROM oneRow

-- Работает
SELECT Cast(-9223.372036854775808 AS NUMERIC(18,15)) FROM oneRow

-- Не работает
SELECT Cast(-9223.372036854775809 AS NUMERIC(18,15)) FROM oneRow

Так понятно?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Integer overflow <== coalesce & numeric-Int64
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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