You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Hongze Zhang (JIRA)" <ji...@apache.org> on 2018/08/23 10:24:00 UTC

[jira] [Updated] (CALCITE-2485) Missing Object-to-String convertion in ElasticsearchEnumerators.convert(Object o, Class clazz)

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

Hongze Zhang updated CALCITE-2485:
----------------------------------
    Description: 
SQL text:
{code:sql}
SELECT a."city_str", b."col" FROM (SELECT cast(_MAP['city'] AS VARCHAR(20)) AS "city_str" FROM ES_SCHEMA."es_table" LIMIT 10) a CROSS JOIN (SELECT "col" FROM DRUID_SCHEMA."druid_table" LIMIT 10) b;
{code}
Explain plan:
{code:java}
EnumerableCalc(expr#0..1=[{inputs}], city_str=[$t1], field5=[$t0])
  EnumerableJoin(condition=[true], joinType=[inner])
    EnumerableInterpreter
      DruidQuery(table=[[DRUID_SCHEMA, druid_table]], intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[$11]], fetch=[10])
    ElasticsearchToEnumerableConverter
      ElasticsearchProject(city_str=[CAST(ITEM($0, 'city')):VARCHAR(20) CHARACTER SET "ISO-8859-1" COLLATE "ISO-8859-1$en_US$primary"])
        ElasticsearchSort(fetch=[10])
          ElasticsearchTableScan(table=[[ES_SCHEMA, es_table]])
{code}
Run into exception:
{code:java}
  <init>:58, ClassCastException (java.lang)
  apply:-1, Baz$2
  toLookup_:2662, EnumerableDefaults (org.apache.calcite.linq4j)
  toLookup:2652, EnumerableDefaults (org.apache.calcite.linq4j)
  toLookup:2628, EnumerableDefaults (org.apache.calcite.linq4j)
  toLookup:705, DefaultEnumerable (org.apache.calcite.linq4j)
  enumerator:1074, EnumerableDefaults$6 (org.apache.calcite.linq4j)
  <init>:-1, Baz$4$1
  enumerator:-1, Baz$4
  iterator:33, AbstractEnumerable (org.apache.calcite.linq4j)
  createCursor:90, MetaImpl (org.apache.calcite.avatica)
  execute:184, AvaticaResultSet (org.apache.calcite.avatica)
  execute:64, CalciteResultSet (org.apache.calcite.jdbc)
  execute:43, CalciteResultSet (org.apache.calcite.jdbc)
  execute:667, AvaticaConnection$1 (org.apache.calcite.avatica)
  prepareAndExecute:566, CalciteMetaImpl (org.apache.calcite.jdbc)
  prepareAndExecuteInternal:675, AvaticaConnection (org.apache.calcite.avatica)
  executeInternal:156, AvaticaStatement (org.apache.calcite.avatica)
  execute:217, AvaticaStatement (org.apache.calcite.avatica)
  execute:823, Commands (sqlline)
  sql:733, Commands (sqlline)
  dispatch:795, SqlLine (sqlline)
  begin:668, SqlLine (sqlline)
  start:373, SqlLine (sqlline)
  main:265, SqlLine (sqlline)
{code}
Reason:
 # The logic of CAST function is actually to be done in method ElasticsearchEnumerators.convert(Object o, Class clazz) in Elasticsearch Adaptor;
 # Map-to-String convertion is missing in that method;
 # Because of 1 and 2, the hit map returned from ElasticsearchEnumerators.singletonGetter is directly returned to join enumerator;
 # The implementation of EnumerableJoin could perform a forcible type casting on select keys via method PhysType.generateAccessor(List<Integer> fields);
 # The casting is from raw type to derived type of RexNode, which means EnumerableJoin forces a Map-to-String casting in this case.

  was:
SQL text:

{code:sql}
SELECT a."city_str", b."col" FROM (SELECT cast(_MAP['city'] AS VARCHAR(20)) AS "city_str" FROM ES_SCHEMA."es_table" LIMIT 10) a CROSS JOIN (SELECT "col" FROM DRUID_SCHEMA."druid_table" LIMIT 10) b;
{code}

Explain plan:

{code}
EnumerableCalc(expr#0..1=[{inputs}], city_str=[$t1], field5=[$t0])
  EnumerableJoin(condition=[true], joinType=[inner])
    EnumerableInterpreter
      DruidQuery(table=[[DRUID_SCHEMA, druid_table]], intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[$11]], fetch=[10])
    ElasticsearchToEnumerableConverter
      ElasticsearchProject(city_str=[CAST(ITEM($0, 'city')):VARCHAR(20) CHARACTER SET "ISO-8859-1" COLLATE "ISO-8859-1$en_US$primary"])
        ElasticsearchSort(fetch=[10])
          ElasticsearchTableScan(table=[[ES_SCHEMA, es_table]])
{code}

