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)