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

Average aggregation on an Integer column throws java.lang.ClassCastException

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.1.0-incubating
    • Component/s: None
    • Labels:
      None

      Description

      There are 2 Integer columns: a, c in table abc.

      While running the following sql, it throw the ClassCastException:
      select a, avg(c) as agg from abc group by a

      Exception in thread "main" java.lang.ClassCastException: java.lang.Long incompatible with java.lang.Integer
      at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:460)
      at org.apache.calcite.avatica.AvaticaResultSet.getInt(AvaticaResultSet.java:311)

      The generated code that I think causing the issue, it try to cast the result to long.
      public Object current() {
      final Object[] current = (Object[]) inputEnumerator.current();
      return new Object[]

      { current[0], (long) org.apache.calcite.runtime.SqlFunctions.toInt(current[1]) / org.apache.calcite.runtime.SqlFunctions.toLong(current[2])}

      ;
      }

        Activity

        Hide
        vladimirsitnikov Vladimir Sitnikov added a comment -

        Offending code is in org.apache.calcite.adapter.enumerable.JavaRowFormat#record:

            public Expression record(Type javaRowClass, List<Expression> expressions) {
              return Expressions.newArrayInit(
                  Object.class, stripCasts(expressions)); // stripCasts kills {{(int)}} cast.
            }
        
        Show
        vladimirsitnikov Vladimir Sitnikov added a comment - Offending code is in org.apache.calcite.adapter.enumerable.JavaRowFormat#record : public Expression record(Type javaRowClass, List<Expression> expressions) { return Expressions.newArrayInit( Object .class, stripCasts(expressions)); // stripCasts kills {{( int )}} cast . }
        Hide
        vladimirsitnikov Vladimir Sitnikov added a comment -

        I believe that stripCasts is no longer required, so need to just remove it.

        org.apache.calcite.test.ReflectiveSchemaTest#checkAgg should be updated to catch this case.
        It already checks different types of aggregates, but:
        1) it does not check results that returns non-scalar result (e.g. multiple columns)
        2) it does not check if the resulting data works.

        Show
        vladimirsitnikov Vladimir Sitnikov added a comment - I believe that stripCasts is no longer required, so need to just remove it. org.apache.calcite.test.ReflectiveSchemaTest#checkAgg should be updated to catch this case. It already checks different types of aggregates, but: 1) it does not check results that returns non-scalar result (e.g. multiple columns) 2) it does not check if the resulting data works.
        Hide
        julianhyde Julian Hyde added a comment -

        I cannot reproduce this. What kind of table? Do you have code that reproduces this?

        Show
        julianhyde Julian Hyde added a comment - I cannot reproduce this. What kind of table? Do you have code that reproduces this?
        Hide
        vladimirsitnikov Vladimir Sitnikov added a comment -

        Julian Hyde, to observe the issue, you need to call resultSet.getInt(..).

        Here's sample (CalciteAssert.assertArrayEqual is from https://github.com/vlsi/incubator-calcite/commit/9103ab012e84eb76c0296710ac35667934f9191a):

          @Test public void testAvgInt() throws Exception {
            final CalciteAssert.AssertThat with =
                CalciteAssert.that().withSchema("s", CATCHALL).with(Lex.JAVA);
            with
                .query("select primitiveLong, avg(primitiveInt)"
                    + " from s.everyTypes group by primitiveLong order by primitiveLong")
                .returns(new Function<ResultSet, Void>() {
                  public Void apply(ResultSet input) {
                    ArrayList<Integer> res = new ArrayList<Integer>();
                    try {
                      while(input.next()) {
                        res.add(input.getInt(2));
                      }
                    } catch (SQLException e) {
                      throw new AssertionError(
                          "Unable to process results: " + e.getMessage(), e);
                    }
                    CalciteAssert.assertArrayEqual(
                        "result", res.toArray(), new Integer[]{0, 2147483647});
                    return null;
                  }
                });
          }
        
        /*   1 */ public static class Record2_0 implements java.io.Serializable {
        /*   2 */   public int f0;
        /*   3 */   public long f1;
        /*   4 */   public Record2_0(int f0, long f1) {
        /*   5 */     this.f0 = f0;
        /*   6 */     this.f1 = f1;
        /*   7 */   }
        /*   8 */ 
        /*   9 */   public boolean equals(Object o) {
        /*  10 */     if (this == o) {
        /*  11 */       return true;
        /*  12 */     }
        /*  13 */     if (!(o instanceof Record2_0)) {
        /*  14 */       return false;
        /*  15 */     }
        /*  16 */     return this.f0 == ((Record2_0) o).f0 && this.f1 == ((Record2_0) o).f1;
        /*  17 */   }
        /*  18 */ 
        /*  19 */   public int hashCode() {
        /*  20 */     int h = 0;
        /*  21 */     h = org.apache.calcite.runtime.Utilities.hash(h, this.f0);
        /*  22 */     h = org.apache.calcite.runtime.Utilities.hash(h, this.f1);
        /*  23 */     return h;
        /*  24 */   }
        /*  25 */ 
        /*  26 */   public int compareTo(Record2_0 that) {
        /*  27 */     int c;
        /*  28 */     c = org.apache.calcite.runtime.Utilities.compare(this.f0, that.f0);
        /*  29 */     if (c != 0) {
        /*  30 */       return c;
        /*  31 */     }
        /*  32 */     c = org.apache.calcite.runtime.Utilities.compare(this.f1, that.f1);
        /*  33 */     if (c != 0) {
        /*  34 */       return c;
        /*  35 */     }
        /*  36 */     return 0;
        /*  37 */   }
        /*  38 */ 
        /*  39 */   public String toString() {
        /*  40 */     return "{f0=" + this.f0 + ", f1=" + this.f1 + "}";
        /*  41 */   }
        /*  42 */ 
        /*  43 */ }
        /*  44 */ 
        /*  45 */ org.apache.calcite.DataContext root;
        /*  46 */ 
        /*  47 */ public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root0) {
        /*  48 */   root = root0;
        /*  49 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(((org.apache.calcite.test.ReflectiveSchemaTest.CatchallSchema) ((org.apache.calcite.adapter.java.ReflectiveSchema) root.getRootSchema().getSubSchema("s").unwrap(org.apache.calcite.adapter.java.ReflectiveSchema.class)).getTarget()).everyTypes);
        /*  50 */   final org.apache.calcite.linq4j.AbstractEnumerable child = new org.apache.calcite.linq4j.AbstractEnumerable(){
        /*  51 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
        /*  52 */       return new org.apache.calcite.linq4j.Enumerator(){
        /*  53 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable.enumerator();
        /*  54 */           public void reset() {
        /*  55 */             inputEnumerator.reset();
        /*  56 */           }
        /*  57 */ 
        /*  58 */           public boolean moveNext() {
        /*  59 */             return inputEnumerator.moveNext();
        /*  60 */           }
        /*  61 */ 
        /*  62 */           public void close() {
        /*  63 */             inputEnumerator.close();
        /*  64 */           }
        /*  65 */ 
        /*  66 */           public Object current() {
        /*  67 */             final org.apache.calcite.test.ReflectiveSchemaTest.EveryType current = (org.apache.calcite.test.ReflectiveSchemaTest.EveryType) inputEnumerator.current();
        /*  68 */             return new Object[] {
        /*  69 */                 current.primitiveLong,
        /*  70 */                 current.primitiveInt};
        /*  71 */           }
        /*  72 */ 
        /*  73 */         };
        /*  74 */     }
        /*  75 */ 
        /*  76 */   };
        /*  77 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable0 = child.groupBy(new org.apache.calcite.linq4j.function.Function1() {
        /*  78 */     public long apply(Object[] a0) {
        /*  79 */       return org.apache.calcite.runtime.SqlFunctions.toLong(a0[0]);
        /*  80 */     }
        /*  81 */     public Object apply(Object a0) {
        /*  82 */       return apply(
        /*  83 */         (Object[]) a0);
        /*  84 */     }
        /*  85 */   }
        /*  86 */   , new org.apache.calcite.linq4j.function.Function0() {
        /*  87 */     public Object apply() {
        /*  88 */       int $SUM0a0s0;
        /*  89 */       $SUM0a0s0 = 0;
        /*  90 */       long COUNTa1s0;
        /*  91 */       COUNTa1s0 = 0L;
        /*  92 */       return new Record2_0(
        /*  93 */           $SUM0a0s0,
        /*  94 */           COUNTa1s0);
        /*  95 */     }
        /*  96 */   }
        /*  97 */   , new org.apache.calcite.linq4j.function.Function2() {
        /*  98 */     public Record2_0 apply(Record2_0 acc, Object[] in) {
        /*  99 */       acc.f0 = acc.f0 + org.apache.calcite.runtime.SqlFunctions.toInt(in[1]);
        /* 100 */       acc.f1++;
        /* 101 */       return acc;
        /* 102 */     }
        /* 103 */     public Record2_0 apply(Object acc, Object in) {
        /* 104 */       return apply(
        /* 105 */         (Record2_0) acc,
        /* 106 */         (Object[]) in);
        /* 107 */     }
        /* 108 */   }
        /* 109 */   , new org.apache.calcite.linq4j.function.Function2() {
        /* 110 */     public Object[] apply(long key, Record2_0 acc) {
        /* 111 */       return new Object[] {
        /* 112 */           key,
        /* 113 */           acc.f0,
        /* 114 */           acc.f1};
        /* 115 */     }
        /* 116 */     public Object[] apply(Long key, Record2_0 acc) {
        /* 117 */       return apply(
        /* 118 */         key.longValue(),
        /* 119 */         acc);
        /* 120 */     }
        /* 121 */     public Object[] apply(Object key, Object acc) {
        /* 122 */       return apply(
        /* 123 */         (Long) key,
        /* 124 */         (Record2_0) acc);
        /* 125 */     }
        /* 126 */   }
        /* 127 */   );
        /* 128 */   final org.apache.calcite.linq4j.AbstractEnumerable child0 = new org.apache.calcite.linq4j.AbstractEnumerable(){
        /* 129 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
        /* 130 */       return new org.apache.calcite.linq4j.Enumerator(){
        /* 131 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable0.enumerator();
        /* 132 */           public void reset() {
        /* 133 */             inputEnumerator.reset();
        /* 134 */           }
        /* 135 */ 
        /* 136 */           public boolean moveNext() {
        /* 137 */             return inputEnumerator.moveNext();
        /* 138 */           }
        /* 139 */ 
        /* 140 */           public void close() {
        /* 141 */             inputEnumerator.close();
        /* 142 */           }
        /* 143 */ 
        /* 144 */           public Object current() {
        /* 145 */             final Object[] current = (Object[]) inputEnumerator.current();
        /* 146 */             return new Object[] {
        /* 147 */                 current[0],
        /* 148 */                 (long) org.apache.calcite.runtime.SqlFunctions.toInt(current[1]) / org.apache.calcite.runtime.SqlFunctions.toLong(current[2])};
        /* 149 */           }
        /* 150 */ 
        /* 151 */         };
        /* 152 */     }
        /* 153 */ 
        /* 154 */   };
        /* 155 */   return child0.orderBy(new org.apache.calcite.linq4j.function.Function1() {
        /* 156 */       public long apply(Object[] v) {
        /* 157 */         return org.apache.calcite.runtime.SqlFunctions.toLong(v[0]);
        /* 158 */       }
        /* 159 */       public Object apply(Object v) {
        /* 160 */         return apply(
        /* 161 */           (Object[]) v);
        /* 162 */       }
        /* 163 */     }
        /* 164 */     , org.apache.calcite.linq4j.function.Functions.nullsComparator(false, false));
        /* 165 */ }
        /* 166 */ 
        /* 167 */ 
        /* 168 */ public Class getElementType() {
        /* 169 */   return java.lang.Object[].class;
        /* 170 */ }
        /* 171 */ 
        /* 172 */ 
        java.lang.RuntimeException: exception while executing [select primitiveLong, avg(primitiveInt) from s.everyTypes group by primitiveLong order by primitiveLong]
        	at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1148)
        	at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1138)
        	at org.apache.calcite.test.ReflectiveSchemaTest.testAvgInt(ReflectiveSchemaTest.java:338)
        	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
        	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
        	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
        	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
        	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
        	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
        	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
        	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
        Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
        	at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:460)
        	at org.apache.calcite.avatica.AvaticaResultSet.getInt(AvaticaResultSet.java:246)
        	at org.apache.calcite.test.ReflectiveSchemaTest$1.apply(ReflectiveSchemaTest.java:343)
        	at org.apache.calcite.test.ReflectiveSchemaTest$1.apply(ReflectiveSchemaTest.java:338)
        	at org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:466)
        	at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1144)
        	... 28 more
        Show
        vladimirsitnikov Vladimir Sitnikov added a comment - Julian Hyde , to observe the issue, you need to call resultSet.getInt(..) . Here's sample (CalciteAssert.assertArrayEqual is from https://github.com/vlsi/incubator-calcite/commit/9103ab012e84eb76c0296710ac35667934f9191a): @Test public void testAvgInt() throws Exception { final CalciteAssert.AssertThat with = CalciteAssert.that().withSchema( "s" , CATCHALL).with(Lex.JAVA); with .query( "select primitiveLong, avg(primitiveInt)" + " from s.everyTypes group by primitiveLong order by primitiveLong" ) .returns( new Function<ResultSet, Void >() { public Void apply(ResultSet input) { ArrayList< Integer > res = new ArrayList< Integer >(); try { while (input.next()) { res.add(input.getInt(2)); } } catch (SQLException e) { throw new AssertionError( "Unable to process results: " + e.getMessage(), e); } CalciteAssert.assertArrayEqual( "result" , res.toArray(), new Integer []{0, 2147483647}); return null ; } }); } /* 1 */ public static class Record2_0 implements java.io.Serializable { /* 2 */ public int f0; /* 3 */ public long f1; /* 4 */ public Record2_0(int f0, long f1) { /* 5 */ this.f0 = f0; /* 6 */ this.f1 = f1; /* 7 */ } /* 8 */ /* 9 */ public boolean equals(Object o) { /* 10 */ if (this == o) { /* 11 */ return true; /* 12 */ } /* 13 */ if (!(o instanceof Record2_0)) { /* 14 */ return false; /* 15 */ } /* 16 */ return this.f0 == ((Record2_0) o).f0 && this.f1 == ((Record2_0) o).f1; /* 17 */ } /* 18 */ /* 19 */ public int hashCode() { /* 20 */ int h = 0; /* 21 */ h = org.apache.calcite.runtime.Utilities.hash(h, this.f0); /* 22 */ h = org.apache.calcite.runtime.Utilities.hash(h, this.f1); /* 23 */ return h; /* 24 */ } /* 25 */ /* 26 */ public int compareTo(Record2_0 that) { /* 27 */ int c; /* 28 */ c = org.apache.calcite.runtime.Utilities.compare(this.f0, that.f0); /* 29 */ if (c != 0) { /* 30 */ return c; /* 31 */ } /* 32 */ c = org.apache.calcite.runtime.Utilities.compare(this.f1, that.f1); /* 33 */ if (c != 0) { /* 34 */ return c; /* 35 */ } /* 36 */ return 0; /* 37 */ } /* 38 */ /* 39 */ public String toString() { /* 40 */ return "{f0=" + this.f0 + ", f1=" + this.f1 + "}"; /* 41 */ } /* 42 */ /* 43 */ } /* 44 */ /* 45 */ org.apache.calcite.DataContext root; /* 46 */ /* 47 */ public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root0) { /* 48 */ root = root0; /* 49 */ final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(((org.apache.calcite.test.ReflectiveSchemaTest.CatchallSchema) ((org.apache.calcite.adapter.java.ReflectiveSchema) root.getRootSchema().getSubSchema("s").unwrap(org.apache.calcite.adapter.java.ReflectiveSchema.class)).getTarget()).everyTypes); /* 50 */ final org.apache.calcite.linq4j.AbstractEnumerable child = new org.apache.calcite.linq4j.AbstractEnumerable(){ /* 51 */ public org.apache.calcite.linq4j.Enumerator enumerator() { /* 52 */ return new org.apache.calcite.linq4j.Enumerator(){ /* 53 */ public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable.enumerator(); /* 54 */ public void reset() { /* 55 */ inputEnumerator.reset(); /* 56 */ } /* 57 */ /* 58 */ public boolean moveNext() { /* 59 */ return inputEnumerator.moveNext(); /* 60 */ } /* 61 */ /* 62 */ public void close() { /* 63 */ inputEnumerator.close(); /* 64 */ } /* 65 */ /* 66 */ public Object current() { /* 67 */ final org.apache.calcite.test.ReflectiveSchemaTest.EveryType current = (org.apache.calcite.test.ReflectiveSchemaTest.EveryType) inputEnumerator.current(); /* 68 */ return new Object[] { /* 69 */ current.primitiveLong, /* 70 */ current.primitiveInt}; /* 71 */ } /* 72 */ /* 73 */ }; /* 74 */ } /* 75 */ /* 76 */ }; /* 77 */ final org.apache.calcite.linq4j.Enumerable _inputEnumerable0 = child.groupBy(new org.apache.calcite.linq4j.function.Function1() { /* 78 */ public long apply(Object[] a0) { /* 79 */ return org.apache.calcite.runtime.SqlFunctions.toLong(a0[0]); /* 80 */ } /* 81 */ public Object apply(Object a0) { /* 82 */ return apply( /* 83 */ (Object[]) a0); /* 84 */ } /* 85 */ } /* 86 */ , new org.apache.calcite.linq4j.function.Function0() { /* 87 */ public Object apply() { /* 88 */ int $SUM0a0s0; /* 89 */ $SUM0a0s0 = 0; /* 90 */ long COUNTa1s0; /* 91 */ COUNTa1s0 = 0L; /* 92 */ return new Record2_0( /* 93 */ $SUM0a0s0, /* 94 */ COUNTa1s0); /* 95 */ } /* 96 */ } /* 97 */ , new org.apache.calcite.linq4j.function.Function2() { /* 98 */ public Record2_0 apply(Record2_0 acc, Object[] in) { /* 99 */ acc.f0 = acc.f0 + org.apache.calcite.runtime.SqlFunctions.toInt(in[1]); /* 100 */ acc.f1++; /* 101 */ return acc; /* 102 */ } /* 103 */ public Record2_0 apply(Object acc, Object in) { /* 104 */ return apply( /* 105 */ (Record2_0) acc, /* 106 */ (Object[]) in); /* 107 */ } /* 108 */ } /* 109 */ , new org.apache.calcite.linq4j.function.Function2() { /* 110 */ public Object[] apply(long key, Record2_0 acc) { /* 111 */ return new Object[] { /* 112 */ key, /* 113 */ acc.f0, /* 114 */ acc.f1}; /* 115 */ } /* 116 */ public Object[] apply(Long key, Record2_0 acc) { /* 117 */ return apply( /* 118 */ key.longValue(), /* 119 */ acc); /* 120 */ } /* 121 */ public Object[] apply(Object key, Object acc) { /* 122 */ return apply( /* 123 */ (Long) key, /* 124 */ (Record2_0) acc); /* 125 */ } /* 126 */ } /* 127 */ ); /* 128 */ final org.apache.calcite.linq4j.AbstractEnumerable child0 = new org.apache.calcite.linq4j.AbstractEnumerable(){ /* 129 */ public org.apache.calcite.linq4j.Enumerator enumerator() { /* 130 */ return new org.apache.calcite.linq4j.Enumerator(){ /* 131 */ public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable0.enumerator(); /* 132 */ public void reset() { /* 133 */ inputEnumerator.reset(); /* 134 */ } /* 135 */ /* 136 */ public boolean moveNext() { /* 137 */ return inputEnumerator.moveNext(); /* 138 */ } /* 139 */ /* 140 */ public void close() { /* 141 */ inputEnumerator.close(); /* 142 */ } /* 143 */ /* 144 */ public Object current() { /* 145 */ final Object[] current = (Object[]) inputEnumerator.current(); /* 146 */ return new Object[] { /* 147 */ current[0], /* 148 */ (long) org.apache.calcite.runtime.SqlFunctions.toInt(current[1]) / org.apache.calcite.runtime.SqlFunctions.toLong(current[2])}; /* 149 */ } /* 150 */ /* 151 */ }; /* 152 */ } /* 153 */ /* 154 */ }; /* 155 */ return child0.orderBy(new org.apache.calcite.linq4j.function.Function1() { /* 156 */ public long apply(Object[] v) { /* 157 */ return org.apache.calcite.runtime.SqlFunctions.toLong(v[0]); /* 158 */ } /* 159 */ public Object apply(Object v) { /* 160 */ return apply( /* 161 */ (Object[]) v); /* 162 */ } /* 163 */ } /* 164 */ , org.apache.calcite.linq4j.function.Functions.nullsComparator(false, false)); /* 165 */ } /* 166 */ /* 167 */ /* 168 */ public Class getElementType() { /* 169 */ return java.lang.Object[].class; /* 170 */ } /* 171 */ /* 172 */ java.lang.RuntimeException: exception while executing [select primitiveLong, avg(primitiveInt) from s.everyTypes group by primitiveLong order by primitiveLong] at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1148) at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1138) at org.apache.calcite.test.ReflectiveSchemaTest.testAvgInt(ReflectiveSchemaTest.java:338) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:460) at org.apache.calcite.avatica.AvaticaResultSet.getInt(AvaticaResultSet.java:246) at org.apache.calcite.test.ReflectiveSchemaTest$1.apply(ReflectiveSchemaTest.java:343) at org.apache.calcite.test.ReflectiveSchemaTest$1.apply(ReflectiveSchemaTest.java:338) at org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:466) at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1144) ... 28 more
        Hide
        vladimirsitnikov Vladimir Sitnikov added a comment -

        We would catch issues like that if we update org.apache.calcite.test.ReflectiveSchemaTest#checkAgg from .returns(CalciteAssert.<ResultSet, Void>constantNull()) to something that performs resultset get operations.

        Show
        vladimirsitnikov Vladimir Sitnikov added a comment - We would catch issues like that if we update org.apache.calcite.test.ReflectiveSchemaTest#checkAgg from .returns(CalciteAssert.<ResultSet, Void>constantNull()) to something that performs resultset get operations.
        Hide
        julianhyde Julian Hyde added a comment -

        Got it – thanks.

        Show
        julianhyde Julian Hyde added a comment - Got it – thanks.
        Show
        julianhyde Julian Hyde added a comment - Fixed in http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/cca42158 .
        Hide
        vladimirsitnikov Vladimir Sitnikov added a comment -

        Julian Hyde, can you factor out Function<ResultSet, Void>() so we can use something like .returns(CalciteAssert.<ResultSet, Void>allColumnsWork()) or even .runs() to check that all the results are "gettable"?

        Show
        vladimirsitnikov Vladimir Sitnikov added a comment - Julian Hyde , can you factor out Function<ResultSet, Void>() so we can use something like .returns(CalciteAssert.<ResultSet, Void>allColumnsWork()) or even .runs() to check that all the results are "gettable"?
        Hide
        julianhyde Julian Hyde added a comment -

        I'm done with this case, but you're welcome to refactor that code into a method. In fact for each column we should call "get" for each type allowed by the JDBC compatibility matrix (e.g. for an INTEGER column you can call getLong or getShort but not getTimestamp). JdbcTest.CONVERSIONS has that matrix – I typed it in from the JDBC spec – but it's not currently used.

        Show
        julianhyde Julian Hyde added a comment - I'm done with this case, but you're welcome to refactor that code into a method. In fact for each column we should call "get" for each type allowed by the JDBC compatibility matrix (e.g. for an INTEGER column you can call getLong or getShort but not getTimestamp). JdbcTest.CONVERSIONS has that matrix – I typed it in from the JDBC spec – but it's not currently used.
        Hide
        julianhyde Julian Hyde added a comment -

        Closing now that 1.1.0-incubating has been released.

        Show
        julianhyde Julian Hyde added a comment - Closing now that 1.1.0-incubating has been released.

          People

          • Assignee:
            julianhyde Julian Hyde
            Reporter:
            chinwei Low Chin Wei
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development