Ulrich Kramer created CALCITE-5832: -------------------------------------- Summary: 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
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)