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

Sergey Nuyanzin updated CALCITE-5380:
-------------------------------------
    Description: 
I try to check main branch against existing Flink tests.
One of the things I faced is that existing Flink function
{code:java}
public class SqlListAggFunction extends SqlAggFunction {

    public SqlListAggFunction() {
        super(
                "LISTAGG",
                null,
                SqlKind.LISTAGG,
                ReturnTypes.ARG0_NULLABLE,
                null,
                OperandTypes.or(
                        OperandTypes.CHARACTER,
                        OperandTypes.sequence(
                                "'LISTAGG(<CHARACTER>, <CHARACTER_LITERAL>)'",
                                OperandTypes.CHARACTER,
                                OperandTypes.and(OperandTypes.CHARACTER, 
OperandTypes.LITERAL))),
                SqlFunctionCategory.SYSTEM,
                false,
                false);
    }

    @Override
    public List<RelDataType> getParameterTypes(RelDataTypeFactory typeFactory) {
        return ImmutableList.of(
                typeFactory.createTypeWithNullability(
                        typeFactory.createSqlType(SqlTypeName.VARCHAR), true));
    }

    @Override
    public RelDataType getReturnType(RelDataTypeFactory typeFactory) {
        return typeFactory.createSqlType(SqlTypeName.VARCHAR);
    }
}

{code}
started to fail with
{noformat}
Caused by: java.lang.IndexOutOfBoundsException: index (1) must be less than 
size (1)
        at 
com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1355)
        at 
com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1337)
        at 
com.google.common.collect.SingletonImmutableList.get(SingletonImmutableList.java:44)
        at 
org.apache.calcite.sql.type.FamilyOperandTypeChecker.checkSingleOperandType(FamilyOperandTypeChecker.java:68)
        at 
org.apache.calcite.sql.type.CompositeSingleOperandTypeChecker.checkSingleOperandType(CompositeSingleOperandTypeChecker.java:70)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.check(CompositeOperandTypeChecker.java:312)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.checkOperandTypes(CompositeOperandTypeChecker.java:263)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.check(CompositeOperandTypeChecker.java:345)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.checkOperandTypes(CompositeOperandTypeChecker.java:263)
        at 
org.apache.calcite.sql.SqlOperator.checkOperandTypes(SqlOperator.java:753)
        at 
org.apache.calcite.sql.SqlOperator.validateOperands(SqlOperator.java:499)
        at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:335)
        at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:231)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:6369)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:6354)
        at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:161)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1880)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1871)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:461)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:4456)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3662)
        at 
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:61)
        at 
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:88)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1061)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1036)
        at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:248)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1011)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:760)
        at 
org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:182)
        ... 44 more


