Skip to content

By default R2DBC uses quoted identifiers #2066

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>4.0.0-SNAPSHOT</version>
<version>4.0.0-1993-force-quoting-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Spring Data Relational Parent</name>
Expand Down
2 changes: 1 addition & 1 deletion spring-data-jdbc-distribution/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>4.0.0-SNAPSHOT</version>
<version>4.0.0-1993-force-quoting-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
4 changes: 2 additions & 2 deletions spring-data-jdbc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>

<artifactId>spring-data-jdbc</artifactId>
<version>4.0.0-SNAPSHOT</version>
<version>4.0.0-1993-force-quoting-SNAPSHOT</version>

<name>Spring Data JDBC</name>
<description>Spring Data module for JDBC repositories.</description>
Expand All @@ -15,7 +15,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>4.0.0-SNAPSHOT</version>
<version>4.0.0-1993-force-quoting-SNAPSHOT</version>
</parent>

<properties>
Expand Down
4 changes: 2 additions & 2 deletions spring-data-r2dbc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>

<artifactId>spring-data-r2dbc</artifactId>
<version>4.0.0-SNAPSHOT</version>
<version>4.0.0-1993-force-quoting-SNAPSHOT</version>

<name>Spring Data R2DBC</name>
<description>Spring Data module for R2DBC</description>
Expand All @@ -15,7 +15,7 @@
<parent>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-relational-parent</artifactId>
<version>4.0.0-SNAPSHOT</version>
<version>4.0.0-1993-force-quoting-SNAPSHOT</version>
</parent>

<properties>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class R2dbcMappingContext extends RelationalMappingContext {
* Create a new {@link R2dbcMappingContext}.
*/
public R2dbcMappingContext() {
setForceQuote(false);
setForceQuote(true);
}

/**
Expand All @@ -41,8 +41,10 @@ public R2dbcMappingContext() {
* @param namingStrategy must not be {@literal null}.
*/
public R2dbcMappingContext(NamingStrategy namingStrategy) {

super(namingStrategy);
setForceQuote(false);

setForceQuote(true);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ void shouldNotWriteReadOnlyFields() {
toSave.readOnlyField = "readonly";
toSave.readOnlyArrayField = "readonly_array".getBytes();

assertThat(getStrategy().getOutboundRow(toSave)).containsOnlyKeys(SqlIdentifier.unquoted("writable_field"));
assertThat(getStrategy().getOutboundRow(toSave)).containsOnlyKeys(SqlIdentifier.quoted("writable_field"));
}

private <T> void testType(BiConsumer<PrimitiveTypes, T> setter, Function<PrimitiveTypes, T> getter, T testValue,
Expand All @@ -201,7 +201,7 @@ private <T> void testType(BiConsumer<PrimitiveTypes, T> setter, Function<Primiti
PrimitiveTypes toSave = new PrimitiveTypes();
setter.accept(toSave, testValue);

assertThat(strategy.getOutboundRow(toSave)).containsEntry(SqlIdentifier.unquoted(fieldname),
assertThat(strategy.getOutboundRow(toSave)).containsEntry(SqlIdentifier.quoted(fieldname),
Parameter.from(testValue));

when(rowMock.get(fieldname)).thenReturn(testValue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ void shouldMapSomeNestedCriteria() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("((person.name = ?[$1]))");
assertThat(bindings.getCondition()).hasToString("((person.\"NAME\" = ?[$1]))");
}

@Test // gh-289
Expand All @@ -133,8 +133,10 @@ void shouldMapNestedGroup() {

BoundCondition bindings = map(criteria);

// name is a property and therefore gets the normal quoting behaviour.
// age is not a property and terefore gets used as is.
assertThat(bindings.getCondition()).hasToString(
"(person.name = ?[$1]) AND (person.name = ?[$2] OR person.age < ?[$3] OR (person.name != ?[$4] AND person.age > ?[$5]))");
"(person.\"NAME\" = ?[$1]) AND (person.\"NAME\" = ?[$2] OR person.age < ?[$3] OR (person.\"NAME\" != ?[$4] AND person.age > ?[$5]))");
}

@Test // gh-289
Expand All @@ -150,7 +152,7 @@ void shouldMapFrom() {
BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition())
.hasToString("person.name = ?[$1] AND (person.name = ?[$2] OR person.age < ?[$3])");
.hasToString("person.\"NAME\" = ?[$1] AND (person.\"NAME\" = ?[$2] OR person.age < ?[$3])");
}

@Test // gh-383
Expand All @@ -160,13 +162,13 @@ void shouldMapFromConcat() {
.or("age").lessThan(49));

assertThat(map(criteria).getCondition())
.hasToString("(person.name = ?[$1] AND (person.name = ?[$2] OR person.age < ?[$3]))");
.hasToString("(person.\"NAME\" = ?[$1] AND (person.\"NAME\" = ?[$2] OR person.age < ?[$3]))");

criteria = Criteria.from(Criteria.where("name").is("Foo"), Criteria.where("name").is("Bar") //
.or("age").lessThan(49), Criteria.where("foo").is("bar"));

assertThat(map(criteria).getCondition())
.hasToString("(person.name = ?[$1] AND (person.name = ?[$2] OR person.age < ?[$3]) AND (person.foo = ?[$4]))");
.hasToString("(person.\"NAME\" = ?[$1] AND (person.\"NAME\" = ?[$2] OR person.age < ?[$3]) AND (person.foo = ?[$4]))");
}

@Test // gh-64
Expand All @@ -176,7 +178,7 @@ void shouldMapSimpleCriteria() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name = ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" = ?[$1]");

bindings.getBindings().apply(bindTarget);
verify(bindTarget).bind(0, "foo");
Expand Down Expand Up @@ -218,7 +220,7 @@ void shouldMapExpression() {
Expression mappedObject = mapper.getMappedObject(table.column("alternative").as("my_aliased_col"),
mapper.getMappingContext().getRequiredPersistentEntity(Person.class));

assertThat(mappedObject).hasToString("my_aliased_table.another_name AS my_aliased_col");
assertThat(mappedObject).hasToString("my_aliased_table.\"another_name\" AS my_aliased_col");
}

@Test // gh-300
Expand All @@ -229,7 +231,7 @@ void shouldMapCountFunction() {
Expression mappedObject = mapper.getMappedObject(Functions.count(table.column("alternative")),
mapper.getMappingContext().getRequiredPersistentEntity(Person.class));

assertThat(mappedObject).hasToString("COUNT(my_aliased_table.another_name)");
assertThat(mappedObject).hasToString("COUNT(my_aliased_table.\"another_name\")");
}

@Test // gh-300
Expand Down Expand Up @@ -260,7 +262,7 @@ void shouldMapSimpleNullableCriteria() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name = ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" = ?[$1]");

