Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-3018

User defined scalar function which returns a Date/Timestamp value causes error.

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.19.0
    • None
    • core
    • None

    Description

      I've defined a user defined function that returns a date or timestamp and register it on root schema :

          public static java.sql.Date test(long value) {
              return new java.sql.Date(value);
          }

       

          rootSchema.add("my_test", ScalarFunctionImpl.create(CalciteTest.class, "test")); 

       

      If I use this function in the select part of a query as the only column, the result works fine:

          select my_test(1)  from northwind.product

      However, if I add an additional column in the select part, the error occurs:

          select my_test(1), 2  from northwind.product

      Error message:

       

       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)

       

       I tried with calcite.debug=true, and the difference seems as follows:

      • 1 column

       

      /*  51 */             public Object current() {
      /*  52 */               return org.apache.calcite.runtime.SqlFunctions.toIntOptional(CalciteTest.test(1));
      /*  53 */             }

       

      • 2 columns
      /*  51 */             public Object current() {
      /*  52 */               return new Object[] {
      /*  53 */                   CalciteTest.test(1),
      /*  54 */                   2};
      /*  55 */             }

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            fangyc Yincheng Fang

            Dates

              Created:
              Updated:

              Slack

                Issue deployment