You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Marc Prud'hommeaux (JIRA)" <ji...@apache.org> on 2018/05/31 14:38:00 UTC

[jira] [Updated] (CALCITE-2346) UNION results with different column types can cause ClassCastException

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

Marc Prud'hommeaux updated CALCITE-2346:
----------------------------------------
    Description: 
Trying to union results from two separate data types is throwing:

{code:none}
java.lang.ClassCastException: java.base/java.lang.Byte cannot be cast to java.base/java.lang.Integer
	at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:545)
	at org.apache.calcite.avatica.AvaticaSite.get(AvaticaSite.java:339)
	at org.apache.calcite.avatica.AvaticaResultSet.getObject(AvaticaResultSet.java:377)
	at sqlline.Rows$Row.<init>(Rows.java:157)
	at sqlline.IncrementalRows.hasNext(IncrementalRows.java:66)
	at sqlline.TableOutputFormat.print(TableOutputFormat.java:33)
	at sqlline.SqlLine.print(SqlLine.java:1648)

{code}

It can reproduced with the command:

{code:none}
coursier launch \
  sqlline:sqlline:1.4.0 \
  org.apache.calcite:calcite-core:1.16.0 \
  org.hsqldb:hsqldb:2.4.0 \
  net.hydromatic:scott-data-hsqldb:0.1 \
  net.hydromatic:foodmart-data-hsqldb:0.4 \
  -M sqlline.SqlLine -- \
  -d org.apache.calcite.jdbc.Driver \
  -u 'jdbc:calcite:model=inline:{"version":1.0,"schemas":[{"name":"scott","type":"jdbc","jdbcUrl":"jdbc:hsqldb:res:scott","jdbcUser":"SCOTT","jdbcPassword":"TIGER"},{"name":"foodmart","type":"jdbc","jdbcSchema":"foodmart","jdbcUrl":"jdbc:hsqldb:res:foodmart"}]}' 
{code}


The following command works fine:

{code:none}
0: jdbc:calcite:model=inline:{"version":1.0,"> select "DNAME" from "scott"."DEPT" union all select "department_description" from "foodmart"."department";
+--------------------------------+
|             DNAME              |
+--------------------------------+
| ACCOUNTING                     |
| RESEARCH                       |
| SALES                          |
| OPERATIONS                     |
| HQ General Management          |
| HQ Information Systems         |
| HQ Marketing                   |
| HQ Human Resources             |
| HQ Finance and Accounting      |
| Store Management               |
| Store Information Systems      |
| Store Permanent Checkers       |
| Store Temporary Checkers       |
| Store Permanent Stockers       |
| Store Temporary Stockers       |
| Store Permanent Butchers       |
+--------------------------------+
16 rows selected (0.069 seconds)
{code}

But when unioning two different column types:

{code:none}
0: jdbc:calcite:model=inline:{"version":1.0,"> select "DEPTNO", "DNAME" from "scott"."DEPT" union all select "department_id", "department_description" from "foodmart"."department";
+------------+--------------------------------+
|   DEPTNO   |             DNAME              |
+------------+--------------------------------+
java.lang.ClassCastException: java.base/java.lang.Byte cannot be cast to java.base/java.lang.Integer
	at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:545)
	at org.apache.calcite.avatica.AvaticaSite.get(AvaticaSite.java:339)
	at org.apache.calcite.avatica.AvaticaResultSet.getObject(AvaticaResultSet.java:377)
	at sqlline.Rows$Row.<init>(Rows.java:157)
	at sqlline.IncrementalRows.hasNext(IncrementalRows.java:66)
	at sqlline.TableOutputFormat.print(TableOutputFormat.java:33)
	at sqlline.SqlLine.print(SqlLine.java:1648)
	at sqlline.Commands.execute(Commands.java:834)
	at sqlline.Commands.sql(Commands.java:733)
	at sqlline.SqlLine.dispatch(SqlLine.java:795)
{code}

Possibly related: https://issues.apache.org/jira/browse/CALCITE-580


  was:
Trying to union results from two separate data types is throwing:

{code:java}
java.lang.ClassCastException: java.base/java.lang.Byte cannot be cast to java.base/java.lang.Integer
	at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:545)
	at org.apache.calcite.avatica.AvaticaSite.get(AvaticaSite.java:339)
	at org.apache.calcite.avatica.AvaticaResultSet.getObject(AvaticaResultSet.java:377)
	at sqlline.Rows$Row.<init>(Rows.java:157)
	at sqlline.IncrementalRows.hasNext(IncrementalRows.java:66)
	at sqlline.TableOutputFormat.print(TableOutputFormat.java:33)
	at sqlline.SqlLine.print(SqlLine.java:1648)

