OSDir


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Node cannot be implemented error - Converting from one convention to another


Hello,

I have a database 'tpch_africa' on a postgres server. Using calcite, I am able to connect to the server instance (through jdbc) and translate a query in a relational expression. I want to optimize the query but both the HePlanner and the Planner facade give me similar errors such as:

Exception in thread "main" org.apache.calcite.plan.RelOptPlanner$CannotPlanException: Node [rel#10:Subset#0.JDBC.mydb.[]] could not be implemented; planner state:

Root: rel#10:Subset#0.JDBC.mydb.[]
Original rel:
LogicalProject(subset=[rel#7:Subset#1.JDBC.mydb.[]], l_orderkey=[$0], l_partkey=[$1], l_suppkey=[$2], l_linenumber=[$3], l_quantity=[$4], l_extendedprice=[$5], l_discount=[$6], l_tax=[$7], l_returnflag=[$8], l_linestatus=[$9], l_shipdate=[$10], l_commitdate=[$11], l_receiptdate=[$12], l_shipinstruct=[$13], l_shipmode=[$14], l_comment=[$15]): rowcount = 100.0, cumulative cost = {100.0 rows, 1600.0 cpu, 0.0 io}, id = 5   JdbcTableScan(subset=[rel#4:Subset#0.JDBC.tpch_africa.[]], table=[[tpch_africa, lineitem]]): rowcount = 100.0, cumulative cost = {100.0 rows, 101.0 cpu, 0.0 io}, id = 2

Sets:
Set#0, type: RecordType(INTEGER l_orderkey, INTEGER l_partkey, INTEGER l_suppkey, INTEGER l_linenumber, DECIMAL(15, 2) l_quantity, DECIMAL(15, 2) l_extendedprice, DECIMAL(15, 2) l_discount, DECIMAL(15, 2) l_tax, CHAR(1) l_returnflag, CHAR(1) l_linestatus, DATE l_shipdate, DATE l_commitdate, DATE l_receiptdate, CHAR(25) l_shipinstruct, CHAR(10) l_shipmode, VARCHAR(44) l_comment)
    rel#4:Subset#0.JDBC.tpch_africa.[], best=rel#2, importance=0.81
rel#2:JdbcTableScan.JDBC.tpch_africa.[](table=[tpch_africa, lineitem]), rowcount=100.0, cumulative cost={100.0 rows, 101.0 cpu, 0.0 io} rel#12:JdbcProject.JDBC.tpch_africa.[](input=rel#4:Subset#0.JDBC.tpch_africa.[],l_orderkey=$0,l_partkey=$1,l_suppkey=$2,l_linenumber=$3,l_quantity=$4,l_extendedprice=$5,l_discount=$6,l_tax=$7,l_returnflag=$8,l_linestatus=$9,l_shipdate=$10,l_commitdate=$11,l_receiptdate=$12,l_shipinstruct=$13,l_shipmode=$14,l_comment=$15), rowcount=100.0, cumulative cost={180.0 rows, 1381.0 cpu, 0.0 io}
    rel#9:Subset#0.NONE.[], best=null, importance=0.9
rel#5:LogicalProject.NONE.[](input=rel#4:Subset#0.JDBC.tpch_africa.[],l_orderkey=$0,l_partkey=$1,l_suppkey=$2,l_linenumber=$3,l_quantity=$4,l_extendedprice=$5,l_discount=$6,l_tax=$7,l_returnflag=$8,l_linestatus=$9,l_shipdate=$10,l_commitdate=$11,l_receiptdate=$12,l_shipinstruct=$13,l_shipmode=$14,l_comment=$15), rowcount=100.0, cumulative cost={inf}
    rel#10:Subset#0.JDBC.mydb.[], best=null, importance=1.0
rel#8:AbstractConverter.JDBC.mydb.[](input=rel#9:Subset#0.NONE.[],convention=JDBC.mydb,sort=[]), rowcount=100.0, cumulative cost={inf} rel#11:AbstractConverter.JDBC.mydb.[](input=rel#4:Subset#0.JDBC.tpch_africa.[],convention=JDBC.mydb,sort=[]), rowcount=100.0, cumulative cost={inf}
    rel#13:Subset#0.ENUMERABLE.[], best=rel#16, importance=0.5
rel#14:EnumerableProject.ENUMERABLE.[](input=rel#13:Subset#0.ENUMERABLE.[],l_orderkey=$0,l_partkey=$1,l_suppkey=$2,l_linenumber=$3,l_quantity=$4,l_extendedprice=$5,l_discount=$6,l_tax=$7,l_returnflag=$8,l_linestatus=$9,l_shipdate=$10,l_commitdate=$11,l_receiptdate=$12,l_shipinstruct=$13,l_shipmode=$14,l_comment=$15), rowcount=100.0, cumulative cost={210.0 rows, 1711.0 cpu, 0.0 io} rel#16:JdbcToEnumerableConverter.ENUMERABLE.[](input=rel#4:Subset#0.JDBC.tpch_africa.[]), rowcount=100.0, cumulative cost={110.0 rows, 111.0 cpu, 0.0 io}

Parts of the code are:

JdbcConvention jd =new JdbcConvention(PostgresqlSqlDialect.DEFAULT,null,"mydb"); FrameworkConfig calciteFrameworkConfig = Frameworks.newConfigBuilder()
    .parserConfig(SqlParser.configBuilder().setLex(Lex.ORACLE).build())
    .defaultSchema(schema)
    .traitDefs(traitDefs)
    .context(Contexts.EMPTY_CONTEXT)
    /* JdbcRules has all converters! */ .programs(Programs.ofRules(JdbcRules.rules(jd)))
    .costFactory(null)
    .typeSystem(RelDataTypeSystem.DEFAULT)
.build(); this.planner = Frameworks.getPlanner(calciteFrameworkConfig); SqlNode sqlNode; try { sqlNode = planner.parse(query); } catch (SqlParseException e) { throw new RuntimeException("Query parsing error.", e); } SqlNode validatedSqlNode = planner.validate(sqlNode); RelNode logicalPlan planner.rel(validatedSqlNode).project(); RelOptPlanner rop = logicalPlan.getCluster().getPlanner(); RelTraitSet rts = logicalPlan.getCluster().traitSet().replace(jd); RelNode newroot = rop.changeTraits(logicalPlan,rts); rop.setRoot(newroot); return rop.findBestExp();



Any ideas why this happens?

Best,
Alessandro