[
https://issues.apache.org/jira/browse/CALCITE-7917?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated CALCITE-7917:
------------------------------------
Labels: pull-request-available (was: )
> RelMdSize returns negative sizes for CHARACTER and BINARY types with
> unspecified precision
> ------------------------------------------------------------------------------------------
>
> Key: CALCITE-7917
> URL: https://issues.apache.org/jira/browse/CALCITE-7917
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.42.0
> Reporter: Alessandro Solimando
> Assignee: Alessandro Solimando
> Priority: Minor
> Labels: pull-request-available
> Fix For: 1.43.0
>
>
> _RelMdSize#averageTypeValueSize_ uses the precision of a string or binary
> type as its length
> ([here|https://github.com/apache/calcite/blob/a7f3290b7fe2660fb9386a4fcdf2e624ae52ed63/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java#L347-L355]):
> {code:java}
> case BINARY:
> return (double) type.getPrecision();
> case VARBINARY:
> return Math.min((double) type.getPrecision(), 100d);
> case CHAR:
> return (double) type.getPrecision() * BYTES_PER_CHARACTER;
> case VARCHAR:
> // Even in large (say VARCHAR(2000)) columns most strings are small
> return Math.min((double) type.getPrecision() * BYTES_PER_CHARACTER, 100d);
> {code}
> Since CALCITE-1684, the default precision of VARCHAR and VARBINARY is
> {_}RelDataType.PRECISION_NOT_SPECIFIED{_}, which is -1
> ([here|https://github.com/apache/calcite/blob/a7f3290b7fe2660fb9386a4fcdf2e624ae52ed63/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystemImpl.java#L109-L111]).
> The estimated size is then -2 bytes for VARCHAR and -1 byte for VARBINARY.
> CHAR and BINARY have the same problem with a type system whose default
> precision for them is {_}PRECISION_NOT_SPECIFIED{_}.
> These negative estimates can propagate into _getAverageColumnSizes_ and
> _getAverageRowSize_.
> Reproducer (for {_}RelMetadataTest{_}):
> {code:java}
> @Test void testSizeWithoutPrecision() {
> checkSize("SELECT CAST(empno AS VARCHAR) FROM emp", 100d);
> }
> {code}
> The test currently fails as follows:
> {noformat}
> Expected: is <100.0>
> but: was <-2.0>
> {noformat}
> Proposed fix: when the precision of a CHARACTER or BINARY family type is
> {_}PRECISION_NOT_SPECIFIED{_}, use a default estimate of 100 bytes. This
> matches the existing estimates for VARCHAR and VARBINARY with large
> precisions
> ([here|https://github.com/apache/calcite/blob/a7f3290b7fe2660fb9386a4fcdf2e624ae52ed63/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java#L349-L355]).
> It is a fallback estimate when the length is unspecified, not an average
> size derived from the type.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)