Mihai Budiu created CALCITE-6328: ------------------------------------ Summary: The BigQuery functions SAFE_* do not match the BigQuery specification Key: CALCITE-6328 URL: https://issues.apache.org/jira/browse/CALCITE-6328 Project: Calcite Issue Type: Bug Components: core Affects Versions: 1.36.0 Reporter: Mihai Budiu
The BigQuery dialect does not support DECIMAL values with arbitrary types: it only supports two fixed types: NUMERIC and BIGNUMERIC, both with fixed precision and scale. The runtime implementation of the SAFE_* functions uses the following helper in SqlFunctions: {code:java} /** Returns whether a BigDecimal value is safe (that is, has not overflowed). * According to BigQuery, BigDecimal overflow occurs if the precision is greater * than 76 or the scale is greater than 38. */ private static boolean safeDecimal(BigDecimal b) { return b.scale() <= 38 && b.precision() <= 76; } {code} This helper does not handle correctly NUMERIC value, only BIGNUMERIC. Moreover, all the tests in SqlOperatorTests use a type system which doesn't even support DECIMAL values wider than 38 digits. So a test like the following: {code:java} f.checkNull("safe_add(cast(-9.9e75 as DECIMAL(76, 0)), " + "cast(-9.9e75 as DECIMAL(76, 0)))"); {code} cannot even create the expected BigDecimal value correctly. This surfaced during the attempt to fix [CALCITE-6322]: once the casts to DECIMAL are implemented, some of these tests break. -- This message was sent by Atlassian Jira (v8.20.10#820010)