{noformat}
The debugging shows that it starts failing after 
[https://github.com/apache/calcite/commit/33f4ab40bbee26e06209061c35a422f2f1e05371]

I noticed that {{iFormalOperand}} for 
{{org.apache.calcite.sql.type.SqlSingleOperandTypeChecker#checkSingleOperandType}}
 in {{org.apache.calcite.sql.type.CompositeOperandTypeChecker}} depends on rule 
class and for {{org.apache.calcite.sql.type.CompositeSingleOperandTypeChecker}} 
it does not.
After changing it in same way as for 
{{org.apache.calcite.sql.type.CompositeOperandTypeChecker}} it starts working 
again.
I mean changing this
{code:java}
rule.checkSingleOperandType(
            callBinding,
            node,
            iFormalOperand,
            true)
{code}
to
{code:java}
rule.checkSingleOperandType(
            callBinding,
            node,
            rule.getClass() == FamilyOperandTypeChecker.class ? 0 : 
iFormalOperand,
            true)
{code}
Not sure if it the right way (at least would like to double check).
Existing calcite tests are passing with this change and without.
I will see how easy it to retrieve Flink test to Calcite for that

  was:
I try to check main branch against existing Flink tests.
One of the things I faced is that existing Flink function
{code:java}
public class SqlListAggFunction extends SqlAggFunction {

    public SqlListAggFunction() {
        super(
                "LISTAGG",
                null,
                SqlKind.LISTAGG,
                ReturnTypes.ARG0_NULLABLE,
                null,
                OperandTypes.or(
                        OperandTypes.CHARACTER,
                        OperandTypes.sequence(
                                "'LISTAGG(<CHARACTER>, <CHARACTER_LITERAL>)'",
                                OperandTypes.CHARACTER,
                                OperandTypes.and(OperandTypes.CHARACTER, 
OperandTypes.LITERAL))),
                SqlFunctionCategory.SYSTEM,
                false,
                false);
    }

    @Override
    public List<RelDataType> getParameterTypes(RelDataTypeFactory typeFactory) {
        return ImmutableList.of(
                typeFactory.createTypeWithNullability(
                        typeFactory.createSqlType(SqlTypeName.VARCHAR), true));
    }

    @Override
    public RelDataType getReturnType(RelDataTypeFactory typeFactory) {
        return typeFactory.createSqlType(SqlTypeName.VARCHAR);
    }
}

{code}
started to fail with
{noformat}
Caused by: java.lang.IndexOutOfBoundsException: index (1) must be less than 
size (1)
        at 
com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1355)
        at 
com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1337)
        at 
com.google.common.collect.SingletonImmutableList.get(SingletonImmutableList.java:44)
        at 
org.apache.calcite.sql.type.FamilyOperandTypeChecker.checkSingleOperandType(FamilyOperandTypeChecker.java:68)
        at 
org.apache.calcite.sql.type.CompositeSingleOperandTypeChecker.checkSingleOperandType(CompositeSingleOperandTypeChecker.java:70)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.check(CompositeOperandTypeChecker.java:312)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.checkOperandTypes(CompositeOperandTypeChecker.java:263)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.check(CompositeOperandTypeChecker.java:345)
        at 
org.apache.calcite.sql.type.CompositeOperandTypeChecker.checkOperandTypes(CompositeOperandTypeChecker.java:263)
        at 
org.apache.calcite.sql.SqlOperator.checkOperandTypes(SqlOperator.java:753)
        at 
org.apache.calcite.sql.SqlOperator.validateOperands(SqlOperator.java:499)
        at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:335)
        at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:231)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:6369)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:6354)
        at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:161)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1880)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1871)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:461)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:4456)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3662)
        at 
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:61)
        at 
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:88)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1061)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1036)
        at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:248)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1011)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:760)
        at 
org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:182)
        ... 44 more


