[ 
https://issues.apache.org/jira/browse/CALCITE-6783?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alessandro Solimando resolved CALCITE-6783.
-------------------------------------------
    Resolution: Not A Bug

> The different nullable types throw cast exception in union 
> -----------------------------------------------------------
>
>                 Key: CALCITE-6783
>                 URL: https://issues.apache.org/jira/browse/CALCITE-6783
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.38.0
>            Reporter: wuweigong
>            Priority: Blocker
>             Fix For: 1.39.0
>
>
> eg: I hava a book table and book_author table, thie schemas as follow.
>  
> {code:java}
> RelDataType bookType = typeFactory.builder()
>     .add("id", SqlTypeName.BIGINT)
>     .add("author_id", SqlTypeName.BIGINT)
>     .add("name", SqlTypeName.VARCHAR)
>     .add("publish", SqlTypeName.VARCHAR)
>     .add("desc", SqlTypeName.VARCHAR)
>     .build(); 
> RelDataType bookAuthorType = typeFactory.builder()
>     .add("id", SqlTypeName.BIGINT)
>     .add("author_id", typeFactory.createType(Integer.class))
>     .add("name", SqlTypeName.VARCHAR)
>     .add("publish", SqlTypeName.VARCHAR)
>     .add("desc", SqlTypeName.VARCHAR)
>     .build();{code}
> Executing the following sql will throw an exception
> {code:java}
> select a.id, name, author_id + 1 as aid, publish, desc
> from (
>   select id, name, author_id + 2 as author_id, publish, desc from book
> union all
>   select id, name, author_id + 1 as author_id, publish, desc from author_book
> ) a {code}
> generated code
> {code:java}
> /*   1 */ public org.apache.calcite.linq4j.Enumerable bind(final 
> org.apache.calcite.DataContext root) {
> /*   2 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = 
> org.apache.calcite.schema.Schemas.enumerable((org.apache.calcite.schema.ScannableTable)
>  root.getRootSchema().getTable("book"), root);
> /*   3 */   final org.apache.calcite.linq4j.AbstractEnumerable child0 = new 
> org.apache.calcite.linq4j.AbstractEnumerable(){
> /*   4 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
> /*   5 */       return new org.apache.calcite.linq4j.Enumerator(){
> /*   6 */           public final org.apache.calcite.linq4j.Enumerator 
> inputEnumerator = _inputEnumerable.enumerator();
> /*   7 */           public void reset() {
> /*   8 */             inputEnumerator.reset();
> /*   9 */           }
> /*  10 */ 
> /*  11 */           public boolean moveNext() {
> /*  12 */             return inputEnumerator.moveNext();
> /*  13 */           }
> /*  14 */ 
> /*  15 */           public void close() {
> /*  16 */             inputEnumerator.close();
> /*  17 */           }
> /*  18 */ 
> /*  19 */           public Object current() {
> /*  20 */             final Object[] current = (Object[]) 
> inputEnumerator.current();
> /*  21 */             return new Object[] {
> /*  22 */                 current[0],
> /*  23 */                 current[2],
> /*  24 */                 
> org.apache.calcite.runtime.SqlFunctions.toLong(current[1]) + 
> $L4J$C$_Number_org_apache_calcite_linq4j_tree_Primitive_of_long_class_3d3c4a8a,
> /*  25 */                 current[3],
> /*  26 */                 current[4]};
> /*  27 */           }
> /*  28 */ 
> /*  29 */           static final long 
> $L4J$C$_Number_org_apache_calcite_linq4j_tree_Primitive_of_long_class_3d3c4a8a
>  = 
> ((Number)org.apache.calcite.linq4j.tree.Primitive.of(long.class).numberValueRoundDown(2)).longValue();
> /*  30 */         };
> /*  31 */     }
> /*  32 */ 
> /*  33 */   };
> /*  34 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable0 = 
> org.apache.calcite.schema.Schemas.enumerable((org.apache.calcite.schema.ScannableTable)
>  root.getRootSchema().getTable("author_book"), root);
> /*  35 */   final org.apache.calcite.linq4j.AbstractEnumerable child1 = new 
> org.apache.calcite.linq4j.AbstractEnumerable(){
> /*  36 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
> /*  37 */       return new org.apache.calcite.linq4j.Enumerator(){
> /*  38 */           public final org.apache.calcite.linq4j.Enumerator 
> inputEnumerator = _inputEnumerable0.enumerator();
> /*  39 */           public void reset() {
> /*  40 */             inputEnumerator.reset();
> /*  41 */           }
> /*  42 */ 
> /*  43 */           public boolean moveNext() {
> /*  44 */             return inputEnumerator.moveNext();
> /*  45 */           }
> /*  46 */ 
> /*  47 */           public void close() {
> /*  48 */             inputEnumerator.close();
> /*  49 */           }
> /*  50 */ 
> /*  51 */           public Object current() {
> /*  52 */             final Object[] current = (Object[]) 
> inputEnumerator.current();
> /*  53 */             final Integer input_value1 = (Integer) current[1];
> /*  54 */             return new Object[] {
> /*  55 */                 current[0],
> /*  56 */                 current[2],
> /*  57 */                 input_value1 == null ? null : 
> Integer.valueOf(input_value1.intValue() + 1),
> /*  58 */                 current[3],
> /*  59 */                 current[4]};
> /*  60 */           }
> /*  61 */ 
> /*  62 */         };
> /*  63 */     }
> /*  64 */ 
> /*  65 */   };
> /*  66 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable1 = 
> child0.concat(child1);
> /*  67 */   return new org.apache.calcite.linq4j.AbstractEnumerable(){
> /*  68 */       public org.apache.calcite.linq4j.Enumerator enumerator() {
> /*  69 */         return new org.apache.calcite.linq4j.Enumerator(){
> /*  70 */             public final org.apache.calcite.linq4j.Enumerator 
> inputEnumerator = _inputEnumerable1.enumerator();
> /*  71 */             public void reset() {
> /*  72 */               inputEnumerator.reset();
> /*  73 */             }
> /*  74 */ 
> /*  75 */             public boolean moveNext() {
> /*  76 */               return inputEnumerator.moveNext();
> /*  77 */             }
> /*  78 */ 
> /*  79 */             public void close() {
> /*  80 */               inputEnumerator.close();
> /*  81 */             }
> /*  82 */ 
> /*  83 */             public Object current() {
> /*  84 */               final Object[] current = (Object[]) 
> inputEnumerator.current();
> /*  85 */               final Long input_value1 = (Long) current[2];
> /*  86 */               return new Object[] {
> /*  87 */                   current[0],
> /*  88 */                   current[1],
> /*  89 */                   input_value1 == null ? null : 
> Long.valueOf(input_value1.longValue() + 1L),
> /*  90 */                   current[3],
> /*  91 */                   current[4]};
> /*  92 */             }
> /*  93 */ 
> /*  94 */           };
> /*  95 */       }
> /*  96 */ 
> /*  97 */     };
> /*  98 */ }
> /*  99 */ 
> /* 100 */ 
> /* 101 */ public Class getElementType() {
> /* 102 */   return java.lang.Object[].class;
> /* 103 */ }
> /* 104 */ 
> /* 105 */ {code}
>  
>  
> the exception
> {code:java}
> java.lang.Integer cannot be cast to java.lang.Long
> java.lang.ClassCastException: java.lang.Integer cannot be cast to 
> java.lang.Long
>     at Baz$3$1.current(ANONYMOUS.java:86)
>     at 
> org.apache.calcite.linq4j.Linq4j$EnumeratorIterator.next(Linq4j.java:674)
>     at 
> org.apache.calcite.avatica.util.IteratorCursor.next(IteratorCursor.java:46)
>     at 
> org.apache.calcite.avatica.AvaticaResultSet.next(AvaticaResultSet.java:219){code}
>  
>  
> Is this a bug?  I read the official document about [type 
> conversion|#implicit-type-conversion]. if this is a bug, I can fix it.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to