Например:
Код: Выделить всё
SELECT S1__AMOUNT * S1__PRICE * S1__UNITS * 1000При умножении нескольких таких столбцов (особенно трех или более) и затем умножении на константу (например, * 1000) я получаю:
Код: Выделить всё
duckdb.duckdb.OutOfRangeException: Out of Range Error:
Overflow in multiplication of DECIMAL(38) (194586756000000000000000000000000000 * 1000).
You might want to add an explicit cast to a decimal with a smaller scale.
Я не могу привести к DOUBLE, но после каждой операции разрешено приводить ее результат к десятичному виду (38,10)
Я знаю, что могу вручную переписать предложение SQL для приведения после каждого шага, например:
Код: Выделить всё
CAST(
CAST(
CAST(S1__AMOUNT * S1__PRICE AS DECIMAL(38,10))
* S1__UNITS AS DECIMAL(38,10)
)
* 1000 AS DECIMAL(38,10)
)
Вопрос:
Есть ли какой-нибудь способ настроить DuckDB так, чтобы он:
- Автоматически уменьшал промежуточный десятичный масштаб/точность, если необходимо вписаться внутрь DECIMAL(38,10), без создания исключения OutOfRangeException, или
- Автоматически приводит промежуточные арифметические результаты обратно к безопасному DECIMAL(38,10), или
- Предоставляет выражение/функцию для безопасного «умножения с безопасным от переполнения десятичным продвижением»?
Точный код для воспроизведения проблемы:
Код: Выделить всё
sql_ruleset_clause = """
SELECT AMOUNT * PRICE * RATE * 1000
FROM read_parquet('decimal_test.parquet')
"""
duckdb_connection = duckdb.connect(database=":memory:", read_only=False)
zxc = duckdb_connection.execute(sql_ruleset_clause).pl()
print(zxc)
важно: все столбцы типа decimal(38,10)
Подробнее здесь: https://stackoverflow.com/questions/798 ... g-decimals
Мобильная версия