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 <[email protected]> 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 <[email protected]> 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)
> >
>

Reply via email to