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

Liya Fan updated CALCITE-4392:
------------------------------
    Description: 
Method {{SqlTypeUtil#equalSansNullability(RelDataTypeFactory, RelDataType, 
RelDataType) is on the hot path for many scenarios, as it compare types with 
nullability ignored.

In the implementation, the expensive operations are 
{{RelDataType#equals(Object)}} and 
{{RelDataTypeFactory#createTypeWithNullability}}, especially for types with 
multiple sub-fields. 

For the current implementation, the {{RelDataType#equals(Object)}} is called at 
least once, and {{RelDataTypeFactory#createTypeWithNullability}} is called 
whenever the nullability values are different. 

We can improve the implementation so that {{RelDataType#equals(Object)}} is 
called exactly once, and the call to 
{{RelDataTypeFactory#createTypeWithNullability}} can be avoided if the types 
are totally different (with different type names, and nullability values)

{noformat}
if (type1.isNullable() == type2.isNullable()) {
  return type1.equals(type2);
} else {
  return type1.equals(
        factory.createTypeWithNullability(type2, type1.isNullable()));
}
{noformat}

  was:
Method {{SqlTypeUtil#equalSansNullability(RelDataTypeFactory, RelDataType, 
RelDataType) is on the hot path for many scenarios, as it compare types with 
nullability ignored.

In the implementation, the expensive operations are 
{{RelDataType#equals(Object)}} and 
{{RelDataTypeFactory#createTypeWithNullability}}, especially for types with 
multiple sub-fields. 

For the current implementation, the {{RelDataType#equals(Object)}} is called at 
least once, and {{RelDataTypeFactory#createTypeWithNullability}} is called 
whenever the nullability values are different. 

We can improve the implementation so that {{RelDataType#equals(Object)}} is 
called at most once, and the call to 
{{RelDataTypeFactory#createTypeWithNullability}} can be avoided if the types 
are totally different (with different type names, and nullability values)

{noformat}
if (type1.isNullable() == type2.isNullable()) {
  return type1.equals(type2);
} else {
  return type1.equals(
        factory.createTypeWithNullability(type2, type1.isNullable()));
}
{noformat}


> The operation of checking types equal ignoring null can be more efficient
> -------------------------------------------------------------------------
>
>                 Key: CALCITE-4392
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4392
>             Project: Calcite
>          Issue Type: Improvement
>          Components: core
>            Reporter: Liya Fan
>            Assignee: Liya Fan
>            Priority: Major
>
> Method {{SqlTypeUtil#equalSansNullability(RelDataTypeFactory, RelDataType, 
> RelDataType) is on the hot path for many scenarios, as it compare types with 
> nullability ignored.
> In the implementation, the expensive operations are 
> {{RelDataType#equals(Object)}} and 
> {{RelDataTypeFactory#createTypeWithNullability}}, especially for types with 
> multiple sub-fields. 
> For the current implementation, the {{RelDataType#equals(Object)}} is called 
> at least once, and {{RelDataTypeFactory#createTypeWithNullability}} is called 
> whenever the nullability values are different. 
> We can improve the implementation so that {{RelDataType#equals(Object)}} is 
> called exactly once, and the call to 
> {{RelDataTypeFactory#createTypeWithNullability}} can be avoided if the types 
> are totally different (with different type names, and nullability values)
> {noformat}
> if (type1.isNullable() == type2.isNullable()) {
>   return type1.equals(type2);
> } else {
>   return type1.equals(
>         factory.createTypeWithNullability(type2, type1.isNullable()));
> }
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to