You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by Gavin Ray <ra...@gmail.com> on 2022/01/31 21:42:01 UTC
Getting "AssertionError: Rule's description should be unique" after adding JOIN to query. Fails on "optPlanner.changeTraits()"
I took the "FrameworksTest#executeQuery()" code from the Calcite repo here
and have been using it:
https://github.com/apache/calcite/blob/de847c38f3544f9c7282984f32dc1093bdb2fb60/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java#L444-L477
Have been getting an error I don't understand.
I have a rootSchema, with two sub-schemas, that each have JdbcSchema's from
hsqldb
https://gist.github.com/GavinRay97/cf39a9dd92a793df506ecc2135d6da0b#file-test-kt-L68-L78
If I query just a single schema, it works fine:
=============================================
Query: select * from db1.PUBLIC.POSTS
-- Logical Plan
LogicalProject(inputs=[0..3])
JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
-- Mid Plan
LogicalProject(subset=[rel#8:RelSubset#1.ENUMERABLE.[]], inputs=[0..3])
JdbcTableScan(subset=[rel#5:RelSubset#0.JDBC.PUBLIC.[]], table=[[db1,
PUBLIC, POSTS]])
-- Best Plan
JdbcToEnumerableConverter
JdbcTableScan(table=[[hsqldb1, PUBLIC, POSTS]])
If I add a JOIN though, it fails before reaching the mid-plan:
=============================================
Query:
select * from db1.PUBLIC.POSTS
inner join db2.PUBLIC.COMMENTS
on db1.PUBLIC.POSTS.ID = db2.PUBLIC.COMMENTS.POST_ID
-- Logical Plan
LogicalProject(inputs=[0..6])
LogicalJoin(condition=[=($0, $5)], joinType=[inner])
JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
JdbcTableScan(table=[[db2, PUBLIC, COMMENTS]])
java.lang.AssertionError: Rule's description should be unique;
existing rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE);
new rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)
at
org.apache.calcite.plan.AbstractRelOptPlanner.addRule(AbstractRelOptPlanner.java:163)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.addRule(VolcanoPlanner.java:418)
at
org.apache.calcite.adapter.jdbc.JdbcConvention.register(JdbcConvention.java:66)
at
org.apache.calcite.plan.AbstractRelOptPlanner.registerClass(AbstractRelOptPlanner.java:240)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1365)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
at
org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
at
org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.changeTraits(VolcanoPlanner.java:498)
at CalciteUtils.executeQuery(CalciteUtils.kt:41)
at ForeignKeyTest.testForeignKey(ForeignKeyTest.kt:82)
Re: Getting "AssertionError: Rule's description should be unique" after adding JOIN to query. Fails on "optPlanner.changeTraits()"
Posted by Gavin Ray <ra...@gmail.com>.
Stamatis, thank you!! Based on your comments about the naming/identity, I
was
able to figure out what was happening and fix it =D
In hindsight it should have been obvious. I was iterating over all schemas
in
the DB, but I was not creating unique names. So in this test, "DB1" and
"DB2"
both have a schema named "PUBLIC".
When I created the JdbcSchema, I was just passing "PUBLIC" as the name. The
solution was to make the name "$databaseName_$schemaName". Now it works!
My "CalciteSchemaManager.addDatabase()" functionality looks like this:
fun addDatabase(dbName: String, ds: DataSource): SchemaPlus {
val schemas = getSubSchemas(ds.connection)
if (schemas.isEmpty()) {
rootSchema.add(dbName, JdbcSchema.create(rootSchema, dbName, ds,
null, null))
} else {
val dbSchema = rootSchema.add(dbName, EMPTY_SCHEMA)
for (schemaName in schemas) {
dbSchema.add(
schemaName,
JdbcSchema.create(dbSchema, schemaName, ds, null,
schemaName)
)
}
}
return rootSchema
}
On Mon, Jan 31, 2022 at 4:59 PM Stamatis Zampetakis <za...@gmail.com>
wrote:
> Hi Gavin,
>
> For each JdbcSchema, there is a JdbcConvention and when the latter is
> registered in the planner it creates and registers a bunch of JdbcRules
> [1]. If we are talking about the same schema then I guess the description
> that is generated for each rule is identical so you end up with this
> exception.
>
> Are you using the same schema? Should you? If the use-case is valid then
> you may have bumped into a small bug and probably you need to figure out a
> way to make the rule description unique.
>
> Best,
> Stamatis
>
> [1]
>
> https://github.com/apache/calcite/blob/8570cf2b293e9acab9525fbe76709d970b9f7104/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcConvention.java#L65
>
> On Mon, Jan 31, 2022 at 10:56 PM Gavin Ray <ra...@gmail.com> wrote:
>
> > Not sure if this is helpful, but enabling TRACE logging shows this:
> >
> > [Test worker] DEBUG org.apache.calcite.sql2rel - Plan after converting
> > SqlNode to RelNode
> > LogicalProject(ID=[$0], USER_ID=[$1], TITLE=[$2], CONTENT=[$3], ID0=[$4],
> > POST_ID=[$5], CONTENT0=[$6])
> > LogicalJoin(condition=[=($0, $5)], joinType=[inner])
> > JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
> > JdbcTableScan(table=[[db2, PUBLIC, COMMENTS]])
> >
> > [Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Subset cost
> > changed: subset [rel#11:RelSubset#0.JDBC.PUBLIC.[]] cost was {inf} now
> > {100.0 rows, 101.0 cpu, 0.0 io}
> > [Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Register
> > rel#7:JdbcTableScan.JDBC.PUBLIC.[](table=[db1, PUBLIC, POSTS]) in
> > rel#11:RelSubset#0.JDBC.PUBLIC.[]
> > [Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Rule-match
> > queued: rule
> [JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)]
> > rels [#7]
> >
> > java.lang.AssertionError: Rule's description should be unique; existing
> > rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE); new
> > rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)
> >
> >
> > On Mon, Jan 31, 2022 at 4:42 PM Gavin Ray <ra...@gmail.com> wrote:
> >
> > > I took the "FrameworksTest#executeQuery()" code from the Calcite repo
> > here
> > > and have been using it:
> > >
> > >
> >
> https://github.com/apache/calcite/blob/de847c38f3544f9c7282984f32dc1093bdb2fb60/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java#L444-L477
> > >
> > > Have been getting an error I don't understand.
> > > I have a rootSchema, with two sub-schemas, that each have JdbcSchema's
> > > from hsqldb
> > >
> > >
> > >
> >
> https://gist.github.com/GavinRay97/cf39a9dd92a793df506ecc2135d6da0b#file-test-kt-L68-L78
> > >
> > > If I query just a single schema, it works fine:
> > > =============================================
> > > Query: select * from db1.PUBLIC.POSTS
> > >
> > > -- Logical Plan
> > > LogicalProject(inputs=[0..3])
> > > JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
> > >
> > > -- Mid Plan
> > > LogicalProject(subset=[rel#8:RelSubset#1.ENUMERABLE.[]], inputs=[0..3])
> > > JdbcTableScan(subset=[rel#5:RelSubset#0.JDBC.PUBLIC.[]], table=[[db1,
> > > PUBLIC, POSTS]])
> > >
> > > -- Best Plan
> > > JdbcToEnumerableConverter
> > > JdbcTableScan(table=[[hsqldb1, PUBLIC, POSTS]])
> > >
> > > If I add a JOIN though, it fails before reaching the mid-plan:
> > > =============================================
> > > Query:
> > > select * from db1.PUBLIC.POSTS
> > > inner join db2.PUBLIC.COMMENTS
> > > on db1.PUBLIC.POSTS.ID =
> db2.PUBLIC.COMMENTS.POST_ID
> > >
> > > -- Logical Plan
> > > LogicalProject(inputs=[0..6])
> > > LogicalJoin(condition=[=($0, $5)], joinType=[inner])
> > > JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
> > > JdbcTableScan(table=[[db2, PUBLIC, COMMENTS]])
> > >
> > > java.lang.AssertionError: Rule's description should be unique;
> > > existing
> > rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE);
> > > new rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)
> > > at
> > >
> >
> org.apache.calcite.plan.AbstractRelOptPlanner.addRule(AbstractRelOptPlanner.java:163)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.addRule(VolcanoPlanner.java:418)
> > > at
> > >
> >
> org.apache.calcite.adapter.jdbc.JdbcConvention.register(JdbcConvention.java:66)
> > > at
> > >
> >
> org.apache.calcite.plan.AbstractRelOptPlanner.registerClass(AbstractRelOptPlanner.java:240)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1365)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
> > > at
> > >
> >
> org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
> > > at
> > >
> >
> org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> > > at
> > >
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.changeTraits(VolcanoPlanner.java:498)
> > > at CalciteUtils.executeQuery(CalciteUtils.kt:41)
> > > at ForeignKeyTest.testForeignKey(ForeignKeyTest.kt:82)
> > >
> >
>
Re: Getting "AssertionError: Rule's description should be unique" after adding JOIN to query. Fails on "optPlanner.changeTraits()"
Posted by Stamatis Zampetakis <za...@gmail.com>.
Hi Gavin,
For each JdbcSchema, there is a JdbcConvention and when the latter is
registered in the planner it creates and registers a bunch of JdbcRules
[1]. If we are talking about the same schema then I guess the description
that is generated for each rule is identical so you end up with this
exception.
Are you using the same schema? Should you? If the use-case is valid then
you may have bumped into a small bug and probably you need to figure out a
way to make the rule description unique.
Best,
Stamatis
[1]
https://github.com/apache/calcite/blob/8570cf2b293e9acab9525fbe76709d970b9f7104/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcConvention.java#L65
On Mon, Jan 31, 2022 at 10:56 PM Gavin Ray <ra...@gmail.com> wrote:
> Not sure if this is helpful, but enabling TRACE logging shows this:
>
> [Test worker] DEBUG org.apache.calcite.sql2rel - Plan after converting
> SqlNode to RelNode
> LogicalProject(ID=[$0], USER_ID=[$1], TITLE=[$2], CONTENT=[$3], ID0=[$4],
> POST_ID=[$5], CONTENT0=[$6])
> LogicalJoin(condition=[=($0, $5)], joinType=[inner])
> JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
> JdbcTableScan(table=[[db2, PUBLIC, COMMENTS]])
>
> [Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Subset cost
> changed: subset [rel#11:RelSubset#0.JDBC.PUBLIC.[]] cost was {inf} now
> {100.0 rows, 101.0 cpu, 0.0 io}
> [Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Register
> rel#7:JdbcTableScan.JDBC.PUBLIC.[](table=[db1, PUBLIC, POSTS]) in
> rel#11:RelSubset#0.JDBC.PUBLIC.[]
> [Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Rule-match
> queued: rule [JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)]
> rels [#7]
>
> java.lang.AssertionError: Rule's description should be unique; existing
> rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE); new
> rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)
>
>
> On Mon, Jan 31, 2022 at 4:42 PM Gavin Ray <ra...@gmail.com> wrote:
>
> > I took the "FrameworksTest#executeQuery()" code from the Calcite repo
> here
> > and have been using it:
> >
> >
> https://github.com/apache/calcite/blob/de847c38f3544f9c7282984f32dc1093bdb2fb60/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java#L444-L477
> >
> > Have been getting an error I don't understand.
> > I have a rootSchema, with two sub-schemas, that each have JdbcSchema's
> > from hsqldb
> >
> >
> >
> https://gist.github.com/GavinRay97/cf39a9dd92a793df506ecc2135d6da0b#file-test-kt-L68-L78
> >
> > If I query just a single schema, it works fine:
> > =============================================
> > Query: select * from db1.PUBLIC.POSTS
> >
> > -- Logical Plan
> > LogicalProject(inputs=[0..3])
> > JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
> >
> > -- Mid Plan
> > LogicalProject(subset=[rel#8:RelSubset#1.ENUMERABLE.[]], inputs=[0..3])
> > JdbcTableScan(subset=[rel#5:RelSubset#0.JDBC.PUBLIC.[]], table=[[db1,
> > PUBLIC, POSTS]])
> >
> > -- Best Plan
> > JdbcToEnumerableConverter
> > JdbcTableScan(table=[[hsqldb1, PUBLIC, POSTS]])
> >
> > If I add a JOIN though, it fails before reaching the mid-plan:
> > =============================================
> > Query:
> > select * from db1.PUBLIC.POSTS
> > inner join db2.PUBLIC.COMMENTS
> > on db1.PUBLIC.POSTS.ID = db2.PUBLIC.COMMENTS.POST_ID
> >
> > -- Logical Plan
> > LogicalProject(inputs=[0..6])
> > LogicalJoin(condition=[=($0, $5)], joinType=[inner])
> > JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
> > JdbcTableScan(table=[[db2, PUBLIC, COMMENTS]])
> >
> > java.lang.AssertionError: Rule's description should be unique;
> > existing
> rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE);
> > new rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)
> > at
> >
> org.apache.calcite.plan.AbstractRelOptPlanner.addRule(AbstractRelOptPlanner.java:163)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.addRule(VolcanoPlanner.java:418)
> > at
> >
> org.apache.calcite.adapter.jdbc.JdbcConvention.register(JdbcConvention.java:66)
> > at
> >
> org.apache.calcite.plan.AbstractRelOptPlanner.registerClass(AbstractRelOptPlanner.java:240)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1365)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
> > at
> >
> org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
> > at
> >
> org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> > at
> >
> org.apache.calcite.plan.volcano.VolcanoPlanner.changeTraits(VolcanoPlanner.java:498)
> > at CalciteUtils.executeQuery(CalciteUtils.kt:41)
> > at ForeignKeyTest.testForeignKey(ForeignKeyTest.kt:82)
> >
>
Re: Getting "AssertionError: Rule's description should be unique" after adding JOIN to query. Fails on "optPlanner.changeTraits()"
Posted by Gavin Ray <ra...@gmail.com>.
Not sure if this is helpful, but enabling TRACE logging shows this:
[Test worker] DEBUG org.apache.calcite.sql2rel - Plan after converting
SqlNode to RelNode
LogicalProject(ID=[$0], USER_ID=[$1], TITLE=[$2], CONTENT=[$3], ID0=[$4],
POST_ID=[$5], CONTENT0=[$6])
LogicalJoin(condition=[=($0, $5)], joinType=[inner])
JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
JdbcTableScan(table=[[db2, PUBLIC, COMMENTS]])
[Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Subset cost
changed: subset [rel#11:RelSubset#0.JDBC.PUBLIC.[]] cost was {inf} now
{100.0 rows, 101.0 cpu, 0.0 io}
[Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Register
rel#7:JdbcTableScan.JDBC.PUBLIC.[](table=[db1, PUBLIC, POSTS]) in
rel#11:RelSubset#0.JDBC.PUBLIC.[]
[Test worker] TRACE org.apache.calcite.plan.RelOptPlanner - Rule-match
queued: rule [JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)]
rels [#7]
java.lang.AssertionError: Rule's description should be unique; existing
rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE); new
rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)
On Mon, Jan 31, 2022 at 4:42 PM Gavin Ray <ra...@gmail.com> wrote:
> I took the "FrameworksTest#executeQuery()" code from the Calcite repo here
> and have been using it:
>
> https://github.com/apache/calcite/blob/de847c38f3544f9c7282984f32dc1093bdb2fb60/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java#L444-L477
>
> Have been getting an error I don't understand.
> I have a rootSchema, with two sub-schemas, that each have JdbcSchema's
> from hsqldb
>
>
> https://gist.github.com/GavinRay97/cf39a9dd92a793df506ecc2135d6da0b#file-test-kt-L68-L78
>
> If I query just a single schema, it works fine:
> =============================================
> Query: select * from db1.PUBLIC.POSTS
>
> -- Logical Plan
> LogicalProject(inputs=[0..3])
> JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
>
> -- Mid Plan
> LogicalProject(subset=[rel#8:RelSubset#1.ENUMERABLE.[]], inputs=[0..3])
> JdbcTableScan(subset=[rel#5:RelSubset#0.JDBC.PUBLIC.[]], table=[[db1,
> PUBLIC, POSTS]])
>
> -- Best Plan
> JdbcToEnumerableConverter
> JdbcTableScan(table=[[hsqldb1, PUBLIC, POSTS]])
>
> If I add a JOIN though, it fails before reaching the mid-plan:
> =============================================
> Query:
> select * from db1.PUBLIC.POSTS
> inner join db2.PUBLIC.COMMENTS
> on db1.PUBLIC.POSTS.ID = db2.PUBLIC.COMMENTS.POST_ID
>
> -- Logical Plan
> LogicalProject(inputs=[0..6])
> LogicalJoin(condition=[=($0, $5)], joinType=[inner])
> JdbcTableScan(table=[[db1, PUBLIC, POSTS]])
> JdbcTableScan(table=[[db2, PUBLIC, COMMENTS]])
>
> java.lang.AssertionError: Rule's description should be unique;
> existing rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE);
> new rule=JdbcToEnumerableConverterRule(in:JDBC.PUBLIC,out:ENUMERABLE)
> at
> org.apache.calcite.plan.AbstractRelOptPlanner.addRule(AbstractRelOptPlanner.java:163)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.addRule(VolcanoPlanner.java:418)
> at
> org.apache.calcite.adapter.jdbc.JdbcConvention.register(JdbcConvention.java:66)
> at
> org.apache.calcite.plan.AbstractRelOptPlanner.registerClass(AbstractRelOptPlanner.java:240)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1365)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
> at
> org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:95)
> at
> org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1270)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
> at
> org.apache.calcite.plan.volcano.VolcanoPlanner.changeTraits(VolcanoPlanner.java:498)
> at CalciteUtils.executeQuery(CalciteUtils.kt:41)
> at ForeignKeyTest.testForeignKey(ForeignKeyTest.kt:82)
>