Egor, What's the Calcite version are you using? I tried your code in 1.30.0 and 1.31.0, they both work fine.
Egor Ryashin <[email protected]> 于2022年8月17日周三 22:40写道: > Hi all, > > I’m trying to figure out why this conversion fails: > > WITH `A` AS (SELECT `TABLE_NAME` > FROM `main`.`TABLES`), `B` AS (SELECT 'k' AS `K`) (SELECT * > FROM `A` > INNER JOIN `B` ON `A`.`TABLE_NAME` = `B`.`K`) > Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 1 > out of bounds for length 1 > at > java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) > at > java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) > at > java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) > at java.base/java.util.Objects.checkIndex(Objects.java:359) > at java.base/java.util.ArrayList.get(ArrayList.java:427) > at > org.apache.calcite.sql2rel.SqlToRelConverter$LookupContext.findRel(SqlToRelConverter.java:5212) > at > org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.lookup(SqlToRelConverter.java:4345) > at > org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.lookupExp(SqlToRelConverter.java:4290) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertIdentifier(SqlToRelConverter.java:3637) > at > org.apache.calcite.sql2rel.SqlToRelConverter.access$2100(SqlToRelConverter.java:217) > at > org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:4717) > at > org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:4013) > at > org.apache.calcite.sql.SqlIdentifier.accept(SqlIdentifier.java:334) > at > org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:4577) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectList(SqlToRelConverter.java:3856) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectImpl(SqlToRelConverter.java:670) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertSelect(SqlToRelConverter.java:627) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertQueryRecursive(SqlToRelConverter.java:3100) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:563) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertWith(SqlToRelConverter.java:3927) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertQueryRecursive(SqlToRelConverter.java:3114) > at > org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:563) > at org.apache.calcite.prepare.PlannerImpl.rel(PlannerImpl.java:235) > > The source code: > Connection connection = DriverManager.getConnection("jdbc:calcite:"); > CalciteConnection calciteConnection = > connection.unwrap(CalciteConnection.class); > SchemaPlus rootSchema = calciteConnection.getRootSchema(); > final DataSource ds = JdbcSchema.dataSource( > "jdbc:hsqldb:mem:db", > "org.hsqldb.jdbc.JDBCDriver", > "SA", > ""); > rootSchema.add("main", JdbcSchema.create(rootSchema, "main", ds, null, > "INFORMATION_SCHEMA")); > FrameworkConfig config = Frameworks.newConfigBuilder() > .defaultSchema(rootSchema) > .build(); > > Planner planner = Frameworks.getPlanner(config); > > SqlNode sqlNode = planner.parse("with a as (select TABLE_NAME from > \"main\".\"TABLES\"), b as (select 'k' as k) select * from a join b on > a.TABLE_NAME = b.K"); > System.out.println(sqlNode.toString()); > > sqlNode = planner.validate(sqlNode); > > RelRoot relRoot = planner.rel(sqlNode); > System.out.println(relRoot.toString()); > > This one (without join) works fine: > with a as (select TABLE_NAME from \"main\".\"TABLES\"), b as (select 'k' > as k) select * from b > It doesn’t depend on the database, I tried another schema with the same > result. > > -- Best, Benchao Li
