Sorry, my mistake. The query is valid.

I read the quotes around ‘k’ as back-ticks, `k`. In which case `k` would be a 
an identifier rather than a character literal, and there is no object in scope 
called `k`.

Julian


> On Aug 18, 2022, at 6:41 PM, Benchao Li <libenc...@apache.org> wrote:
> 
> 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 <jhyde.apa...@gmail.com> 于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 <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
>>> 
>> 
> 
> 
> -- 
> 
> Best,
> Benchao Li

Reply via email to