Aleksey Plekhanov created IGNITE-27364:
------------------------------------------

             Summary: Calcite engine. Overriden function with null throws an 
error
                 Key: IGNITE-27364
                 URL: https://issues.apache.org/jira/browse/IGNITE-27364
             Project: Ignite
          Issue Type: Bug
            Reporter: Aleksey Plekhanov
            Assignee: Aleksey Plekhanov


Function, which overrides in custom schema function declared in PUBLIC schema 
throws an error if parameter is null.

Reproducer:
{code:java}
@Test
public void testFunctionOverriding() throws Exception {
    IgniteCache<Integer, Employer> cache = client.getOrCreateCache(new 
CacheConfiguration<Integer, Employer>("TEST")
            .setSqlFunctionClasses(FunctionLibrary.class));

    assertEquals(0, cache.query(new SqlFieldsQuery("SELECT 
UPPER(null)")).getAll().get(0).get(0));
}

public static class FunctionLibrary {
    @QuerySqlFunction
    public static int upper(String s) {
        return 0;
    }
} {code}
Throws an error:
{noformat}
java.lang.AssertionError        at 
org.apache.calcite.rel.type.RelDataTypeImpl$1.compareTypePrecedence(RelDataTypeImpl.java:342)
        at 
org.apache.calcite.sql.SqlUtil.lambda$filterRoutinesByTypePrecedence$6(SqlUtil.java:764)
     at 
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
  at 
java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
     at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) 
     at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
       at 
java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
 at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
     at 
java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
     at 
org.apache.calcite.sql.SqlUtil.filterRoutinesByTypePrecedence(SqlUtil.java:766) 
     at org.apache.calcite.sql.SqlUtil.lookupSubjectRoutines(SqlUtil.java:583)  
     at org.apache.calcite.sql.SqlUtil.lookupRoutine(SqlUtil.java:502)       at 
org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:255)  at 
org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:232)  at 
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:7100)
 at 
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:7087)
 at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)      at 
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:2034)
  at 
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:2021)
      at 
org.apache.ignite.internal.processors.query.calcite.prepare.IgniteSqlValidator.deriveType(IgniteSqlValidator.java:557)
       at 
org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:513)
 at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:5148)
      at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:4140)
  at 
org.apache.ignite.internal.processors.query.calcite.prepare.IgniteSqlValidator.validateSelect(IgniteSqlValidator.java:242)
   at 
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:62)
        at 
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:96)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1214)
       at 
org.apache.ignite.internal.processors.query.calcite.prepare.IgniteSqlValidator.validateNamespace(IgniteSqlValidator.java:256)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1185)
   at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:282)        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1151)
        at 
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:857)
 at 
org.apache.ignite.internal.processors.query.calcite.prepare.IgnitePlanner.validateAndGetTypeMetadata(IgnitePlanner.java:255){noformat}



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

Reply via email to