{noformat}
The debugging shows that it starts failing after 
[https://github.com/apache/calcite/commit/33f4ab40bbee26e06209061c35a422f2f1e05371]

I noticed that {{iFormalOperand}} for 
{{org.apache.calcite.sql.type.SqlSingleOperandTypeChecker#checkSingleOperandType}}
 in {{org.apache.calcite.sql.type.CompositeOperandTypeChecker}} depends on rule 
class and for {{org.apache.calcite.sql.type.CompositeSingleOperandTypeChecker}} 
it does not.
After changing it in same way as for 
{{org.apache.calcite.sql.type.CompositeOperandTypeChecker}} it starts working 
again.
Not sure if it the right way (at least would like to double check).
Existing calcite tests are passing with this change and without.
I will see how easy it to retrieve Flink test to Calcite for that


> CompositeSingleOperandTypeChecker fails with index (1) must be less than size 
> (1)
> ---------------------------------------------------------------------------------
>
>                 Key: CALCITE-5380
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5380
>             Project: Calcite
>          Issue Type: Improvement
>          Components: core
>    Affects Versions: 1.33.0
>            Reporter: Sergey Nuyanzin
>            Priority: Major
>
> I try to check main branch against existing Flink tests.
> One of the things I faced is that existing Flink function
> {code:java}
> public class SqlListAggFunction extends SqlAggFunction {
>     public SqlListAggFunction() {
>         super(
>                 "LISTAGG",
>                 null,
>                 SqlKind.LISTAGG,
>                 ReturnTypes.ARG0_NULLABLE,
>                 null,
>                 OperandTypes.or(
>                         OperandTypes.CHARACTER,
>                         OperandTypes.sequence(
>                                 "'LISTAGG(<CHARACTER>, <CHARACTER_LITERAL>)'",
>                                 OperandTypes.CHARACTER,
>                                 OperandTypes.and(OperandTypes.CHARACTER, 
> OperandTypes.LITERAL))),
>                 SqlFunctionCategory.SYSTEM,
>                 false,
>                 false);
>     }
>     @Override
>     public List<RelDataType> getParameterTypes(RelDataTypeFactory 
> typeFactory) {
>         return ImmutableList.of(
>                 typeFactory.createTypeWithNullability(
>                         typeFactory.createSqlType(SqlTypeName.VARCHAR), 
> true));
>     }
>     @Override
>     public RelDataType getReturnType(RelDataTypeFactory typeFactory) {
>         return typeFactory.createSqlType(SqlTypeName.VARCHAR);
>     }
> }
> {code}
> started to fail with
> {noformat}
> Caused by: java.lang.IndexOutOfBoundsException: index (1) must be less than 
> size (1)
>       at 
> com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1355)
>       at 
> com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:1337)
>       at 
> com.google.common.collect.SingletonImmutableList.get(SingletonImmutableList.java:44)
>       at 
> org.apache.calcite.sql.type.FamilyOperandTypeChecker.checkSingleOperandType(FamilyOperandTypeChecker.java:68)
>       at 
> org.apache.calcite.sql.type.CompositeSingleOperandTypeChecker.checkSingleOperandType(CompositeSingleOperandTypeChecker.java:70)
>       at 
> org.apache.calcite.sql.type.CompositeOperandTypeChecker.check(CompositeOperandTypeChecker.java:312)
>       at 
> org.apache.calcite.sql.type.CompositeOperandTypeChecker.checkOperandTypes(CompositeOperandTypeChecker.java:263)
>       at 
> org.apache.calcite.sql.type.CompositeOperandTypeChecker.check(CompositeOperandTypeChecker.java:345)
>       at 
> org.apache.calcite.sql.type.CompositeOperandTypeChecker.checkOperandTypes(CompositeOperandTypeChecker.java:263)
>       at 
> org.apache.calcite.sql.SqlOperator.checkOperandTypes(SqlOperator.java:753)
>       at 
> org.apache.calcite.sql.SqlOperator.validateOperands(SqlOperator.java:499)
>       at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:335)
>       at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:231)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:6369)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:6354)
>       at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:161)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1880)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1871)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:461)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:4456)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3662)
>       at 
> org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:61)
>       at 
> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:88)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1061)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1036)
>       at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:248)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1011)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:760)
>       at 
> org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:182)
>       ... 44 more
> {noformat}
> The debugging shows that it starts failing after 
> [https://github.com/apache/calcite/commit/33f4ab40bbee26e06209061c35a422f2f1e05371]
> I noticed that {{iFormalOperand}} for 
> {{org.apache.calcite.sql.type.SqlSingleOperandTypeChecker#checkSingleOperandType}}
>  in {{org.apache.calcite.sql.type.CompositeOperandTypeChecker}} depends on 
> rule class and for 
> {{org.apache.calcite.sql.type.CompositeSingleOperandTypeChecker}} it does not.
> After changing it in same way as for 
> {{org.apache.calcite.sql.type.CompositeOperandTypeChecker}} it starts working 
> again.
> I mean changing this
> {code:java}
> rule.checkSingleOperandType(
>             callBinding,
>             node,
>             iFormalOperand,
>             true)
> {code}
> to
> {code:java}
> rule.checkSingleOperandType(
>             callBinding,
>             node,
>             rule.getClass() == FamilyOperandTypeChecker.class ? 0 : 
> iFormalOperand,
>             true)
> {code}
> Not sure if it the right way (at least would like to double check).
> Existing calcite tests are passing with this change and without.
> I will see how easy it to retrieve Flink test to Calcite for that



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to