diff --git a/agents/drivers/cassandra/src/main/java/com/dbx/agent/cassandra/CassandraAgent.java b/agents/drivers/cassandra/src/main/java/com/dbx/agent/cassandra/CassandraAgent.java index 8d68245ab..6ef9f34da 100644 --- a/agents/drivers/cassandra/src/main/java/com/dbx/agent/cassandra/CassandraAgent.java +++ b/agents/drivers/cassandra/src/main/java/com/dbx/agent/cassandra/CassandraAgent.java @@ -163,7 +163,13 @@ public final class CassandraAgent extends AbstractJdbcAgent { String baseUrl = "jdbc:cassandra://" + params.getHost() + ":" + params.getPort(); String keyspace = coalesce(params.getDatabase()).trim(); // Cassandra rejects an empty keyspace path; omit it so DBX can connect first and list keyspaces. - return keyspace.isEmpty() ? baseUrl : baseUrl + "/" + keyspace; + String url = keyspace.isEmpty() ? baseUrl : baseUrl + "/" + keyspace; + // Multi-DC clusters require localdatacenter= + String extraParams = coalesce(params.getUrl_params()).trim(); + while (extraParams.startsWith("?") || extraParams.startsWith("&")) { + extraParams = extraParams.substring(1); + } + return extraParams.isEmpty() ? url : url + "?" + extraParams; } private static List targetColumns(String options) { diff --git a/agents/drivers/cassandra/src/test/java/com/dbx/agent/cassandra/CassandraAgentTest.java b/agents/drivers/cassandra/src/test/java/com/dbx/agent/cassandra/CassandraAgentTest.java index 3dabb472c..4eb9e6be6 100644 --- a/agents/drivers/cassandra/src/test/java/com/dbx/agent/cassandra/CassandraAgentTest.java +++ b/agents/drivers/cassandra/src/test/java/com/dbx/agent/cassandra/CassandraAgentTest.java @@ -31,4 +31,22 @@ class CassandraAgentTest extends JdbcFakeExecutionBehaviorTest { assertEquals("jdbc:cassandra://127.0.0.1:9042/app_keyspace", CassandraAgent.buildUrl(params)); } + + @Test + void appendsUrlParamsForMultiDcLocalDatacenter() { + ConnectParams params = new ConnectParams( + "127.0.0.1", 9042, "app_keyspace", "cassandra", "cassandra", "localdatacenter=dc1", "", false + ); + + assertEquals("jdbc:cassandra://127.0.0.1:9042/app_keyspace?localdatacenter=dc1", CassandraAgent.buildUrl(params)); + } + + @Test + void stripsLeadingQuestionMarkFromUrlParams() { + ConnectParams params = new ConnectParams( + "127.0.0.1", 9042, "", "cassandra", "cassandra", "?localdatacenter=dc1", "", false + ); + + assertEquals("jdbc:cassandra://127.0.0.1:9042?localdatacenter=dc1", CassandraAgent.buildUrl(params)); + } } diff --git a/apps/desktop/src/components/connection/ConnectionDialog.vue b/apps/desktop/src/components/connection/ConnectionDialog.vue index 76f2f3db1..2eff0f04a 100644 --- a/apps/desktop/src/components/connection/ConnectionDialog.vue +++ b/apps/desktop/src/components/connection/ConnectionDialog.vue @@ -4575,7 +4575,9 @@ function openExternalUrl(url: string) { ? 'CLIENT_LOCALE=en_US.utf8;DB_LOCALE=en_US.utf8' : form.db_type === 'spark' ? 'catalog=paimon_catalog' - : 'sslmode=disable' + : form.db_type === 'cassandra' + ? 'localdatacenter=dc1' + : 'sslmode=disable' " />