{code}

It can reproduced with the command:

{code:java}
coursier launch \
  sqlline:sqlline:1.4.0 \
  org.apache.calcite:calcite-core:1.16.0 \
  org.hsqldb:hsqldb:2.4.0 \
  net.hydromatic:scott-data-hsqldb:0.1 \
  net.hydromatic:foodmart-data-hsqldb:0.4 \
  -M sqlline.SqlLine -- \
  -d org.apache.calcite.jdbc.Driver \
  -u 'jdbc:calcite:model=inline:{"version":1.0,"schemas":[{"name":"scott","type":"jdbc","jdbcUrl":"jdbc:hsqldb:res:scott","jdbcUser":"SCOTT","jdbcPassword":"TIGER"},{"name":"foodmart","type":"jdbc","jdbcSchema":"foodmart","jdbcUrl":"jdbc:hsqldb:res:foodmart"}]}' 
{code}


The following command works fine:

{code:java}
0: jdbc:calcite:model=inline:{"version":1.0,"> select "DNAME" from "scott"."DEPT" union all select "department_description" from "foodmart"."department";
+--------------------------------+
|             DNAME              |
+--------------------------------+
| ACCOUNTING                     |
| RESEARCH                       |
| SALES                          |
| OPERATIONS                     |
| HQ General Management          |
| HQ Information Systems         |
| HQ Marketing                   |
| HQ Human Resources             |
| HQ Finance and Accounting      |
| Store Management               |
| Store Information Systems      |
| Store Permanent Checkers       |
| Store Temporary Checkers       |
| Store Permanent Stockers       |
| Store Temporary Stockers       |
| Store Permanent Butchers       |
+--------------------------------+
16 rows selected (0.069 seconds)
{code}

But when unioning two different column types:

{code:java}
0: jdbc:calcite:model=inline:{"version":1.0,"> select "DEPTNO", "DNAME" from "scott"."DEPT" union all select "department_id", "department_description" from "foodmart"."department";
+------------+--------------------------------+
|   DEPTNO   |             DNAME              |
+------------+--------------------------------+
java.lang.ClassCastException: java.base/java.lang.Byte cannot be cast to java.base/java.lang.Integer
	at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:545)
	at org.apache.calcite.avatica.AvaticaSite.get(AvaticaSite.java:339)
	at org.apache.calcite.avatica.AvaticaResultSet.getObject(AvaticaResultSet.java:377)
	at sqlline.Rows$Row.<init>(Rows.java:157)
	at sqlline.IncrementalRows.hasNext(IncrementalRows.java:66)
	at sqlline.TableOutputFormat.print(TableOutputFormat.java:33)
	at sqlline.SqlLine.print(SqlLine.java:1648)
	at sqlline.Commands.execute(Commands.java:834)
	at sqlline.Commands.sql(Commands.java:733)
	at sqlline.SqlLine.dispatch(SqlLine.java:795)
{code}

Possibly related: https://issues.apache.org/jira/browse/CALCITE-580



> UNION results with different column types can cause ClassCastException
> ----------------------------------------------------------------------
>
>                 Key: CALCITE-2346
>                 URL: https://issues.apache.org/jira/browse/CALCITE-2346
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.16.0
>         Environment: macOS 10.13.4 (17E202)
> openjdk version "10" 2018-03-20
> OpenJDK Runtime Environment 18.3 (build 10+46)
> OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)
>            Reporter: Marc Prud'hommeaux
>            Assignee: Julian Hyde
>            Priority: Minor
>
> Trying to union results from two separate data types is throwing:
> {code:none}
> java.lang.ClassCastException: java.base/java.lang.Byte cannot be cast to java.base/java.lang.Integer
> 	at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:545)
> 	at org.apache.calcite.avatica.AvaticaSite.get(AvaticaSite.java:339)
> 	at org.apache.calcite.avatica.AvaticaResultSet.getObject(AvaticaResultSet.java:377)
> 	at sqlline.Rows$Row.<init>(Rows.java:157)
> 	at sqlline.IncrementalRows.hasNext(IncrementalRows.java:66)
> 	at sqlline.TableOutputFormat.print(TableOutputFormat.java:33)
> 	at sqlline.SqlLine.print(SqlLine.java:1648)
> {code}
> It can reproduced with the command:
> {code:none}
> coursier launch \
>   sqlline:sqlline:1.4.0 \
>   org.apache.calcite:calcite-core:1.16.0 \
>   org.hsqldb:hsqldb:2.4.0 \
>   net.hydromatic:scott-data-hsqldb:0.1 \
>   net.hydromatic:foodmart-data-hsqldb:0.4 \
>   -M sqlline.SqlLine -- \
>   -d org.apache.calcite.jdbc.Driver \
>   -u 'jdbc:calcite:model=inline:{"version":1.0,"schemas":[{"name":"scott","type":"jdbc","jdbcUrl":"jdbc:hsqldb:res:scott","jdbcUser":"SCOTT","jdbcPassword":"TIGER"},{"name":"foodmart","type":"jdbc","jdbcSchema":"foodmart","jdbcUrl":"jdbc:hsqldb:res:foodmart"}]}' 
> {code}
> The following command works fine:
> {code:none}
> 0: jdbc:calcite:model=inline:{"version":1.0,"> select "DNAME" from "scott"."DEPT" union all select "department_description" from "foodmart"."department";
> +--------------------------------+
> |             DNAME              |
> +--------------------------------+
> | ACCOUNTING                     |
> | RESEARCH                       |
> | SALES                          |
> | OPERATIONS                     |
> | HQ General Management          |
> | HQ Information Systems         |
> | HQ Marketing                   |
> | HQ Human Resources             |
> | HQ Finance and Accounting      |
> | Store Management               |
> | Store Information Systems      |
> | Store Permanent Checkers       |
> | Store Temporary Checkers       |
> | Store Permanent Stockers       |
> | Store Temporary Stockers       |
> | Store Permanent Butchers       |
> +--------------------------------+
> 16 rows selected (0.069 seconds)
> {code}
> But when unioning two different column types:
> {code:none}
> 0: jdbc:calcite:model=inline:{"version":1.0,"> select "DEPTNO", "DNAME" from "scott"."DEPT" union all select "department_id", "department_description" from "foodmart"."department";
> +------------+--------------------------------+
> |   DEPTNO   |             DNAME              |
> +------------+--------------------------------+
> java.lang.ClassCastException: java.base/java.lang.Byte cannot be cast to java.base/java.lang.Integer
> 	at org.apache.calcite.avatica.util.AbstractCursor$IntAccessor.getInt(AbstractCursor.java:545)
> 	at org.apache.calcite.avatica.AvaticaSite.get(AvaticaSite.java:339)
> 	at org.apache.calcite.avatica.AvaticaResultSet.getObject(AvaticaResultSet.java:377)
> 	at sqlline.Rows$Row.<init>(Rows.java:157)
> 	at sqlline.IncrementalRows.hasNext(IncrementalRows.java:66)
> 	at sqlline.TableOutputFormat.print(TableOutputFormat.java:33)
> 	at sqlline.SqlLine.print(SqlLine.java:1648)
> 	at sqlline.Commands.execute(Commands.java:834)
> 	at sqlline.Commands.sql(Commands.java:733)
> 	at sqlline.SqlLine.dispatch(SqlLine.java:795)
> {code}
> Possibly related: https://issues.apache.org/jira/browse/CALCITE-580



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)