From 412f6f9d46efef16c857261f2946a770bb50d405 Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Tue, 22 Jul 2025 16:18:16 +0900 Subject: [PATCH 1/5] Fix Cassandra case insensitive issue --- .../db/storage/cassandra/CassandraAdmin.java | 8 ++++---- .../db/storage/cassandra/CassandraAdminTest.java | 4 ++-- ...DistributedStorageAdminIntegrationTestBase.java | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java b/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java index d30bd4bbb9..86fc213e64 100644 --- a/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java @@ -139,7 +139,7 @@ private void upsertIntoNamespacesTable(String keyspace) { String insertQuery = QueryBuilder.insertInto( quoteIfNecessary(metadataKeyspace), quoteIfNecessary(NAMESPACES_TABLE)) - .value(NAMESPACES_NAME_COL, quoteIfNecessary(keyspace)) + .value(NAMESPACES_NAME_COL, keyspace) .toString(); clusterManager.getSession().execute(insertQuery); } @@ -180,7 +180,7 @@ private void deleteFromNamespacesTable(String keyspace) { String deleteQuery = QueryBuilder.delete() .from(quoteIfNecessary(metadataKeyspace), quoteIfNecessary(NAMESPACES_TABLE)) - .where(QueryBuilder.eq(NAMESPACES_NAME_COL, quoteIfNecessary(keyspace))) + .where(QueryBuilder.eq(NAMESPACES_NAME_COL, keyspace)) .toString(); clusterManager.getSession().execute(deleteQuery); } @@ -349,7 +349,7 @@ public boolean namespaceExists(String namespace) throws ExecutionException { String query = QueryBuilder.select(NAMESPACES_NAME_COL) .from(quoteIfNecessary(metadataKeyspace), quoteIfNecessary(NAMESPACES_TABLE)) - .where(QueryBuilder.eq(NAMESPACES_NAME_COL, quoteIfNecessary(namespace))) + .where(QueryBuilder.eq(NAMESPACES_NAME_COL, namespace)) .toString(); ResultSet resultSet = clusterManager.getSession().execute(query); @@ -396,7 +396,7 @@ public void addNewColumnToTable( } try { String alterTableQuery = - SchemaBuilder.alterTable(namespace, table) + SchemaBuilder.alterTable(quoteIfNecessary(namespace), quoteIfNecessary(table)) .addColumn(columnName) .type(toCassandraDataType(columnType)) .getQueryString(); diff --git a/core/src/test/java/com/scalar/db/storage/cassandra/CassandraAdminTest.java b/core/src/test/java/com/scalar/db/storage/cassandra/CassandraAdminTest.java index 679b5d0518..c8b7717adf 100644 --- a/core/src/test/java/com/scalar/db/storage/cassandra/CassandraAdminTest.java +++ b/core/src/test/java/com/scalar/db/storage/cassandra/CassandraAdminTest.java @@ -229,7 +229,7 @@ private void verifyInsertIntoKeyspacesTableQuery(String keyspace) { QueryBuilder.insertInto( quoteIfNecessary(METADATA_KEYSPACE), quoteIfNecessary(CassandraAdmin.NAMESPACES_TABLE)) - .value(CassandraAdmin.NAMESPACES_NAME_COL, quoteIfNecessary(keyspace)) + .value(CassandraAdmin.NAMESPACES_NAME_COL, keyspace) .toString(); verify(cassandraSession).execute(query); } @@ -569,7 +569,7 @@ private void verifyDeleteFromKeyspacesTableQuery(String keyspace) { .from( quoteIfNecessary(METADATA_KEYSPACE), quoteIfNecessary(CassandraAdmin.NAMESPACES_TABLE)) - .where(QueryBuilder.eq(CassandraAdmin.NAMESPACES_NAME_COL, quoteIfNecessary(keyspace))) + .where(QueryBuilder.eq(CassandraAdmin.NAMESPACES_NAME_COL, keyspace)) .toString(); verify(cassandraSession).execute(query); } diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java index 5cfe8ca034..a15346f8f8 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java @@ -36,13 +36,13 @@ public abstract class DistributedStorageAdminIntegrationTestBase { LoggerFactory.getLogger(DistributedStorageAdminIntegrationTestBase.class); private static final String TEST_NAME = "storage_admin"; - private static final String NAMESPACE1 = "int_test_" + TEST_NAME + "1"; - private static final String NAMESPACE2 = "int_test_" + TEST_NAME + "2"; - private static final String NAMESPACE3 = "int_test_" + TEST_NAME + "3"; - private static final String TABLE1 = "test_table1"; - private static final String TABLE2 = "test_table2"; - private static final String TABLE3 = "test_table3"; - private static final String TABLE4 = "test_table4"; + private static final String NAMESPACE1 = "Int_test_" + TEST_NAME + "1"; + private static final String NAMESPACE2 = "Int_test_" + TEST_NAME + "2"; + private static final String NAMESPACE3 = "Int_test_" + TEST_NAME + "3"; + private static final String TABLE1 = "Test_table1"; + private static final String TABLE2 = "Test_table2"; + private static final String TABLE3 = "Test_table3"; + private static final String TABLE4 = "Test_table4"; private static final String COL_NAME1 = "c1"; private static final String COL_NAME2 = "c2"; private static final String COL_NAME3 = "c3"; From 13d2178e1bd1bea0166236120e50b736c7c5fbaa Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Tue, 22 Jul 2025 18:20:17 +0900 Subject: [PATCH 2/5] Fix to quote the column names if necessary --- .../db/storage/cassandra/CassandraAdmin.java | 26 ++++++++++++---- ...ibutedStorageAdminIntegrationTestBase.java | 30 +++++++++---------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java b/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java index 86fc213e64..b093eb6589 100644 --- a/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java @@ -271,15 +271,21 @@ private TableMetadata createTableMetadata(com.datastax.driver.core.TableMetadata throws ExecutionException { TableMetadata.Builder builder = TableMetadata.newBuilder(); for (ColumnMetadata column : metadata.getColumns()) { - builder.addColumn(column.getName(), fromCassandraDataType(column.getType().getName())); + builder.addColumn( + unquoteIfNecessary(column.getName()), fromCassandraDataType(column.getType().getName())); } - metadata.getPartitionKey().forEach(c -> builder.addPartitionKey(c.getName())); + metadata + .getPartitionKey() + .forEach(c -> builder.addPartitionKey(unquoteIfNecessary(c.getName()))); for (int i = 0; i < metadata.getClusteringColumns().size(); i++) { - String clusteringColumnName = metadata.getClusteringColumns().get(i).getName(); + String clusteringColumnName = + unquoteIfNecessary(metadata.getClusteringColumns().get(i).getName()); ClusteringOrder clusteringOrder = metadata.getClusteringOrder().get(i); builder.addClusteringKey(clusteringColumnName, convertOrder(clusteringOrder)); } - metadata.getIndexes().forEach(i -> builder.addSecondaryIndex(i.getTarget())); + metadata + .getIndexes() + .forEach(i -> builder.addSecondaryIndex(unquoteIfNecessary(i.getTarget()))); return builder.build(); } @@ -397,7 +403,7 @@ public void addNewColumnToTable( try { String alterTableQuery = SchemaBuilder.alterTable(quoteIfNecessary(namespace), quoteIfNecessary(table)) - .addColumn(columnName) + .addColumn(quoteIfNecessary(columnName)) .type(toCassandraDataType(columnType)) .getQueryString(); @@ -686,4 +692,14 @@ public String toString() { return strategyName; } } + + private String unquoteIfNecessary(String identifier) { + if (identifier == null) { + return null; + } + if (identifier.length() >= 2 && identifier.startsWith("\"") && identifier.endsWith("\"")) { + return identifier.substring(1, identifier.length() - 1).replace("\"\"", "\""); + } + return identifier; + } } diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java index a15346f8f8..5a1828f15d 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java @@ -43,21 +43,21 @@ public abstract class DistributedStorageAdminIntegrationTestBase { private static final String TABLE2 = "Test_table2"; private static final String TABLE3 = "Test_table3"; private static final String TABLE4 = "Test_table4"; - private static final String COL_NAME1 = "c1"; - private static final String COL_NAME2 = "c2"; - private static final String COL_NAME3 = "c3"; - private static final String COL_NAME4 = "c4"; - private static final String COL_NAME5 = "c5"; - private static final String COL_NAME6 = "c6"; - private static final String COL_NAME7 = "c7"; - private static final String COL_NAME8 = "c8"; - private static final String COL_NAME9 = "c9"; - private static final String COL_NAME10 = "c10"; - private static final String COL_NAME11 = "c11"; - private static final String COL_NAME12 = "c12"; - private static final String COL_NAME13 = "c13"; - private static final String COL_NAME14 = "c14"; - private static final String COL_NAME15 = "c15"; + private static final String COL_NAME1 = "Column1"; + private static final String COL_NAME2 = "Column2"; + private static final String COL_NAME3 = "Column3"; + private static final String COL_NAME4 = "Column4"; + private static final String COL_NAME5 = "Column5"; + private static final String COL_NAME6 = "Column6"; + private static final String COL_NAME7 = "Column7"; + private static final String COL_NAME8 = "Column8"; + private static final String COL_NAME9 = "Column9"; + private static final String COL_NAME10 = "Column10"; + private static final String COL_NAME11 = "Column11"; + private static final String COL_NAME12 = "Column12"; + private static final String COL_NAME13 = "Column13"; + private static final String COL_NAME14 = "Column14"; + private static final String COL_NAME15 = "Column15"; private static final TableMetadata TABLE_METADATA = TableMetadata.newBuilder() From dfaabf15cbb2ba184f26b2885878a7e169c26ac3 Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Thu, 24 Jul 2025 16:06:43 +0900 Subject: [PATCH 3/5] Remove unnecessary unquotes --- .../scalar/db/storage/cassandra/CassandraAdmin.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java b/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java index b093eb6589..1d85327eea 100644 --- a/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/cassandra/CassandraAdmin.java @@ -271,15 +271,11 @@ private TableMetadata createTableMetadata(com.datastax.driver.core.TableMetadata throws ExecutionException { TableMetadata.Builder builder = TableMetadata.newBuilder(); for (ColumnMetadata column : metadata.getColumns()) { - builder.addColumn( - unquoteIfNecessary(column.getName()), fromCassandraDataType(column.getType().getName())); + builder.addColumn(column.getName(), fromCassandraDataType(column.getType().getName())); } - metadata - .getPartitionKey() - .forEach(c -> builder.addPartitionKey(unquoteIfNecessary(c.getName()))); + metadata.getPartitionKey().forEach(c -> builder.addPartitionKey(c.getName())); for (int i = 0; i < metadata.getClusteringColumns().size(); i++) { - String clusteringColumnName = - unquoteIfNecessary(metadata.getClusteringColumns().get(i).getName()); + String clusteringColumnName = metadata.getClusteringColumns().get(i).getName(); ClusteringOrder clusteringOrder = metadata.getClusteringOrder().get(i); builder.addClusteringKey(clusteringColumnName, convertOrder(clusteringOrder)); } From 5f747eaf4d218e515f424aad826334e66dba7207 Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Thu, 24 Jul 2025 16:27:48 +0900 Subject: [PATCH 4/5] Fix to use more complex test object names in DistributedStorage test side --- .../DistributedStorageIntegrationTestBase.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java index 0c7aa07b58..f33b4aceba 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java @@ -47,15 +47,15 @@ public abstract class DistributedStorageIntegrationTestBase { private static final Logger logger = LoggerFactory.getLogger(DistributedStorageIntegrationTestBase.class); - protected static final String TEST_NAME = "storage"; - protected static final String NAMESPACE = "int_test_" + TEST_NAME; - protected static final String TABLE = "test_table"; - protected static final String COL_NAME1 = "c1"; - protected static final String COL_NAME2 = "c2"; - protected static final String COL_NAME3 = "c3"; - protected static final String COL_NAME4 = "c4"; - protected static final String COL_NAME5 = "c5"; - protected static final String COL_NAME6 = "c6"; + protected static final String TEST_NAME = "Storage"; + protected static final String NAMESPACE = "Int_test_" + TEST_NAME; + protected static final String TABLE = "Test_table"; + protected static final String COL_NAME1 = "Column1"; + protected static final String COL_NAME2 = "Column2"; + protected static final String COL_NAME3 = "Column3"; + protected static final String COL_NAME4 = "Column4"; + protected static final String COL_NAME5 = "Column5"; + protected static final String COL_NAME6 = "Column6"; protected DistributedStorage storage; protected DistributedStorageAdmin admin; From d185d1386510f11f638ad2c0a1ef26304026483b Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Thu, 24 Jul 2025 17:51:59 +0900 Subject: [PATCH 5/5] Discard the changes in test object names --- ...ibutedStorageAdminIntegrationTestBase.java | 44 +++++++++---------- ...DistributedStorageIntegrationTestBase.java | 18 ++++---- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java index 5a1828f15d..5cfe8ca034 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java @@ -36,28 +36,28 @@ public abstract class DistributedStorageAdminIntegrationTestBase { LoggerFactory.getLogger(DistributedStorageAdminIntegrationTestBase.class); private static final String TEST_NAME = "storage_admin"; - private static final String NAMESPACE1 = "Int_test_" + TEST_NAME + "1"; - private static final String NAMESPACE2 = "Int_test_" + TEST_NAME + "2"; - private static final String NAMESPACE3 = "Int_test_" + TEST_NAME + "3"; - private static final String TABLE1 = "Test_table1"; - private static final String TABLE2 = "Test_table2"; - private static final String TABLE3 = "Test_table3"; - private static final String TABLE4 = "Test_table4"; - private static final String COL_NAME1 = "Column1"; - private static final String COL_NAME2 = "Column2"; - private static final String COL_NAME3 = "Column3"; - private static final String COL_NAME4 = "Column4"; - private static final String COL_NAME5 = "Column5"; - private static final String COL_NAME6 = "Column6"; - private static final String COL_NAME7 = "Column7"; - private static final String COL_NAME8 = "Column8"; - private static final String COL_NAME9 = "Column9"; - private static final String COL_NAME10 = "Column10"; - private static final String COL_NAME11 = "Column11"; - private static final String COL_NAME12 = "Column12"; - private static final String COL_NAME13 = "Column13"; - private static final String COL_NAME14 = "Column14"; - private static final String COL_NAME15 = "Column15"; + private static final String NAMESPACE1 = "int_test_" + TEST_NAME + "1"; + private static final String NAMESPACE2 = "int_test_" + TEST_NAME + "2"; + private static final String NAMESPACE3 = "int_test_" + TEST_NAME + "3"; + private static final String TABLE1 = "test_table1"; + private static final String TABLE2 = "test_table2"; + private static final String TABLE3 = "test_table3"; + private static final String TABLE4 = "test_table4"; + private static final String COL_NAME1 = "c1"; + private static final String COL_NAME2 = "c2"; + private static final String COL_NAME3 = "c3"; + private static final String COL_NAME4 = "c4"; + private static final String COL_NAME5 = "c5"; + private static final String COL_NAME6 = "c6"; + private static final String COL_NAME7 = "c7"; + private static final String COL_NAME8 = "c8"; + private static final String COL_NAME9 = "c9"; + private static final String COL_NAME10 = "c10"; + private static final String COL_NAME11 = "c11"; + private static final String COL_NAME12 = "c12"; + private static final String COL_NAME13 = "c13"; + private static final String COL_NAME14 = "c14"; + private static final String COL_NAME15 = "c15"; private static final TableMetadata TABLE_METADATA = TableMetadata.newBuilder() diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java index f33b4aceba..0c7aa07b58 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageIntegrationTestBase.java @@ -47,15 +47,15 @@ public abstract class DistributedStorageIntegrationTestBase { private static final Logger logger = LoggerFactory.getLogger(DistributedStorageIntegrationTestBase.class); - protected static final String TEST_NAME = "Storage"; - protected static final String NAMESPACE = "Int_test_" + TEST_NAME; - protected static final String TABLE = "Test_table"; - protected static final String COL_NAME1 = "Column1"; - protected static final String COL_NAME2 = "Column2"; - protected static final String COL_NAME3 = "Column3"; - protected static final String COL_NAME4 = "Column4"; - protected static final String COL_NAME5 = "Column5"; - protected static final String COL_NAME6 = "Column6"; + protected static final String TEST_NAME = "storage"; + protected static final String NAMESPACE = "int_test_" + TEST_NAME; + protected static final String TABLE = "test_table"; + protected static final String COL_NAME1 = "c1"; + protected static final String COL_NAME2 = "c2"; + protected static final String COL_NAME3 = "c3"; + protected static final String COL_NAME4 = "c4"; + protected static final String COL_NAME5 = "c5"; + protected static final String COL_NAME6 = "c6"; protected DistributedStorage storage; protected DistributedStorageAdmin admin;