[ 
https://issues.apache.org/jira/browse/CALCITE-7807?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Frank Chen updated CALCITE-7807:
--------------------------------
    Description: 
{{SqlTypeFactoryImpl.createTypeWithCharsetAndCollation}} calls 
{{BasicSqlType.createWithCharsetAndCollation}} for every {{BasicSqlType}} 
input. When the type already has the requested charset and collation, it still 
allocates an equivalent {{BasicSqlType}} and {{SerializableCharset}}, which 
{{canonize}} then discards in favor of the existing interned instance.

This happens often during least-restrictive type inference over many character 
literals, for example planning a large string {{IN}} list.

{{BasicSqlType.createWithCharsetAndCollation}} should return {{this}} when the 
requested charset is equal and the collation is the same instance. Collations 
are compared by identity because {{SqlCollation.equals}} ignores coercibility. 
Requests that change either attribute keep the existing construction and 
canonicalization path.

In Druid's string-IN planning benchmark 
({{InPlanningBenchmark.queryStringInSqlPlanOnly}}, {{-prof gc}}), allocation 
dropped by 9.05% at 100,000 literals and 8.72% at 1,000,000 literals. Timing 
confidence intervals overlapped, so no latency improvement is claimed. 

The omission of collation coercibility from type canonicalization is a 
separate, pre-existing issue tracked in CALCITE-3953.

Pull request: [PR #5281|https://github.com/apache/calcite/pull/5281]

  was:
{{SqlTypeFactoryImpl.createTypeWithCharsetAndCollation}} calls 
{{BasicSqlType.createWithCharsetAndCollation}} for every {{BasicSqlType}} 
input. When the type already has the requested charset and collation, it still 
allocates an equivalent {{BasicSqlType}} and {{SerializableCharset}}, which 
{{canonize}} then discards in favor of the existing interned instance.

This happens often during least-restrictive type inference over many character 
literals, for example planning a large string {{IN}} list.

{{BasicSqlType.createWithCharsetAndCollation}} should return {{this}} when the 
requested charset is equal and the collation is the same instance. Collations 
are compared by identity because {{SqlCollation.equals}} ignores coercibility. 
Requests that change either attribute keep the existing construction and 
canonicalization path.

In Druid's string-IN planning benchmark 
({{InPlanningBenchmark.queryStringInSqlPlanOnly}}, {{-prof gc}}), allocation 
dropped by 9.05% at 100,000 literals and 8.72% at 1,000,000 literals. Timing 
confidence intervals overlapped, so no latency improvement is claimed.

The omission of collation coercibility from type canonicalization is a 
separate, pre-existing issue tracked in CALCITE-3953.

The isolated Druid benchmark reduced allocation by 9.05% at 100,000 string 
literals and 8.72% at 1,000,000 string literals.

Pull request: [PR #5281|https://github.com/apache/calcite/pull/5281]


> BasicSqlType.createWithCharsetAndCollation should return this when charset 
> and collation are unchanged
> ------------------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-7807
>                 URL: https://issues.apache.org/jira/browse/CALCITE-7807
>             Project: Calcite
>          Issue Type: Sub-task
>            Reporter: Frank Chen
>            Priority: Major
>              Labels: pull-request-available
>
> {{SqlTypeFactoryImpl.createTypeWithCharsetAndCollation}} calls 
> {{BasicSqlType.createWithCharsetAndCollation}} for every {{BasicSqlType}} 
> input. When the type already has the requested charset and collation, it 
> still allocates an equivalent {{BasicSqlType}} and {{SerializableCharset}}, 
> which {{canonize}} then discards in favor of the existing interned instance.
> This happens often during least-restrictive type inference over many 
> character literals, for example planning a large string {{IN}} list.
> {{BasicSqlType.createWithCharsetAndCollation}} should return {{this}} when 
> the requested charset is equal and the collation is the same instance. 
> Collations are compared by identity because {{SqlCollation.equals}} ignores 
> coercibility. Requests that change either attribute keep the existing 
> construction and canonicalization path.
> In Druid's string-IN planning benchmark 
> ({{InPlanningBenchmark.queryStringInSqlPlanOnly}}, {{-prof gc}}), allocation 
> dropped by 9.05% at 100,000 literals and 8.72% at 1,000,000 literals. Timing 
> confidence intervals overlapped, so no latency improvement is claimed. 
> The omission of collation coercibility from type canonicalization is a 
> separate, pre-existing issue tracked in CALCITE-3953.
> Pull request: [PR #5281|https://github.com/apache/calcite/pull/5281]



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to