[ https://issues.apache.org/jira/browse/CALCITE-3018?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16825093#comment-16825093 ]
pengzhiwei edited comment on CALCITE-3018 at 4/24/19 12:47 PM: --------------------------------------------------------------- It seems that the execute result type is not match with the _ColumnMetaData.type.rep_ in the case: {code:java} select my_date_func(1),1 from xx; {code} The _EnumerableCalc_ will translate the _outputJavaType_ of the "select" to Object[].class, and the execute result type of my_date_func(1) will be "Date". However, the _ColumnMetaData.type.rep_ is a Integer type and a DateFromNumberAccessor was created as the following code which leading to this exception. {code:java} protected Accessor createAccessor(ColumnMetaData columnMetaData,... ...) { +140 case Types.DATE: +141 switch (columnMetaData.type.rep) { +142 case PRIMITIVE_INT: case INTEGER: case NUMBER: return new DateFromNumberAccessor(getter, localCalendar); case JAVA_SQL_DATE: return new DateAccessor(getter); default: throw new AssertionError("bad " + columnMetaData.type.rep); } {code} In another case: {code:java} select my_date_func(1) from xx; {code} The _EnumerableCalc_ translate the _outputJavaType of the "select" to "Integer",_ which is match with the _ColumnMetaData.type.rep._ So it can pass the test. was (Author: pzw2018): It seems that the execute result type is not match with the _ColumnMetaData.type.rep_ in the case: {code:java} select my_date_func(1),1 from xx; {code} The _EnumerableCalc_ will translate the _outputJavaType_ of the "select" to Object[].class, and the execute result type of my_date_func(1) will be "Date". However, the _ColumnMetaData.type.rep_ is a Integer type, which leading to this exception. {code:java} rotected Accessor createAccessor(ColumnMetaData columnMetaData,... ...) { +140 case Types.DATE: +141 switch (columnMetaData.type.rep) { +142 case PRIMITIVE_INT: case INTEGER: case NUMBER: return new DateFromNumberAccessor(getter, localCalendar); case JAVA_SQL_DATE: return new DateAccessor(getter); default: throw new AssertionError("bad " + columnMetaData.type.rep); } {code} In another case: {code:java} select my_date_func(1) from xx; {code} The _EnumerableCalc_ translate the _outputJavaType of the "select" to "Integer",_ which is match with the _ColumnMetaData.type.rep._ So it can pass the test. > User defined scalar function which returns a Date/Timestamp value causes > error. > ------------------------------------------------------------------------------- > > Key: CALCITE-3018 > URL: https://issues.apache.org/jira/browse/CALCITE-3018 > Project: Calcite > Issue Type: Bug > Components: core > Affects Versions: 1.19.0 > Reporter: fangyc > Priority: Major > > I've defined a user defined function that returns a date or timestamp and > register it on root schema : > {quote} public static java.sql.Date test(long value) { > return new java.sql.Date(value); > } > {quote} > > {quote}rootSchema.add("my_test", ScalarFunctionImpl.create(CalciteTest.class, > "test")); > {quote} > If I use this function in the select part of a query as the only column, the > result works fine: > {quote}select my_test(1) from northwind.product > {quote} > However, if I add an additional column in the select part, the error occurs: > {quote}select my_test(1), 2 from northwind.product > {quote} > Error message: > {quote} Exception in thread "main" java.lang.ClassCastException: > java.sql.Date cannot be cast to java.lang.Number > at > org.apache.calcite.avatica.util.AbstractCursor$NumberAccessor.getNumber(AbstractCursor.java:726) > at > org.apache.calcite.avatica.util.AbstractCursor$DateFromNumberAccessor.getDate(AbstractCursor.java:915) > at org.apache.calcite.avatica.AvaticaSite.get(AvaticaSite.java:326) > at > org.apache.calcite.avatica.AvaticaResultSet.getObject(AvaticaResultSet.java:393) > {quote} > > I tried with calcite.debug=true, and the difference seems as follows: > * 1 column > {quote}/* 51 */ public Object current() { > /* 52 */ return > org.apache.calcite.runtime.SqlFunctions.toIntOptional(CalciteTest.test(1)); > /* 53 */ } > {quote} * 2 columns > {quote}/* 51 */ public Object current() { > /* 52 */ return new Object[] { > /* 53 */ CalciteTest.test(1), > /* 54 */ 2}; > /* 55 */ } > {quote} -- This message was sent by Atlassian JIRA (v7.6.3#76005)