Julian,

The query is invalid. When validating B there is no K in scope.

I'm not sure that I understand this statement, could you kindly elaborate a
little more?

Julian Hyde <[email protected]> 于2022年8月18日周四 23:32写道:

> 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 <[email protected]>
> wrote:
> >
> > true, the version was rather old, thank you.
> >
> >> On 18 Aug 2022, at 02:12, Benchao Li <[email protected]> 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 <[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
> >
>


-- 

Best,
Benchao Li

Reply via email to