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)
>