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