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