bindings.getBindings().apply(bindTarget);
verify(bindTarget).bindNull(0, Integer.class);
Expand All @@ -273,7 +275,7 @@ void shouldConsiderColumnName() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.another_name = ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"another_name\" = ?[$1]");
}

@Test // gh-64
Expand All @@ -283,7 +285,7 @@ void shouldMapAndCriteria() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name = ?[$1] AND person.bar = ?[$2]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" = ?[$1] AND person.bar = ?[$2]");

bindings.getBindings().apply(bindTarget);
verify(bindTarget).bind(0, "foo");
Expand All @@ -297,7 +299,7 @@ void shouldMapOrCriteria() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name = ?[$1] OR person.bar = ?[$2]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" = ?[$1] OR person.bar = ?[$2]");
}

@Test // gh-64
Expand All @@ -311,7 +313,7 @@ void shouldMapAndOrCriteria() {
BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString(
"person.name = ?[$1] AND person.name IS NOT NULL OR person.bar = ?[$2] AND person.anotherOne = ?[$3]");
"person.\"NAME\" = ?[$1] AND person.\"NAME\" IS NOT NULL OR person.bar = ?[$2] AND person.anotherOne = ?[$3]");
}

@Test // gh-64
Expand All @@ -321,7 +323,7 @@ void shouldMapNeq() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name != ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" != ?[$1]");
}

@Test // gh-64
Expand All @@ -331,7 +333,7 @@ void shouldMapIsNull() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name IS NULL");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" IS NULL");
}

@Test // gh-64
Expand All @@ -341,7 +343,7 @@ void shouldMapIsNotNull() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name IS NOT NULL");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" IS NOT NULL");
}

@Test // gh-64
Expand All @@ -351,7 +353,7 @@ void shouldMapIsIn() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name IN (?[$1], ?[$2], ?[$3])");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" IN (?[$1], ?[$2], ?[$3])");
}