Run into exception:
{code}
  <init>:58, ClassCastException (java.lang)
  apply:-1, Baz$2
  toLookup_:2662, EnumerableDefaults (org.apache.calcite.linq4j)
  toLookup:2652, EnumerableDefaults (org.apache.calcite.linq4j)
  toLookup:2628, EnumerableDefaults (org.apache.calcite.linq4j)
  toLookup:705, DefaultEnumerable (org.apache.calcite.linq4j)
  enumerator:1074, EnumerableDefaults$6 (org.apache.calcite.linq4j)
  <init>:-1, Baz$4$1
  enumerator:-1, Baz$4
  iterator:33, AbstractEnumerable (org.apache.calcite.linq4j)
  createCursor:90, MetaImpl (org.apache.calcite.avatica)
  execute:184, AvaticaResultSet (org.apache.calcite.avatica)
  execute:64, CalciteResultSet (org.apache.calcite.jdbc)
  execute:43, CalciteResultSet (org.apache.calcite.jdbc)
  execute:667, AvaticaConnection$1 (org.apache.calcite.avatica)
  prepareAndExecute:566, CalciteMetaImpl (org.apache.calcite.jdbc)
  prepareAndExecuteInternal:675, AvaticaConnection (org.apache.calcite.avatica)
  executeInternal:156, AvaticaStatement (org.apache.calcite.avatica)
  execute:217, AvaticaStatement (org.apache.calcite.avatica)
  execute:823, Commands (sqlline)
  sql:733, Commands (sqlline)
  dispatch:795, SqlLine (sqlline)
  begin:668, SqlLine (sqlline)
  start:373, SqlLine (sqlline)
  main:265, SqlLine (sqlline)
{code}
  
Reason:

# The logic of CAST function is actually to be done in method  ElasticsearchEnumerators.convert(Object o, Class clazz) in Elasticsearch Adaptor;
# Map-to-String convertion is missing in that method;
# Because of 1 and 2, the hit map returned from ElasticsearchEnumerators.singletonGetter is directly returned to join enumerator;
# The implementation of EnumerableJoin performs a forcible type casting on select keys via method PhysType.generateAccessor(List<Integer> fields);
# The casting is from raw type to derived type of RexNode, which means EnumerableJoin forces a Map-to-String casting in this case.


> Missing Object-to-String convertion in ElasticsearchEnumerators.convert(Object o, Class clazz)
> ----------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-2485
>                 URL: https://issues.apache.org/jira/browse/CALCITE-2485
>             Project: Calcite
>          Issue Type: Bug
>          Components: elasticsearch-adapter
>    Affects Versions: 1.17.0
>            Reporter: Hongze Zhang
>            Assignee: Julian Hyde
>            Priority: Major
>
> SQL text:
> {code:sql}
> SELECT a."city_str", b."col" FROM (SELECT cast(_MAP['city'] AS VARCHAR(20)) AS "city_str" FROM ES_SCHEMA."es_table" LIMIT 10) a CROSS JOIN (SELECT "col" FROM DRUID_SCHEMA."druid_table" LIMIT 10) b;
> {code}
> Explain plan:
> {code:java}
> EnumerableCalc(expr#0..1=[{inputs}], city_str=[$t1], field5=[$t0])
>   EnumerableJoin(condition=[true], joinType=[inner])
>     EnumerableInterpreter
>       DruidQuery(table=[[DRUID_SCHEMA, druid_table]], intervals=[[1900-01-01T00:00:00.000Z/3000-01-01T00:00:00.000Z]], projects=[[$11]], fetch=[10])
>     ElasticsearchToEnumerableConverter
>       ElasticsearchProject(city_str=[CAST(ITEM($0, 'city')):VARCHAR(20) CHARACTER SET "ISO-8859-1" COLLATE "ISO-8859-1$en_US$primary"])
>         ElasticsearchSort(fetch=[10])
>           ElasticsearchTableScan(table=[[ES_SCHEMA, es_table]])
> {code}
> Run into exception:
> {code:java}
>   <init>:58, ClassCastException (java.lang)
>   apply:-1, Baz$2
>   toLookup_:2662, EnumerableDefaults (org.apache.calcite.linq4j)
>   toLookup:2652, EnumerableDefaults (org.apache.calcite.linq4j)
>   toLookup:2628, EnumerableDefaults (org.apache.calcite.linq4j)
>   toLookup:705, DefaultEnumerable (org.apache.calcite.linq4j)
>   enumerator:1074, EnumerableDefaults$6 (org.apache.calcite.linq4j)
>   <init>:-1, Baz$4$1
>   enumerator:-1, Baz$4
>   iterator:33, AbstractEnumerable (org.apache.calcite.linq4j)
>   createCursor:90, MetaImpl (org.apache.calcite.avatica)
>   execute:184, AvaticaResultSet (org.apache.calcite.avatica)
>   execute:64, CalciteResultSet (org.apache.calcite.jdbc)
>   execute:43, CalciteResultSet (org.apache.calcite.jdbc)
>   execute:667, AvaticaConnection$1 (org.apache.calcite.avatica)
>   prepareAndExecute:566, CalciteMetaImpl (org.apache.calcite.jdbc)
>   prepareAndExecuteInternal:675, AvaticaConnection (org.apache.calcite.avatica)
>   executeInternal:156, AvaticaStatement (org.apache.calcite.avatica)
>   execute:217, AvaticaStatement (org.apache.calcite.avatica)
>   execute:823, Commands (sqlline)
>   sql:733, Commands (sqlline)
>   dispatch:795, SqlLine (sqlline)
>   begin:668, SqlLine (sqlline)
>   start:373, SqlLine (sqlline)
>   main:265, SqlLine (sqlline)
> {code}
> Reason:
>  # The logic of CAST function is actually to be done in method ElasticsearchEnumerators.convert(Object o, Class clazz) in Elasticsearch Adaptor;
>  # Map-to-String convertion is missing in that method;
>  # Because of 1 and 2, the hit map returned from ElasticsearchEnumerators.singletonGetter is directly returned to join enumerator;
>  # The implementation of EnumerableJoin could perform a forcible type casting on select keys via method PhysType.generateAccessor(List<Integer> fields);
>  # The casting is from raw type to derived type of RexNode, which means EnumerableJoin forces a Map-to-String casting in this case.



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