[ 
https://issues.apache.org/jira/browse/CALCITE-3424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16954335#comment-16954335
 ] 

Wang Yanlin commented on CALCITE-3424:
--------------------------------------

The difference for *Object* and *List* lies in 
https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java#L375

For Object type, it uses *SqlTypeName.ANY*

> AssertionError thrown for user-defined table function with array argument
> -------------------------------------------------------------------------
>
>                 Key: CALCITE-3424
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3424
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.21.0
>            Reporter: Igor Guzenko
>            Assignee: Igor Guzenko
>            Priority: Major
>
> *Steps to reproduce:*
> *1.* Add method with list parameter to Smalls.java
> {code:java}
>   public static final Method GENERATE_STRINGS_2_METHOD =
>       Types.lookupMethod(Smalls.class, "generateStrings2", List.class);
>   public static QueryableTable generateStrings2(final List<Integer> list) {
>     return generateStrings(list.size());
>   }
> {code}
> *2.* Add test method which uses new user-defined table function to 
> TableFunctionTest.java
> {code:java}
>   @Test public void testTableFunction2() throws SQLException {
>     try (Connection connection = 
> DriverManager.getConnection("jdbc:calcite:")) {
>       CalciteConnection calciteConnection =
>           connection.unwrap(CalciteConnection.class);
>       SchemaPlus rootSchema = calciteConnection.getRootSchema();
>       SchemaPlus schema = rootSchema.add("s", new AbstractSchema());
>       final TableFunction table =
>           TableFunctionImpl.create(Smalls.GENERATE_STRINGS_2_METHOD);
>       schema.add("GenerateStrings2", table);
>       final String sql = "select *\n"
>           + "from table(\"s\".\"GenerateStrings2\"(5,4,3,1,2)) as t(n, c)\n"
>           + "where char_length(c) > 3";
>       ResultSet resultSet = connection.createStatement().executeQuery(sql);
>       assertThat(CalciteAssert.toString(resultSet),
>           equalTo("N=4; C=abcd\n"));
>     }
>   }
> {code}
> Execution result produced by such test method is the following stack trace:
> {code:none}
> java.lang.AssertionError: use createArrayType() instead
>       at 
> org.apache.calcite.sql.type.SqlTypeFactoryImpl.assertBasic(SqlTypeFactoryImpl.java:221)
>       at 
> org.apache.calcite.sql.type.SqlTypeFactoryImpl.createSqlType(SqlTypeFactoryImpl.java:48)
>       at 
> org.apache.calcite.jdbc.JavaTypeFactoryImpl.toSql(JavaTypeFactoryImpl.java:255)
>       at 
> org.apache.calcite.prepare.CalciteCatalogReader.toSql(CalciteCatalogReader.java:381)
>       at 
> org.apache.calcite.prepare.CalciteCatalogReader.lambda$toSql$7(CalciteCatalogReader.java:370)
>       at 
> com.google.common.collect.Lists$TransformingRandomAccessList$1.transform(Lists.java:640)
>       at 
> com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
>       at java.util.AbstractCollection.toArray(AbstractCollection.java:141)
>       at 
> com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:239)
>       at org.apache.calcite.sql.SqlFunction.<init>(SqlFunction.java:123)
>       at 
> org.apache.calcite.sql.validate.SqlUserDefinedFunction.<init>(SqlUserDefinedFunction.java:63)
>       at 
> org.apache.calcite.sql.validate.SqlUserDefinedTableFunction.<init>(SqlUserDefinedTableFunction.java:45)
>       at 
> org.apache.calcite.prepare.CalciteCatalogReader.toOp(CalciteCatalogReader.java:338)
>       at 
> org.apache.calcite.prepare.CalciteCatalogReader.toOp(CalciteCatalogReader.java:302)
>       at 
> org.apache.calcite.prepare.CalciteCatalogReader.lambda$lookupOperatorOverloads$3(CalciteCatalogReader.java:271)
>       at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>       at 
> java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
>       at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>       at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>       at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>       at 
> java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
>       at 
> java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
>       at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>       at 
> java.util.stream.ReferencePipeline.forEachOrdered(ReferencePipeline.java:490)
>       at 
> org.apache.calcite.prepare.CalciteCatalogReader.lookupOperatorOverloads(CalciteCatalogReader.java:272)
>       at 
> org.apache.calcite.sql.util.ChainedSqlOperatorTable.lookupOperatorOverloads(ChainedSqlOperatorTable.java:73)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.performUnconditionalRewrites(SqlValidatorImpl.java:1195)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.performUnconditionalRewrites(SqlValidatorImpl.java:1180)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.performUnconditionalRewrites(SqlValidatorImpl.java:1180)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.performUnconditionalRewrites(SqlValidatorImpl.java:1180)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:937)
>       at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:651)
>       at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:558)
>       at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:265)
>       at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:231)
>       at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:638)
>       at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:502)
>       at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:472)
>       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.TableFunctionTest.testTableFunction2(TableFunctionTest.java:120)
> {code}
> *Tip:* In scope of CALCITE-3238 was added new assertion to 
> *_SqlTypeFactoryImpl.assertBasic(...)_* method, and now this check can't be 
>  ignored inside _*JavaTypeFactoryImpl.toSql(typeFactory, type)*_ static 
> method.



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

Reply via email to