Vova Vysotskyi created CALCITE-3835:
---------------------------------------
Summary: Overloaded table functions fail with an assertion error
if param types differ
Key: CALCITE-3835
URL: https://issues.apache.org/jira/browse/CALCITE-3835
Project: Calcite
Issue Type: Bug
Reporter: Vova Vysotskyi
Assignee: Vova Vysotskyi
Fix For: 1.23.0
For the case of using named parameters in table functions, when several table
functions with the same name, but with different argument types, query with
such function fails with an assertion error.
For example, the following table functions:
{{View(String R, String S, Integer T)}} and {{View(String R, String S, Integer
T, String S2)}}
will fail with assertion error for the following query:
{code:sql}
select * from table("adhoc"."View"(t=>5, s=>'6'))
{code}
with error:
{noformat}
VARCHAR
java.lang.AssertionError: VARCHAR
at
org.apache.calcite.sql.type.SqlTypeExplicitPrecedenceList.compareTypePrecedence(SqlTypeExplicitPrecedenceList.java:139)
at org.apache.calcite.sql.SqlUtil.bestMatch(SqlUtil.java:691)
at
org.apache.calcite.sql.SqlUtil.filterRoutinesByTypePrecedence(SqlUtil.java:660)
at
org.apache.calcite.sql.SqlUtil.lookupSubjectRoutines(SqlUtil.java:519)
at org.apache.calcite.sql.SqlUtil.lookupRoutine(SqlUtil.java:439)
at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:240)
at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:218)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:5854)
at
org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:5841)
at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:139)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1800)
at
org.apache.calcite.sql.validate.ProcedureNamespace.validateImpl(ProcedureNamespace.java:53)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1110)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1084)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3256)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3238)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3510)
at
org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
at
org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1110)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1084)
at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:232)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1059)
at
org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:766)
at
org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:565)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:241)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:207)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:634)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:498)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:468)
at
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:231)
at
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:550)
at
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675)
at
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)
at
org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227)
at
org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:533)
at
org.apache.calcite.test.CalciteAssert$AssertQuery.lambda$returns$1(CalciteAssert.java:1519)
at
org.apache.calcite.test.CalciteAssert$AssertQuery.withConnection(CalciteAssert.java:1451)
at
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1517)
at
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1500)
at
org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1463)
at
org.apache.calcite.test.JdbcTest.testTableMacroWithNamedParameters(JdbcTest.java:546)
{noformat}
The issue here is that {{SqlUtil.filterRoutinesByTypePrecedence()}} assumes
that all functions will have the same type at the same position, but table
functions allow omitting arguments or flipping them.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)