@Test // gh-64, gh-177
Expand All @@ -361,7 +363,7 @@ void shouldMapIsNotIn() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name NOT IN (?[$1], ?[$2], ?[$3])");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" NOT IN (?[$1], ?[$2], ?[$3])");
}

@Test
Expand All @@ -374,7 +376,7 @@ void shouldMapIsNotInWithCollectionToStringConverter() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name NOT IN (?[$1], ?[$2], ?[$3])");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" NOT IN (?[$1], ?[$2], ?[$3])");
}

@Test // gh-64
Expand All @@ -384,7 +386,7 @@ void shouldMapIsGt() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name > ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" > ?[$1]");
}

@Test // gh-64
Expand All @@ -394,7 +396,7 @@ void shouldMapIsGte() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name >= ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" >= ?[$1]");
}

@Test // gh-64
Expand All @@ -404,7 +406,7 @@ void shouldMapIsLt() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name < ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" < ?[$1]");
}

@Test // gh-64
Expand All @@ -414,7 +416,7 @@ void shouldMapIsLte() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name <= ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" <= ?[$1]");
}

@Test // gh-64
Expand All @@ -424,7 +426,7 @@ void shouldMapIsLike() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.name LIKE ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"NAME\" LIKE ?[$1]");
}

@Test // GH-1507
Expand Down Expand Up @@ -493,7 +495,7 @@ void mapQueryForEnumArrayShouldMapToStringList() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.enum_value IN (?[$1], ?[$2])");
assertThat(bindings.getCondition()).hasToString("person.\"ENUM_VALUE\" IN (?[$1], ?[$2])");
}

@Test // gh-733
Expand All @@ -503,7 +505,7 @@ void shouldMapBooleanConditionProperly() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.state = ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"STATE\" = ?[$1]");
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo(false);
}

Expand All @@ -515,7 +517,7 @@ void shouldMapAndConvertBooleanConditionProperly() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.state = ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"STATE\" = ?[$1]");
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo((byte) 1);
}

Expand All @@ -526,7 +528,7 @@ void shouldMapJsonNodeToString() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.json_node = ?[$1]");
assertThat(bindings.getCondition()).hasToString("person.\"JSON_NODE\" = ?[$1]");
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo("foo");
}

Expand All @@ -537,7 +539,7 @@ void shouldMapJsonNodeListToString() {

BoundCondition bindings = map(criteria);

assertThat(bindings.getCondition()).hasToString("person.json_node IN (?[$1], ?[$2])");
assertThat(bindings.getCondition()).hasToString("person.\"JSON_NODE\" IN (?[$1], ?[$2])");
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo("foo");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ void shouldMapFieldNamesInUpdate() {
Map<SqlIdentifier, Expression> assignments = mapped.getAssignments().stream().map(it -> (AssignValue) it)
.collect(Collectors.toMap(k -> k.getColumn().getName(), AssignValue::getValue));

assertThat(assignments).containsEntry(SqlIdentifier.unquoted("another_name"), SQL.bindMarker("$1"));
assertThat(assignments).containsEntry(SqlIdentifier.quoted("another_name"), SQL.bindMarker("$1"));
}

@Test // gh-64
Expand All @@ -73,7 +73,7 @@ void shouldUpdateToSettableValue() {
Map<SqlIdentifier, Expression> assignments = mapped.getAssignments().stream().map(it -> (AssignValue) it)
.collect(Collectors.toMap(k -> k.getColumn().getName(), AssignValue::getValue));

assertThat(assignments).containsEntry(SqlIdentifier.unquoted("another_name"), SQL.bindMarker("$1"));
assertThat(assignments).containsEntry(SqlIdentifier.quoted("another_name"), SQL.bindMarker("$1"));

mapped.getBindings().apply(bindTarget);
verify(bindTarget).bindNull(0, String.class);
Expand All @@ -87,7 +87,7 @@ void shouldUpdateToNull() {
BoundAssignments mapped = map(update);

assertThat(mapped.getAssignments()).hasSize(1);
assertThat(mapped.getAssignments().get(0).toString()).isEqualTo("person.another_name = NULL");
assertThat(mapped.getAssignments().get(0).toString()).isEqualTo("person.\"another_name\" = NULL");

mapped.getBindings().apply(bindTarget);
verifyNoInteractions(bindTarget);
Expand Down
Loading