[
https://issues.apache.org/jira/browse/CALCITE-5832?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17741876#comment-17741876
]
Ulrich Kramer commented on CALCITE-5832:
----------------------------------------
This log statement is never reached. The exception is thrown a few lines above
{code}
...
Caused by: java.lang.RuntimeException: Error while applying rule
EnumerableMergeJoinRule(in:NONE,out:ENUMERABLE), args
[rel#416:LogicalJoin.NONE.[](left=RelSubset#556,right=RelSubset#72,condition==($10,
$15),joinType=left)]
at
org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:250)
at
org.apache.calcite.plan.volcano.IterativeRuleDriver.drive(IterativeRuleDriver.java:59)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:523)
at
org.apache.calcite.tools.Programs.lambda$standard$3(Programs.java:276)
at
org.apache.calcite.tools.Programs$SequenceProgram.run(Programs.java:337)
at org.apache.calcite.prepare.Prepare.optimize(Prepare.java:177)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:312)
at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:220)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:665)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:519)
at
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:487)
at
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:236)
at
org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement_(CalciteConnectionImpl.java:216)
... 63 more
Caused by: java.lang.RuntimeException: Error occurred while applying rule
EnumerableMergeJoinRule(in:NONE,out:ENUMERABLE)
at
org.apache.calcite.plan.volcano.VolcanoRuleCall.transformTo(VolcanoRuleCall.java:157)
at
org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:273)
at
org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:288)
at
org.apache.calcite.rel.convert.ConverterRule.onMatch(ConverterRule.java:174)
at
org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:223)
... 75 more
Caused by: org.apache.calcite.rel.metadata.CyclicMetadataException
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount(Unknown
Source)
at
app//org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:258)
at
app//org.apache.calcite.rel.metadata.RelMdRowCount.getRowCount(RelMdRowCount.java:145)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount(Unknown
Source)
at
app//org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:258)
at
app//org.apache.calcite.rel.metadata.RelMdRowCount.getRowCount(RelMdRowCount.java:73)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount(Unknown
Source)
at
app//org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:258)
at
app//org.apache.calcite.rel.metadata.RelMdRowCount.getRowCount(RelMdRowCount.java:174)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount(Unknown
Source)
at
app//org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:258)
at
app//org.apache.calcite.rel.metadata.RelMdRowCount.getRowCount(RelMdRowCount.java:73)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_RowCountHandler.getRowCount(Unknown
Source)
at
app//org.apache.calcite.rel.metadata.RelMetadataQuery.getRowCount(RelMetadataQuery.java:258)
at
app//org.apache.calcite.rel.core.Project.computeSelfCost(Project.java:267)
at
app//org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows.getNonCumulativeCost(RelMdPercentageOriginalRows.java:187)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_NonCumulativeCostHandler.getNonCumulativeCost_$(Unknown
Source)
at
org.apache.calcite.rel.metadata.janino.GeneratedMetadata_NonCumulativeCostHandler.getNonCumulativeCost(Unknown
Source)
at
app//org.apache.calcite.rel.metadata.RelMetadataQuery.getNonCumulativeCost(RelMetadataQuery.java:331)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.getCost(VolcanoPlanner.java:727)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.getCostOrInfinite(VolcanoPlanner.java:714)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.propagateCostImprovements(VolcanoPlanner.java:971)
at
app//org.apache.calcite.plan.volcano.RelSet.mergeWith(RelSet.java:447)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.merge(VolcanoPlanner.java:1167)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.registerSubset(VolcanoPlanner.java:1427)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1308)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:598)
at
app//org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:613)
at
app//org.apache.calcite.plan.volcano.VolcanoRuleCall.transformTo(VolcanoRuleCall.java:144)
... 79 more
{code}
> CyclicMetadataException thrown in complex JOIN
> ----------------------------------------------
>
> Key: CALCITE-5832
> URL: https://issues.apache.org/jira/browse/CALCITE-5832
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.34.0
> Reporter: Ulrich Kramer
> Priority: Major
>
> Adding the following unit test to {{JdbcAdapterTest}} reproduces the error
> {code:java}
> @Test void testJdbcCyclicMetadata() throws Exception {
> final String url = MultiJdbcSchemaJoinTest.TempDb.INSTANCE.getUrl();
> Connection baseConnection = DriverManager.getConnection(url);
> Statement baseStmt = baseConnection.createStatement();
> baseStmt.execute("CREATE TABLE T1 (\n"
> + "\"contentViewsCount\" INTEGER,\n" +
> "\"isExpired\" BOOLEAN,\n" +
> "\"metadataPreviewUrl\" VARCHAR(100),\n" +
> "\"format\" VARCHAR(100),\n" +
> "\"description\" VARCHAR(100),\n" +
> "\"language\" VARCHAR(100),\n" +
> "\"assetTitle\" VARCHAR(100),\n" +
> "\"assetType\" VARCHAR(100),\n" +
> "\"contentType\" VARCHAR(100),\n" +
> "\"doi\" VARCHAR(100),\n" +
> "\"crmBpn\" VARCHAR(100),\n" +
> "PRIMARY KEY(\"doi\"))");
> baseStmt.execute("CREATE TABLE T2 (\n"
> + "\"doi\" VARCHAR(100),\n" +
> "\"industry\" VARCHAR(100),\n" +
> "PRIMARY KEY(\"doi\", \"industry\"))");
> baseStmt.execute("CREATE TABLE T3 (\n"
> + "\"semaphoreId\" VARCHAR(100),\n" +
> "\"name\" VARCHAR(100),\n" +
> "\"industryId\" VARCHAR(100),\n" +
> "PRIMARY KEY(\"semaphoreId\"))");
> baseStmt.execute("CREATE TABLE T4 (\n"
> + "\"contentViewsCount\" INTEGER,\n" +
> "\"CRM_Account_ID\" VARCHAR(100),\n" +
> "\"CRM_Account_Name\" VARCHAR(100),\n" +
> "PRIMARY KEY(\"CRM_Account_ID\"))");
> baseStmt.close();
> baseConnection.commit();
> Properties info = new Properties();
> info.put("model",
> "inline:"
> + "{\n"
> + " version: '1.0',\n"
> + " defaultSchema: 'BASEJDBC',\n"
> + " schemas: [\n"
> + " {\n"
> + " type: 'jdbc',\n"
> + " name: 'BASEJDBC',\n"
> + " jdbcDriver: '" + jdbcDriver.class.getName() + "',\n"
> + " jdbcUrl: '" + url + "',\n"
> + " jdbcCatalog: null,\n"
> + " jdbcSchema: null\n"
> + " }\n"
> + " ]\n"
> + "}");
> final Connection calciteConnection =
> DriverManager.getConnection("jdbc:calcite:", info);
> ResultSet rs = calciteConnection
> .prepareStatement("SELECT \"_metadata.status\", \"doi\",
> \"industry.title\", " +
> "\"crm_account.crm_account_name\", \"assettitle\",
> \"description\", \"assettype\", " +
> "\"format\", \"contentviewscount\", \"metadatapreviewurl\",
> \"language\", " +
> "\"contenttype\", \"isexpired\" FROM (select\n" +
> " \"A\".\"contentViewsCount\" \"contentviewscount\",\n" +
> " \"A\".\"isExpired\" \"isexpired\",\n" +
> " \"A\".\"metadataPreviewUrl\" \"metadatapreviewurl\",\n" +
> " \"A\".\"format\" \"format\",\n" +
> " \"A\".\"description\" \"description\",\n" +
> " \"A\".\"language\" \"language\",\n" +
> " \"A\".\"assetTitle\" \"assettitle\",\n" +
> " \"A\".\"assetType\" \"assettype\",\n" +
> " \"A\".\"contentType\" \"contenttype\",\n" +
> " \"A\".\"doi\" \"doi\",\n" +
> " null \"_metadata.status\",\n" +
> " \"D\".\"industry.title\" \"industry.title\",\n" +
> " \"F\".\"crm_account.crm_account_name\"
> \"crm_account.crm_account_name\"\n" +
> "from \"T1\" \"A\"\n" +
> " left outer join \"T2\" \"B\"\n" +
> " on \"A\".\"doi\" = \"B\".\"doi\"\n" +
> " left outer join (\n" +
> " select\n" +
> " \"C\".\"semaphoreId\" \"industry.semaphoreId\",\n" +
> " \"C\".\"name\" \"industry.title\"\n" +
> " from \"T3\" \"C\"\n" +
> " ) \"D\"\n" +
> " on \"B\".\"industry\" = \"D\".\"industry.semaphoreId\"\n" +
> " left outer join (\n" +
> " select\n" +
> " \"E\".\"CRM_Account_ID\"
> \"crm_account.CRM_Account_ID\",\n" +
> " \"E\".\"CRM_Account_Name\"
> \"crm_account.crm_account_name\"\n" +
> " from \"T4\" \"E\"\n" +
> " ) \"F\"\n" +
> " on \"A\".\"crmBpn\" = \"F\".\"crm_account" +
> ".CRM_Account_ID\")\n" +
> "WHERE (\"isexpired\" = ?)\n" +
> "AND (\"language\" IN (?, ?))\n" +
> "AND (\"contenttype\" IN (?, ?))\n" +
> "AND (\"doi\" IN (?))\n" +
> "ORDER BY \"doi\" ASC\n" +
> "LIMIT 500 OFFSET 0").executeQuery();
> assertThat(rs.next(), is(true));
> assertThat(rs.getObject(1), equalTo(20L));
> assertThat(rs.next(), is(false));
> rs.close();
> calciteConnection.close();
> }
> {code}
> The exception is triggered by adding the {{ORDER BY "doi"}} statement.
> I already tried several things. I caught the exception in
> {{VolcanoPlanner::getCostOrInfinite}} and returned {{infCost}}. But this
> leads to a {{StackOverflowException}} at another place.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)