Hongze Zhang created CALCITE-2485: ------------------------------------- Summary: 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
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. -- This message was sent by Atlassian JIRA (v7.6.3#76005)