wuweigong created CALCITE-6783:
----------------------------------

             Summary: 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


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
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

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|[https://calcite.apache.org/docs/reference.html#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