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)