[
https://issues.apache.org/jira/browse/CALCITE-5735?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Tanner Clary updated CALCITE-5735:
----------------------------------
Description:
BigQuery offers the {{SAFE_MULTIPLY(value1, value2)}} function which returns
the result of {{value1}} * {{value2}}. If overflow occurs, null is returned.
The correct return type may be inferred according to the [BigQuery
docs|https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#safe_multiply].
BigQuery treats all integer types as aliases for {{BIGINT}} (which BigQuery
calls {{INT64}}. Therefore, all integer types (and the result of their
multiplication) should be treated as {{BIGINT}}. This means, for example,
multiplying two {{TINYINT}} that would cause {{TINYINT}} overflow, would be
okay as long as the result does not also cause {{BIGINT}} overflow. {{BIGINT}}
translates to Java's {{LONG}} whose bounds are used to determine whether
overflow has occurred.
BigQuery also supports {{Decimal}} and {{BigDecimal}} types, which maps to
Calcite's {{DECIMAL}} type. Their overflow is determined using their precision
and scale, and if they exceed BigQuery's limits, then overflow has occurred.
Because Calcite does not differentiate between {{DECIMAL}} and {{BIGDECIMAL}},
there are only 9 possible combinations of operand types, although the chart
linked above has 16.
BigQuery's {{FLOAT64}} maps to Java's {{DOUBLE}} and it's {{MAX_VALUE}} and
{{MIN_VALUE}} are used to determine whether overflow has occurred.
Any questions about this implementation are welcomed and appreciated.
was:
BigQuery offers the {{SAFE_MULTIPLY(value1, value2)}} function which returns
the result of {{value1}} * {{value2}}. If overflow occurs, null is returned.
The correct return type may be inferred according to the [BigQuery
docs|https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#safe_multiply].
BigQuery treats all integer types as aliases for {{BIGINT}} (which BigQuery
calls {{INT64}}. Therefore, all integer types (and the result of their
multiplication) should be treated as {{BIGINT}}. This means, for example,
multiplying two {{TINYINT}} that would cause {{TINYINT}} overflow, would be
okay as long as the result does not also cause {{BIGINT}} overflow. {{BIGINT}}
translates to Java's {{LONG}} whose bounds are used to determine whether
overflow has occurred.
BigQuery also supports {{Decimal}} and {{BigDecimal}} types, which maps to
Calcite's {{DECIMAL}} type. Their overflow is determined using their precision
and scale, and if they exceed BigQuery's limits, then overflow has occurred.
BigQuery's {{FLOAT64}} maps to Java's {{DOUBLE}} and it's {{MAX_VALUE}} and
{{MIN_VALUE}} are used to determine whether overflow has occurred.
> Implement SAFE_MULTIPLY function (enabled for BigQuery)
> -------------------------------------------------------
>
> Key: CALCITE-5735
> URL: https://issues.apache.org/jira/browse/CALCITE-5735
> Project: Calcite
> Issue Type: Sub-task
> Reporter: Tanner Clary
> Assignee: Tanner Clary
> Priority: Major
> Labels: pull-request-available
>
> BigQuery offers the {{SAFE_MULTIPLY(value1, value2)}} function which returns
> the result of {{value1}} * {{value2}}. If overflow occurs, null is returned.
> The correct return type may be inferred according to the [BigQuery
> docs|https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#safe_multiply].
>
> BigQuery treats all integer types as aliases for {{BIGINT}} (which BigQuery
> calls {{INT64}}. Therefore, all integer types (and the result of their
> multiplication) should be treated as {{BIGINT}}. This means, for example,
> multiplying two {{TINYINT}} that would cause {{TINYINT}} overflow, would be
> okay as long as the result does not also cause {{BIGINT}} overflow.
> {{BIGINT}} translates to Java's {{LONG}} whose bounds are used to determine
> whether overflow has occurred.
> BigQuery also supports {{Decimal}} and {{BigDecimal}} types, which maps to
> Calcite's {{DECIMAL}} type. Their overflow is determined using their
> precision and scale, and if they exceed BigQuery's limits, then overflow has
> occurred. Because Calcite does not differentiate between {{DECIMAL}} and
> {{BIGDECIMAL}}, there are only 9 possible combinations of operand types,
> although the chart linked above has 16.
> BigQuery's {{FLOAT64}} maps to Java's {{DOUBLE}} and it's {{MAX_VALUE}} and
> {{MIN_VALUE}} are used to determine whether overflow has occurred.
> Any questions about this implementation are welcomed and appreciated.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)