From 79f72c63b9dc9613995d64e3c7396db06c728064 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 30 Mar 2020 10:14:25 +0200 Subject: [PATCH] DATACASS-747 - Quote identifiers that start with underscore. We now quote identifiers that begin with an underscore such as "_a". --- .../data/cassandra/core/cql/CqlIdentifier.java | 3 ++- .../cassandra/core/cql/CqlIdentifierUnitTests.java | 2 +- .../mapping/CassandraMappingContextUnitTests.java | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java index a7e6cdb19..c3a02a850 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java @@ -177,7 +177,8 @@ public final class CqlIdentifier implements Comparable, Serializa * @since 2.2 */ public static boolean requiresQuoting(CharSequence chars) { - return QUOTED.matcher(chars).matches() || ReservedKeyword.isReserved(chars); + return QUOTED.matcher(chars).matches() || ReservedKeyword.isReserved(chars) + || (chars.length() > 0 && chars.charAt(0) == '_'); } /** diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java index 615c93a9b..e9af25778 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java @@ -68,7 +68,7 @@ public class CqlIdentifierUnitTests { @Test public void testIllegals() { - String[] illegals = new String[] { null, "", "a ", "a a", "a\"", "a'", "a''", "\"\"", "''", "-", "a-", "_", "_a" }; + String[] illegals = new String[] { null, "", "a ", "a a", "a\"", "a'", "a''", "\"\"", "''", "-", "a-"}; for (String illegal : illegals) { try { of(illegal); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java index f77e2bcef..16a6f3be9 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java @@ -626,6 +626,15 @@ public class CassandraMappingContextUnitTests { assertThat(mappingContext.usesTable(CqlIdentifier.of(tableMetadata.getName()))).isFalse(); } + @Test // DATACASS-747 + public void shouldQuoteFieldName() { + + BasicCassandraPersistentEntity entity = mappingContext.getRequiredPersistentEntity(UnsupportedFieldNames.class); + + CassandraPersistentProperty property = entity.getRequiredPersistentProperty("_ent1"); + assertThat(property.getColumnName()).isEqualTo(CqlIdentifier.quoted("_ent1")); + } + @Table private static class InvalidEntityWithIdAndPrimaryKeyColumn { @Id String foo; @@ -753,4 +762,9 @@ public class CassandraMappingContextUnitTests { @Id String id; Map untyped; } + + class UnsupportedFieldNames { + String _ent1; + String _ent2; + } }