The query is invalid. When validating B there is no K in scope. This should be throwing a validation error in all Calcite versions. If it happens to run in some Calcite versions that is more luck than design.
Can you log a jira case please? Julian > On Aug 18, 2022, at 6:00 AM, Egor Ryashin <riashin.e...@gmail.com> wrote: > > true, the version was rather old, thank you. > >> On 18 Aug 2022, at 02:12, Benchao Li <libenc...@apache.org> wrote: >> >> 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 <riashin.e...@gmail.com> 于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 >