diff --git a/pom.xml b/pom.xml index eaee823fa0..83e9e0993e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT pom Spring Data Relational Parent diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml index b3c39e64c3..c0cf7c24a7 100644 --- a/spring-data-jdbc-distribution/pom.xml +++ b/spring-data-jdbc-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT ../pom.xml diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml index e61fd64020..753b0846d2 100644 --- a/spring-data-jdbc/pom.xml +++ b/spring-data-jdbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-jdbc - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT Spring Data JDBC Spring Data module for JDBC repositories. @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT diff --git a/spring-data-r2dbc/pom.xml b/spring-data-r2dbc/pom.xml index 3ee76fd3c1..f228bc9bcb 100644 --- a/spring-data-r2dbc/pom.xml +++ b/spring-data-r2dbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-r2dbc - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT Spring Data R2DBC Spring Data module for R2DBC @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT diff --git a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java index 5053291be6..76357d90e7 100644 --- a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java +++ b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java @@ -25,6 +25,7 @@ * R2DBC-specific extension to {@link RelationalMappingContext}. * * @author Mark Paluch + * @author Jens Schauder */ public class R2dbcMappingContext extends RelationalMappingContext { @@ -32,7 +33,7 @@ public class R2dbcMappingContext extends RelationalMappingContext { * Create a new {@link R2dbcMappingContext}. */ public R2dbcMappingContext() { - setForceQuote(false); + setForceQuote(true); } /** @@ -41,8 +42,10 @@ public R2dbcMappingContext() { * @param namingStrategy must not be {@literal null}. */ public R2dbcMappingContext(NamingStrategy namingStrategy) { + super(namingStrategy); - setForceQuote(false); + + setForceQuote(true); } @Override diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/config/H2IntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/config/H2IntegrationTests.java index bef0c43925..0f87756ae3 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/config/H2IntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/config/H2IntegrationTests.java @@ -42,6 +42,7 @@ * Integration test for {@link DatabaseClient} and repositories using H2. * * @author Mark Paluch + * @author Jens Schauder */ @ExtendWith(SpringExtension.class) @ContextConfiguration @@ -56,7 +57,7 @@ class H2IntegrationTests { void before() { try { - jdbc.execute("DROP TABLE legoset"); + jdbc.execute("DROP TABLE \"legoset\""); } catch (DataAccessException e) {} jdbc.execute(H2TestSupport.CREATE_TABLE_LEGOSET); } @@ -64,9 +65,9 @@ void before() { @Test // gh-109 void shouldSelectCountWithDatabaseClient() { - jdbc.execute("INSERT INTO legoset (id, name, manual) VALUES(42055, 'SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (id, name, manual) VALUES(42055, 'SCHAUFELRADBAGGER', 12)"); - databaseClient.sql("SELECT COUNT(*) FROM legoset") // + databaseClient.sql("SELECT COUNT(*) FROM \"legoset\"") // .map(it -> it.get(0, Long.class)) // .all() // .as(StepVerifier::create) // @@ -77,7 +78,7 @@ void shouldSelectCountWithDatabaseClient() { @Test // gh-109 void shouldSelectCountWithRepository() { - jdbc.execute("INSERT INTO legoset (id, name, manual) VALUES(42055, 'SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (id, name, manual) VALUES(42055, 'SCHAUFELRADBAGGER', 12)"); repository.selectCount() // .as(StepVerifier::create) // @@ -99,7 +100,7 @@ public ConnectionFactory connectionFactory() { interface H2Repository extends ReactiveCrudRepository { - @Query("SELECT COUNT(*) FROM legoset") + @Query("SELECT COUNT(*) FROM \"legoset\"") Mono selectCount(); } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverterUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverterUnitTests.java index 1dc70a1f48..a749f5ada7 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverterUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverterUnitTests.java @@ -15,11 +15,21 @@ */ package org.springframework.data.r2dbc.convert; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + import io.r2dbc.spi.R2dbcType; import io.r2dbc.spi.Row; import io.r2dbc.spi.test.MockColumnMetadata; import io.r2dbc.spi.test.MockRow; import io.r2dbc.spi.test.MockRowMetadata; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; @@ -37,19 +47,11 @@ import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.r2dbc.core.Parameter; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - /** * Unit tests for {@link MappingR2dbcConverter}. * * @author Mark Paluch + * @author Jens Schauder */ public class MappingR2dbcConverterUnitTests { @@ -78,11 +80,11 @@ void shouldIncludeAllPropertiesInOutboundRow() { LocalDateTime localDateTime = LocalDateTime.now(); converter.write(new Person("id", "Walter", "White", instant, localDateTime), row); - assertThat(row).containsEntry(SqlIdentifier.unquoted("id"), Parameter.fromOrEmpty("id", String.class)); - assertThat(row).containsEntry(SqlIdentifier.unquoted("firstname"), Parameter.fromOrEmpty("Walter", String.class)); - assertThat(row).containsEntry(SqlIdentifier.unquoted("lastname"), Parameter.fromOrEmpty("White", String.class)); - assertThat(row).containsEntry(SqlIdentifier.unquoted("instant"), Parameter.from(instant)); - assertThat(row).containsEntry(SqlIdentifier.unquoted("local_date_time"), Parameter.from(localDateTime)); + assertThat(row).containsEntry(SqlIdentifier.quoted("ID"), Parameter.fromOrEmpty("id", String.class)); + assertThat(row).containsEntry(SqlIdentifier.quoted("FIRSTNAME"), Parameter.fromOrEmpty("Walter", String.class)); + assertThat(row).containsEntry(SqlIdentifier.quoted("LASTNAME"), Parameter.fromOrEmpty("White", String.class)); + assertThat(row).containsEntry(SqlIdentifier.quoted("INSTANT"), Parameter.from(instant)); + assertThat(row).containsEntry(SqlIdentifier.quoted("LOCAL_DATE_TIME"), Parameter.from(localDateTime)); } @Test // gh-41 @@ -122,7 +124,7 @@ void shouldConvertMapToString() { OutboundRow row = new OutboundRow(); converter.write(withMap, row); - assertThat(row).containsEntry(SqlIdentifier.unquoted("nested"), Parameter.from("map")); + assertThat(row).containsEntry(SqlIdentifier.quoted("NESTED"), Parameter.from("map")); } @Test // gh-59 @@ -143,7 +145,7 @@ void shouldConvertEnum() { OutboundRow row = new OutboundRow(); converter.write(withMap, row); - assertThat(row).containsEntry(SqlIdentifier.unquoted("condition"), Parameter.from("Mint")); + assertThat(row).containsEntry(SqlIdentifier.quoted("CONDITION"), Parameter.from("Mint")); } @Test // gh-59 @@ -153,7 +155,7 @@ void shouldConvertNullEnum() { OutboundRow row = new OutboundRow(); converter.write(withMap, row); - assertThat(row).containsEntry(SqlIdentifier.unquoted("condition"), Parameter.fromOrEmpty(null, String.class)); + assertThat(row).containsEntry(SqlIdentifier.quoted("CONDITION"), Parameter.fromOrEmpty(null, String.class)); } @Test // gh-59 @@ -215,7 +217,7 @@ void writeShouldWritePrimitiveIdIfValueIsNonZero() { OutboundRow row = new OutboundRow(); converter.write(new WithPrimitiveId(1), row); - assertThat(row).containsEntry(SqlIdentifier.unquoted("id"), Parameter.fromOrEmpty(1L, Long.TYPE)); + assertThat(row).containsEntry(SqlIdentifier.quoted("ID"), Parameter.fromOrEmpty(1L, Long.TYPE)); } @Test // gh-59 @@ -257,12 +259,11 @@ void writeShouldObtainIdFromIdentifierAccessor() { OutboundRow row = new OutboundRow(); converter.write(entity, row); - assertThat(row).containsEntry(SqlIdentifier.unquoted("id"), Parameter.from(42L)); + assertThat(row).containsEntry(SqlIdentifier.quoted("ID"), Parameter.from(42L)); } static class Person { - @Id - String id; + @Id String id; String firstname, lastname; Instant instant; LocalDateTime localDateTime; @@ -298,8 +299,7 @@ public void setLastname(String lastname) { } static class WithEnum { - @Id - String id; + @Id String id; Condition condition; public WithEnum(String id, Condition condition) { @@ -313,8 +313,7 @@ enum Condition { } static class PersonWithConversions { - @Id - String id; + @Id String id; Map nested; NonMappableEntity unsupported; @@ -325,8 +324,7 @@ public PersonWithConversions(String id, Map nested, NonMappableE } } - record WithPrimitiveId ( - @Id long id){ + record WithPrimitiveId(@Id long id) { } static class CustomConversionPerson { diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MySqlMappingR2dbcConverterUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MySqlMappingR2dbcConverterUnitTests.java index 19f8ca46a2..8e8b90b001 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MySqlMappingR2dbcConverterUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/MySqlMappingR2dbcConverterUnitTests.java @@ -39,6 +39,7 @@ * MySQL-specific unit tests for {@link MappingR2dbcConverter}. * * @author Mark Paluch + * @author Jens Schauder */ class MySqlMappingR2dbcConverterUnitTests { @@ -68,8 +69,9 @@ void shouldWriteBooleanToByte() { converter.write(object, row); - OutboundRowAssert.assertThat(row).containsColumnWithValue("flag1", (byte) 1).containsColumnWithValue("flag2", - (byte) 0); + OutboundRowAssert.assertThat(row) // + .containsColumnWithValue("FLAG1", (byte) 1) // + .containsColumnWithValue("FLAG2", (byte) 0); } @Test // gh-589 @@ -96,7 +98,7 @@ void shouldPreserveByteValue() { converter.write(object, row); - OutboundRowAssert.assertThat(row).containsColumnWithValue("state", (byte) 3); + OutboundRowAssert.assertThat(row).containsColumnWithValue("STATE", (byte) 3); } record BooleanMapping( @@ -104,10 +106,9 @@ record BooleanMapping( Integer id, boolean flag1, boolean flag2) { } - record WithByte ( + record WithByte( - Integer id, - byte state){ + Integer id, byte state) { } } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/PostgresMappingR2dbcConverterUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/PostgresMappingR2dbcConverterUnitTests.java index d29d618933..82888b43a6 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/PostgresMappingR2dbcConverterUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/convert/PostgresMappingR2dbcConverterUnitTests.java @@ -49,6 +49,7 @@ * Postgres-specific unit tests for {@link MappingR2dbcConverter}. * * @author Mark Paluch + * @author Jens Schauder */ class PostgresMappingR2dbcConverterUnitTests { @@ -79,7 +80,7 @@ void shouldPassThruJson() { OutboundRow row = new OutboundRow(); converter.write(person, row); - assertThat(row).containsEntry(SqlIdentifier.unquoted("json_value"), Parameter.from(person.jsonValue)); + assertThat(row).containsEntry(SqlIdentifier.quoted("JSON_VALUE"), Parameter.from(person.jsonValue)); } @Test // gh-453 @@ -127,24 +128,18 @@ void shouldApplyCustomWritingConverter() { OutboundRow row = new OutboundRow(); converter.write(object, row); - Parameter parameter = row.get(SqlIdentifier.unquoted("holder")); + Parameter parameter = row.get(SqlIdentifier.quoted("HOLDER")); assertThat(parameter).isNotNull(); assertThat(parameter.getValue()).isInstanceOf(Json.class); } - record JsonPerson( - @Id Long id, - Json jsonValue) { + record JsonPerson(@Id Long id, Json jsonValue) { } - record ConvertedJson( - @Id Long id, - String jsonString, - byte[] jsonBytes) { + record ConvertedJson(@Id Long id, String jsonString, byte[] jsonBytes) { } - record WithJsonHolder( - JsonHolder holder) { + record WithJsonHolder(JsonHolder holder) { } @ReadingConverter diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java index add4f1a970..362e71d7dc 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java @@ -45,6 +45,7 @@ * {@link PostgresDialect} specific tests for {@link ReactiveDataAccessStrategy}. * * @author Mark Paluch + * @author Jens Schauder */ public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessStrategyTestSupport { @@ -61,7 +62,7 @@ void shouldConvertPrimitiveMultidimensionArrayToWrapper() { OutboundRow row = strategy.getOutboundRow(new WithMultidimensionalArray(new int[][] { { 1, 2, 3 }, { 4, 5 } })); - assertThat(row).withColumn("myarray").hasValueInstanceOf(Integer[][].class); + assertThat(row).withColumn("MYARRAY").hasValueInstanceOf(Integer[][].class); } @Test // GH-1593 @@ -83,7 +84,7 @@ void shouldConvertNullArrayToDriverArrayType() { OutboundRow row = strategy.getOutboundRow(new WithMultidimensionalArray(null)); - assertThat(row).withColumn("myarray").isEmpty().hasType(Integer[].class); + assertThat(row).withColumn("MYARRAY").isEmpty().hasType(Integer[].class); } @Test // gh-161 @@ -91,8 +92,8 @@ void shouldConvertCollectionToArray() { OutboundRow row = strategy.getOutboundRow(new WithIntegerCollection(Arrays.asList(1, 2, 3))); - assertThat(row).withColumn("myarray").hasValueInstanceOf(Integer[].class); - assertThat((Integer[]) row.get(SqlIdentifier.unquoted("myarray")).getValue()).contains(1, 2, 3); + assertThat(row).withColumn("MYARRAY").hasValueInstanceOf(Integer[].class); + assertThat((Integer[]) row.get(SqlIdentifier.quoted("MYARRAY")).getValue()).contains(1, 2, 3); } @Test // gh-139 @@ -106,8 +107,8 @@ void shouldConvertToArray() { OutboundRow outboundRow = strategy.getOutboundRow(withArray); - assertThat(outboundRow).containsColumnWithValue("string_array", new String[] { "hello", "world" }) - .containsColumnWithValue("string_list", new String[] { "hello", "world" }); + assertThat(outboundRow).containsColumnWithValue("STRING_ARRAY", new String[] { "hello", "world" }) + .containsColumnWithValue("STRING_LIST", new String[] { "hello", "world" }); } @Test // gh-139 @@ -121,7 +122,7 @@ void shouldApplyCustomConversion() { OutboundRow outboundRow = strategy.getOutboundRow(withConversion); - assertThat(outboundRow).containsColumnWithValue("my_objects", "[one, two]"); + assertThat(outboundRow).containsColumnWithValue("MY_OBJECTS", "[one, two]"); } @Test // gh-139 @@ -135,7 +136,7 @@ void shouldApplyCustomConversionForNull() { OutboundRow outboundRow = strategy.getOutboundRow(withConversion); - assertThat(outboundRow).containsColumn("my_objects").withColumn("my_objects").isEmpty().hasType(String.class); + assertThat(outboundRow).containsColumn("MY_OBJECTS").withColumn("MY_OBJECTS").isEmpty().hasType(String.class); } @Test // gh-1379 @@ -146,7 +147,7 @@ void shouldApplyCustomConversionForEmptyList() { OutboundRow outboundRow = strategy.getOutboundRow(withDuration); - assertThat(outboundRow).containsColumn("durations").withColumn("durations").hasType(Interval[].class); + assertThat(outboundRow).containsColumn("DURATIONS").withColumn("DURATIONS").hasType(Interval[].class); } @Test // gh-252, gh-593 @@ -161,10 +162,10 @@ void shouldConvertCollectionOfEnumToString() { OutboundRow outboundRow = strategy.getOutboundRow(withEnums); - assertThat(outboundRow).containsColumns("enum_set", "enum_array", "enum_list"); - assertThat(outboundRow).withColumn("enum_set").hasValue(new String[] { "ONE", "TWO" }).hasType(String[].class); - assertThat(outboundRow).withColumn("enum_array").hasValue(new String[] { "ONE", "TWO" }).hasType(String[].class); - assertThat(outboundRow).withColumn("enum_list").hasValue(new String[] { "ONE", "TWO" }).hasType(String[].class); + assertThat(outboundRow).containsColumns("ENUM_SET", "ENUM_ARRAY", "ENUM_LIST"); + assertThat(outboundRow).withColumn("ENUM_SET").hasValue(new String[] { "ONE", "TWO" }).hasType(String[].class); + assertThat(outboundRow).withColumn("ENUM_ARRAY").hasValue(new String[] { "ONE", "TWO" }).hasType(String[].class); + assertThat(outboundRow).withColumn("ENUM_LIST").hasValue(new String[] { "ONE", "TWO" }).hasType(String[].class); } @Test // gh-593 @@ -176,10 +177,10 @@ void shouldCorrectlyWriteConvertedEnumNullValues() { OutboundRow outboundRow = strategy.getOutboundRow(withEnums); - assertThat(outboundRow).containsColumns("enum_set", "enum_array", "enum_list"); - assertThat(outboundRow).withColumn("enum_set").isEmpty().hasType(String[].class); - assertThat(outboundRow).withColumn("enum_array").isEmpty().hasType(String[].class); - assertThat(outboundRow).withColumn("enum_list").isEmpty().hasType(String[].class); + assertThat(outboundRow).containsColumns("ENUM_SET", "ENUM_ARRAY", "ENUM_LIST"); + assertThat(outboundRow).withColumn("ENUM_SET").isEmpty().hasType(String[].class); + assertThat(outboundRow).withColumn("ENUM_ARRAY").isEmpty().hasType(String[].class); + assertThat(outboundRow).withColumn("ENUM_LIST").isEmpty().hasType(String[].class); } @Test // gh-1544 @@ -194,10 +195,10 @@ void shouldCorrectlyWriteConvertedEmptyEnumCollections() { OutboundRow outboundRow = strategy.getOutboundRow(withEnums); - assertThat(outboundRow).containsColumns("enum_set", "enum_array", "enum_list"); - assertThat(outboundRow).withColumn("enum_set").hasValueInstanceOf(String[].class).hasType(String[].class); - assertThat(outboundRow).withColumn("enum_array").hasValueInstanceOf(String[].class).hasType(String[].class); - assertThat(outboundRow).withColumn("enum_list").hasValueInstanceOf(String[].class).hasType(String[].class); + assertThat(outboundRow).containsColumns("ENUM_SET", "ENUM_ARRAY", "ENUM_LIST"); + assertThat(outboundRow).withColumn("ENUM_SET").hasValueInstanceOf(String[].class).hasType(String[].class); + assertThat(outboundRow).withColumn("ENUM_ARRAY").hasValueInstanceOf(String[].class).hasType(String[].class); + assertThat(outboundRow).withColumn("ENUM_LIST").hasValueInstanceOf(String[].class).hasType(String[].class); } @Test // gh-593 @@ -213,10 +214,10 @@ void shouldConvertCollectionOfEnumNatively() { OutboundRow outboundRow = strategy.getOutboundRow(withEnums); - assertThat(outboundRow).containsColumns("enum_set", "enum_array", "enum_list"); - assertThat(outboundRow).withColumn("enum_set").hasValue().hasType(MyEnum[].class); - assertThat(outboundRow).withColumn("enum_array").hasValue().hasType(MyEnum[].class); - assertThat(outboundRow).withColumn("enum_list").hasValue().hasType(MyEnum[].class); + assertThat(outboundRow).containsColumns("ENUM_SET", "ENUM_ARRAY", "ENUM_LIST"); + assertThat(outboundRow).withColumn("ENUM_SET").hasValue().hasType(MyEnum[].class); + assertThat(outboundRow).withColumn("ENUM_ARRAY").hasValue().hasType(MyEnum[].class); + assertThat(outboundRow).withColumn("ENUM_LIST").hasValue().hasType(MyEnum[].class); } @Test // gh-593 @@ -229,10 +230,10 @@ void shouldCorrectlyWriteNativeEnumNullValues() { OutboundRow outboundRow = strategy.getOutboundRow(withEnums); - assertThat(outboundRow).containsColumns("enum_set", "enum_array", "enum_list"); - assertThat(outboundRow).withColumn("enum_set").isEmpty().hasType(MyEnum[].class); - assertThat(outboundRow).withColumn("enum_array").isEmpty().hasType(MyEnum[].class); - assertThat(outboundRow).withColumn("enum_list").isEmpty().hasType(MyEnum[].class); + assertThat(outboundRow).containsColumns("ENUM_SET", "ENUM_ARRAY", "ENUM_LIST"); + assertThat(outboundRow).withColumn("ENUM_SET").isEmpty().hasType(MyEnum[].class); + assertThat(outboundRow).withColumn("ENUM_ARRAY").isEmpty().hasType(MyEnum[].class); + assertThat(outboundRow).withColumn("ENUM_LIST").isEmpty().hasType(MyEnum[].class); } static class WithMultidimensionalArray { diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java index 8c11f18781..a596fd0384 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java @@ -113,7 +113,7 @@ void shouldCountBy() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT COUNT(*) FROM person WHERE person.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("SELECT COUNT(*) FROM \"person\" WHERE \"person\".\"THE_NAME\" = $1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -136,7 +136,7 @@ void shouldApplyInterfaceProjection() { .assertNext(actual -> assertThat(actual.getName()).isEqualTo("Walter")).verifyComplete(); StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT foo.THE_NAME FROM foo WHERE foo.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("SELECT foo.\"THE_NAME\" FROM foo WHERE foo.\"THE_NAME\" = $1"); } @Test // GH-1690 @@ -161,7 +161,7 @@ void shouldProjectEntityUsingInheritedInterface() { }).verifyComplete(); StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT foo.* FROM foo WHERE foo.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("SELECT foo.* FROM foo WHERE foo.\"THE_NAME\" = $1"); } @Test // GH-469 @@ -217,7 +217,7 @@ void shouldExistsByCriteria() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT 1 FROM person WHERE person.THE_NAME = $1 LIMIT 1"); + assertThat(statement.getSql()).isEqualTo("SELECT 1 FROM \"person\" WHERE \"person\".\"THE_NAME\" = $1 LIMIT 1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -232,8 +232,8 @@ void shouldSelectByCriteria() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()) - .isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 ORDER BY person.THE_NAME ASC"); + assertThat(statement.getSql()).isEqualTo( + "SELECT \"person\".* FROM \"person\" WHERE \"person\".\"THE_NAME\" = $1 ORDER BY \"person\".\"THE_NAME\" ASC"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -274,8 +274,8 @@ void shouldSelectOne() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()) - .isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 ORDER BY person.THE_NAME ASC LIMIT 2"); + assertThat(statement.getSql()).isEqualTo( + "SELECT \"person\".* FROM \"person\" WHERE \"person\".\"THE_NAME\" = $1 ORDER BY \"person\".\"THE_NAME\" ASC LIMIT 2"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -291,8 +291,8 @@ void shouldSelectOneDoNotOverrideExistingLimit() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()) - .isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 ORDER BY person.THE_NAME ASC LIMIT 1"); + assertThat(statement.getSql()).isEqualTo( + "SELECT \"person\".* FROM \"person\" WHERE \"person\".\"THE_NAME\" = $1 ORDER BY \"person\".\"THE_NAME\" ASC LIMIT 1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -311,7 +311,8 @@ void shouldUpdateByQuery() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); - assertThat(statement.getSql()).isEqualTo("UPDATE person SET THE_NAME = $1 WHERE person.THE_NAME = $2"); + assertThat(statement.getSql()) + .isEqualTo("UPDATE \"person\" SET \"THE_NAME\" = $1 WHERE \"person\".\"THE_NAME\" = $2"); assertThat(statement.getBindings()).hasSize(2).containsEntry(0, Parameter.from("Heisenberg")).containsEntry(1, Parameter.from("Walter")); } @@ -330,7 +331,7 @@ void shouldDeleteByQuery() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("DELETE")); - assertThat(statement.getSql()).isEqualTo("DELETE FROM person WHERE person.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("DELETE FROM \"person\" WHERE \"person\".\"THE_NAME\" = $1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -347,7 +348,7 @@ void shouldDeleteEntity() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("DELETE")); - assertThat(statement.getSql()).isEqualTo("DELETE FROM person WHERE person.id = $1"); + assertThat(statement.getSql()).isEqualTo("DELETE FROM \"person\" WHERE \"person\".\"id\" = $1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -367,7 +368,8 @@ void shouldInsertVersioned() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); - assertThat(statement.getSql()).isEqualTo("INSERT INTO versioned_person (id, version, name) VALUES ($1, $2, $3)"); + assertThat(statement.getSql()) + .isEqualTo("INSERT INTO \"versioned_person\" (\"id\", \"version\", \"name\") VALUES ($1, $2, $3)"); assertThat(statement.getBindings()).hasSize(3).containsEntry(0, Parameter.from("id")).containsEntry(1, Parameter.from(1L)); } @@ -386,7 +388,7 @@ void shouldSkipDefaultIdValueOnInsert() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); - assertThat(statement.getSql()).isEqualTo("INSERT INTO person_with_primitive_id (name) VALUES ($1)"); + assertThat(statement.getSql()).isEqualTo("INSERT INTO \"person_with_primitive_id\" (\"name\") VALUES ($1)"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("bar")); } @@ -407,7 +409,7 @@ void shouldSkipDefaultIdValueOnVersionedInsert() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); assertThat(statement.getSql()) - .isEqualTo("INSERT INTO versioned_person_with_primitive_id (version, name) VALUES ($1, $2)"); + .isEqualTo("INSERT INTO \"versioned_person_with_primitive_id\" (\"version\", \"name\") VALUES ($1, $2)"); assertThat(statement.getBindings()).hasSize(2).containsEntry(0, Parameter.from(1L)).containsEntry(1, Parameter.from("bar")); } @@ -437,7 +439,7 @@ void shouldInsertCorrectlyVersionedAndAudited() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); assertThat(statement.getSql()).isEqualTo( - "INSERT INTO with_auditing_and_optimistic_locking (version, name, created_date, last_modified_date) VALUES ($1, $2, $3, $4)"); + "INSERT INTO \"with_auditing_and_optimistic_locking\" (\"version\", \"name\", \"created_date\", \"last_modified_date\") VALUES ($1, $2, $3, $4)"); } @Test // GH-451 @@ -466,7 +468,7 @@ void shouldUpdateCorrectlyVersionedAndAudited() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); assertThat(statement.getSql()).startsWith( - "UPDATE with_auditing_and_optimistic_locking SET version = $1, name = $2, created_date = $3, last_modified_date = $4"); + "UPDATE \"with_auditing_and_optimistic_locking\" SET \"version\" = $1, \"name\" = $2, \"created_date\" = $3, \"last_modified_date\" = $4"); } @Test // GH-215 @@ -492,7 +494,7 @@ void insertShouldInvokeCallback() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); - assertThat(statement.getSql()).isEqualTo("INSERT INTO person (THE_NAME, description) VALUES ($1, $2)"); + assertThat(statement.getSql()).isEqualTo("INSERT INTO \"person\" (\"THE_NAME\", \"description\") VALUES ($1, $2)"); assertThat(statement.getBindings()).hasSize(2).containsEntry(0, Parameter.from("before-convert")).containsEntry(1, Parameter.from("before-save")); } @@ -514,7 +516,7 @@ void shouldUpdateVersioned() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); assertThat(statement.getSql()).isEqualTo( - "UPDATE versioned_person SET version = $1, name = $2 WHERE versioned_person.id = $3 AND (versioned_person.version = $4)"); + "UPDATE \"versioned_person\" SET \"version\" = $1, \"name\" = $2 WHERE \"versioned_person\".\"id\" = $3 AND (\"versioned_person\".\"version\" = $4)"); assertThat(statement.getBindings()).hasSize(4).containsEntry(0, Parameter.from(2L)).containsEntry(3, Parameter.from(1L)); } @@ -547,7 +549,8 @@ void updateShouldInvokeCallback() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); - assertThat(statement.getSql()).isEqualTo("UPDATE person SET THE_NAME = $1, description = $2 WHERE person.id = $3"); + assertThat(statement.getSql()) + .isEqualTo("UPDATE \"person\" SET \"THE_NAME\" = $1, \"description\" = $2 WHERE \"person\".\"id\" = $3"); assertThat(statement.getBindings()).hasSize(3).containsEntry(0, Parameter.from("before-convert")).containsEntry(1, Parameter.from("before-save")); } @@ -566,7 +569,8 @@ void insertIncludesInsertOnlyColumns() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); - assertThat(statement.getSql()).isEqualTo("INSERT INTO with_insert_only (name, insert_only) VALUES ($1, $2)"); + assertThat(statement.getSql()) + .isEqualTo("INSERT INTO \"with_insert_only\" (\"name\", \"insert_only\") VALUES ($1, $2)"); assertThat(statement.getBindings()).hasSize(2).containsEntry(0, Parameter.from("Alfred")).containsEntry(1, Parameter.from("insert this")); } @@ -585,7 +589,8 @@ void updateExcludesInsertOnlyColumns() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); - assertThat(statement.getSql()).isEqualTo("UPDATE with_insert_only SET name = $1 WHERE with_insert_only.id = $2"); + assertThat(statement.getSql()) + .isEqualTo("UPDATE \"with_insert_only\" SET \"name\" = $1 WHERE \"with_insert_only\".\"id\" = $2"); assertThat(statement.getBindings()).hasSize(2).containsEntry(0, Parameter.from("Alfred")).containsEntry(1, Parameter.from(23L)); } @@ -604,7 +609,7 @@ void shouldConsiderParameterConverter() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); - assertThat(statement.getSql()).isEqualTo("INSERT INTO with_money (money) VALUES ($1)"); + assertThat(statement.getSql()).isEqualTo("INSERT INTO \"with_money\" (\"money\") VALUES ($1)"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from(Parameters.in(R2dbcType.VARCHAR, "$$$"))); } @@ -875,7 +880,7 @@ static class ValueCapturingBeforeSaveCallback extends ValueCapturingEntityCallba public Mono onBeforeSave(Person entity, OutboundRow outboundRow, SqlIdentifier table) { capture(entity); - outboundRow.put(SqlIdentifier.unquoted("description"), Parameter.from("before-save")); + outboundRow.put(SqlIdentifier.quoted("DESCRIPTION"), Parameter.from("before-save")); return Mono.just(entity); } } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java index 77b855b6bf..db090f3098 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java @@ -38,6 +38,7 @@ import org.junit.jupiter.api.Test; import org.springframework.data.annotation.ReadOnlyProperty; import org.springframework.data.r2dbc.dialect.R2dbcDialect; +import org.springframework.data.relational.core.dialect.AnsiDialect; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.r2dbc.core.Parameter; @@ -46,6 +47,7 @@ * * @author Mark Paluch * @author Louis Morgan + * @author Jens Schauder */ public abstract class ReactiveDataAccessStrategyTestSupport { @@ -185,7 +187,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 void testType(BiConsumer setter, Function getter, T testValue, @@ -201,8 +203,9 @@ private void testType(BiConsumer setter, Function s.startsWith("DELETE")); - assertThat(statement.getSql()).isEqualTo("DELETE FROM person"); + assertThat(statement.getSql()).isEqualTo("DELETE FROM \"person\""); } @Test // gh-410 @@ -104,7 +104,7 @@ void shouldDeleteWithQuery() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("DELETE")); - assertThat(statement.getSql()).isEqualTo("DELETE FROM person WHERE person.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("DELETE FROM \"person\" WHERE \"person\".\"THE_NAME\" = $1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -125,7 +125,7 @@ void shouldDeleteInTable() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("DELETE")); - assertThat(statement.getSql()).isEqualTo("DELETE FROM other_table WHERE other_table.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("DELETE FROM other_table WHERE other_table.\"THE_NAME\" = $1"); } static class Person { diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveInsertOperationUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveInsertOperationUnitTests.java index 1b2afe6b4f..66613336e1 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveInsertOperationUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveInsertOperationUnitTests.java @@ -26,7 +26,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.data.annotation.Id; import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.r2dbc.testing.StatementRecorder; @@ -38,6 +37,7 @@ * Unit test for {@link ReactiveInsertOperation}. * * @author Mark Paluch + * @author Jens Schauder */ public class ReactiveInsertOperationUnitTests { @@ -58,8 +58,7 @@ void before() { void shouldInsert() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() .row(MockRow.builder().identified("id", Object.class, 42).metadata(metadata).build()).build(); @@ -79,7 +78,7 @@ void shouldInsert() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); - assertThat(statement.getSql()).isEqualTo("INSERT INTO person (THE_NAME) VALUES ($1)"); + assertThat(statement.getSql()).isEqualTo("INSERT INTO \"person\" (\"THE_NAME\") VALUES ($1)"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); } @@ -87,8 +86,7 @@ void shouldInsert() { void shouldUpdateInTable() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() .row(MockRow.builder().identified("id", Object.class, 42).metadata(metadata).build()).build(); @@ -109,7 +107,7 @@ void shouldUpdateInTable() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); - assertThat(statement.getSql()).isEqualTo("INSERT INTO the_table (THE_NAME) VALUES ($1)"); + assertThat(statement.getSql()).isEqualTo("INSERT INTO the_table (\"THE_NAME\") VALUES ($1)"); } static class Person { diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveSelectOperationUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveSelectOperationUnitTests.java index e0ec5d4d0a..b310adaaae 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveSelectOperationUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveSelectOperationUnitTests.java @@ -28,7 +28,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.data.annotation.Id; import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.r2dbc.testing.StatementRecorder; @@ -40,9 +39,12 @@ * * @author Mark Paluch * @author Mikhail Polivakha + * @author Jens Schauder */ public class ReactiveSelectOperationUnitTests { + public static final String FROM_PERSON = "FROM \"person\" "; + public static final String WHERE_NAME = "WHERE \"person\".\"THE_NAME\" = $1"; private DatabaseClient client; private R2dbcEntityTemplate entityTemplate; private StatementRecorder recorder; @@ -60,8 +62,7 @@ void before() { void shouldSelectAll() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()).build(); @@ -77,15 +78,14 @@ void shouldSelectAll() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); assertThat(statement.getSql()) - .isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 LIMIT 10 OFFSET 20"); + .isEqualTo("SELECT \"person\".* " + FROM_PERSON + "WHERE \"person\".\"THE_NAME\" = $1 LIMIT 10 OFFSET 20"); } @Test // GH-220 void shouldSelectAs() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()).build(); @@ -101,7 +101,8 @@ void shouldSelectAs() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT person.THE_NAME FROM person WHERE person.THE_NAME = $1"); + assertThat(statement.getSql()) + .isEqualTo("SELECT \"person\".\"THE_NAME\" " + FROM_PERSON + WHERE_NAME); } @Test // GH-220, GH-1690 @@ -125,15 +126,15 @@ void shouldSelectAsWithColumnName() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT person.id, person.a_different_name FROM person WHERE person.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo( + "SELECT \"person\".\"id\", \"person\".\"a_different_name\" " + FROM_PERSON + WHERE_NAME); } @Test // GH-220 void shouldSelectFromTable() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder().rowMetadata(metadata) .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()).build(); @@ -149,15 +150,14 @@ void shouldSelectFromTable() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT the_table.* FROM the_table WHERE the_table.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("SELECT the_table.* FROM the_table WHERE the_table.\"THE_NAME\" = $1"); } @Test // GH-220 void shouldSelectFirst() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder().rowMetadata(metadata) .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()).build(); @@ -172,15 +172,15 @@ void shouldSelectFirst() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 LIMIT 1"); + assertThat(statement.getSql()) + .isEqualTo("SELECT \"person\".* " + FROM_PERSON + "WHERE \"person\".\"THE_NAME\" = $1 LIMIT 1"); } @Test // GH-220 void shouldSelectOne() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()).build(); @@ -195,15 +195,15 @@ void shouldSelectOne() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 LIMIT 2"); + assertThat(statement.getSql()) + .isEqualTo("SELECT \"person\".* " + FROM_PERSON + "WHERE \"person\".\"THE_NAME\" = $1 LIMIT 2"); } @Test // GH-220 void shouldSelectExists() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()).build(); @@ -218,15 +218,14 @@ void shouldSelectExists() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT 1 FROM person WHERE person.THE_NAME = $1 LIMIT 1"); + assertThat(statement.getSql()).isEqualTo("SELECT 1 " + FROM_PERSON + "WHERE \"person\".\"THE_NAME\" = $1 LIMIT 1"); } @Test // GH-220 void shouldSelectCount() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() .row(MockRow.builder().identified(0, Long.class, 1L).metadata(metadata).build()).build(); @@ -241,18 +240,16 @@ void shouldSelectCount() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT")); - assertThat(statement.getSql()).isEqualTo("SELECT COUNT(*) FROM person WHERE person.THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("SELECT COUNT(*) " + FROM_PERSON + WHERE_NAME); } @Test // GH-1652 void shouldConsiderFetchSize() { MockRowMetadata metadata = MockRowMetadata.builder() - .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()) - .build(); + .columnMetadata(MockColumnMetadata.builder().name("id").type(R2dbcType.INTEGER).build()).build(); MockResult result = MockResult.builder() - .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()) - .build(); + .row(MockRow.builder().identified("id", Object.class, "Walter").metadata(metadata).build()).build(); recorder.addStubbing(s -> s.startsWith("SELECT"), result); diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java index 91106b342c..8c0465654c 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java @@ -24,7 +24,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.data.annotation.Id; import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.r2dbc.testing.StatementRecorder; @@ -37,6 +36,7 @@ * Unit test for {@link ReactiveUpdateOperation}. * * @author Mark Paluch + * @author Jens Schauder */ public class ReactiveUpdateOperationUnitTests { @@ -68,7 +68,7 @@ void shouldUpdate() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); - assertThat(statement.getSql()).isEqualTo("UPDATE person SET THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("UPDATE \"person\" SET \"THE_NAME\" = $1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Heisenberg")); } @@ -87,7 +87,7 @@ void shouldUpdateWithTable() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); - assertThat(statement.getSql()).isEqualTo("UPDATE table SET THE_NAME = $1"); + assertThat(statement.getSql()).isEqualTo("UPDATE table SET \"THE_NAME\" = $1"); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Heisenberg")); } @@ -107,7 +107,8 @@ void shouldUpdateWithQuery() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); - assertThat(statement.getSql()).isEqualTo("UPDATE person SET THE_NAME = $1 WHERE person.THE_NAME = $2"); + assertThat(statement.getSql()) + .isEqualTo("UPDATE \"person\" SET \"THE_NAME\" = $1 WHERE \"person\".\"THE_NAME\" = $2"); assertThat(statement.getBindings()).hasSize(2).containsEntry(0, Parameter.from("Heisenberg")).containsEntry(1, Parameter.from("Walter")); } @@ -129,7 +130,8 @@ void shouldUpdateInTable() { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); - assertThat(statement.getSql()).isEqualTo("UPDATE the_table SET THE_NAME = $1 WHERE the_table.THE_NAME = $2"); + assertThat(statement.getSql()) + .isEqualTo("UPDATE the_table SET \"THE_NAME\" = $1 WHERE the_table.\"THE_NAME\" = $2"); } static class Person { diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java index 76ceb3b2e5..4bc76f0aec 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java @@ -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 @@ -134,7 +134,7 @@ void shouldMapNestedGroup() { BoundCondition bindings = map(criteria); 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 @@ -150,7 +150,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 @@ -160,13 +160,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]))"); + assertThat(map(criteria).getCondition()).hasToString( + "(person.\"NAME\" = ?[$1] AND (person.\"NAME\" = ?[$2] OR person.age < ?[$3]) AND (person.foo = ?[$4]))"); } @Test // gh-64 @@ -176,7 +176,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"); @@ -218,7 +218,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 @@ -229,7 +229,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 @@ -260,7 +260,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); @@ -273,7 +273,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 @@ -283,7 +283,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"); @@ -297,7 +297,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 @@ -311,7 +311,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 @@ -321,7 +321,7 @@ void shouldMapNeq() { BoundCondition bindings = map(criteria); - assertThat(bindings.getCondition()).hasToString("person.name != ?[$1]"); + assertThat(bindings.getCondition()).hasToString("person.\"NAME\" != ?[$1]"); } @Test // gh-64 @@ -331,7 +331,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 @@ -341,7 +341,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 @@ -351,7 +351,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 @@ -361,7 +361,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 @@ -374,7 +374,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 @@ -384,7 +384,7 @@ void shouldMapIsGt() { BoundCondition bindings = map(criteria); - assertThat(bindings.getCondition()).hasToString("person.name > ?[$1]"); + assertThat(bindings.getCondition()).hasToString("person.\"NAME\" > ?[$1]"); } @Test // gh-64 @@ -394,7 +394,7 @@ void shouldMapIsGte() { BoundCondition bindings = map(criteria); - assertThat(bindings.getCondition()).hasToString("person.name >= ?[$1]"); + assertThat(bindings.getCondition()).hasToString("person.\"NAME\" >= ?[$1]"); } @Test // gh-64 @@ -404,7 +404,7 @@ void shouldMapIsLt() { BoundCondition bindings = map(criteria); - assertThat(bindings.getCondition()).hasToString("person.name < ?[$1]"); + assertThat(bindings.getCondition()).hasToString("person.\"NAME\" < ?[$1]"); } @Test // gh-64 @@ -414,7 +414,7 @@ void shouldMapIsLte() { BoundCondition bindings = map(criteria); - assertThat(bindings.getCondition()).hasToString("person.name <= ?[$1]"); + assertThat(bindings.getCondition()).hasToString("person.\"NAME\" <= ?[$1]"); } @Test // gh-64 @@ -424,7 +424,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 @@ -493,7 +493,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 @@ -503,7 +503,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); } @@ -515,7 +515,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); } @@ -526,7 +526,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"); } @@ -537,7 +537,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"); } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/UpdateMapperUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/UpdateMapperUnitTests.java index 6bb448d4b3..dae40303f6 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/UpdateMapperUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/UpdateMapperUnitTests.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; - import org.springframework.data.r2dbc.convert.MappingR2dbcConverter; import org.springframework.data.r2dbc.convert.R2dbcConverter; import org.springframework.data.r2dbc.dialect.PostgresDialect; @@ -43,6 +42,7 @@ * * @author Mark Paluch * @author Mingyuan Wu + * @author Jens Schauder */ public class UpdateMapperUnitTests { @@ -60,7 +60,7 @@ void shouldMapFieldNamesInUpdate() { Map 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 @@ -73,7 +73,7 @@ void shouldUpdateToSettableValue() { Map 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); @@ -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); diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java index cc4cfa3cf2..2589b305eb 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java @@ -57,6 +57,7 @@ * @author Mark Paluch * @author Manousos Mathioudakis * @author Diego Krupitza + * @author Jens Schauder */ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcIntegrationTestSupport { @@ -74,12 +75,14 @@ void before() { this.jdbc = createJdbcTemplate(createDataSource()); try { - this.jdbc.execute("DROP TABLE legoset"); + this.jdbc.execute(getDropTableStatement()); } catch (DataAccessException e) {} this.jdbc.execute(getCreateTableStatement()); } + abstract protected String getDropTableStatement(); + /** * Creates a {@link DataSource} to be used in this test. * @@ -254,10 +257,12 @@ void shouldDeleteUsingQueryMethod() { .then().as(StepVerifier::create) // .verifyComplete(); - Map count = jdbc.queryForMap("SELECT count(*) AS count FROM legoset"); - assertThat(getCount(count)).satisfies(numberOf(1)); + int count = jdbc.queryForObject(getCountQuery(), Integer.class); + assertThat(count).isEqualTo(1); } + abstract protected String getCountQuery(); + @Test // GH-335 void shouldFindByPageable() { @@ -327,19 +332,17 @@ public void shouldInsertItemsTransactional() { LegoSet legoSet1 = new LegoSet(null, "SCHAUFELRADBAGGER", 12, true); LegoSet legoSet2 = new LegoSet(null, "FORSCHUNGSSCHIFF", 13, false); - Mono> transactional = repository.save(legoSet1) // - .map(it -> jdbc.queryForMap("SELECT count(*) AS count FROM legoset")).as(rxtx::transactional); + Mono transactional = repository.save(legoSet1) // + .map(it -> jdbc.queryForObject(getCountQuery(), Integer.class)).as(rxtx::transactional); - Mono> nonTransactional = repository.save(legoSet2) // - .map(it -> jdbc.queryForMap("SELECT count(*) AS count FROM legoset")); + Mono nonTransactional = repository.save(legoSet2) // + .map(it -> jdbc.queryForObject(getCountQuery(), Integer.class)); - transactional.as(StepVerifier::create).assertNext(actual -> assertThat(getCount(actual)).satisfies(numberOf(0))) - .verifyComplete(); - nonTransactional.as(StepVerifier::create).assertNext(actual -> assertThat(getCount(actual)).satisfies(numberOf(2))) - .verifyComplete(); + transactional.as(StepVerifier::create).assertNext(actual -> assertThat(actual).isEqualTo(0)).verifyComplete(); + nonTransactional.as(StepVerifier::create).assertNext(actual -> assertThat(actual).isEqualTo(2)).verifyComplete(); - Map map = jdbc.queryForMap("SELECT count(*) AS count FROM legoset"); - assertThat(getCount(map)).satisfies(numberOf(2)); + Integer count = jdbc.queryForObject(getCountQuery(), Integer.class); + assertThat(count).isEqualTo(2); } @Test // GH-363 @@ -422,16 +425,6 @@ void findByNameAndFlagWithReadLock() { .verifyComplete(); } - private static Object getCount(Map map) { - return map.getOrDefault("count", map.get("COUNT")); - } - - private Condition numberOf(int expected) { - return new Condition<>(it -> { - return it instanceof Number && ((Number) it).intValue() == expected; - }, "Number %d", expected); - } - @NoRepositoryBean interface LegoSetRepository extends ReactiveCrudRepository { @@ -453,7 +446,7 @@ interface LegoSetRepository extends ReactiveCrudRepository { Flux findBy(Class theClass); - @Query("SELECT name from legoset") + @Query("SELECT name from \"legoset\"") Flux findAsDtoProjection(); Flux findDistinctBy(); @@ -465,11 +458,11 @@ interface LegoSetRepository extends ReactiveCrudRepository { Mono deleteAllBy(); @Modifying - @Query("DELETE from legoset where manual = :manual") + @Query("DELETE from \"legoset\" where manual = :manual") Mono deleteAllByManual(int manual); @Modifying - @Query("DELETE from legoset") + @Query("DELETE from \"legoset\"") Mono deleteAllAndReturnCount(); Mono countByNameContains(String namePart); @@ -502,8 +495,7 @@ public static class LegoSet extends Lego implements Buildable { this.flag = flag; } - public LegoSet() { - } + public LegoSet() {} @Override public String getName() { @@ -532,15 +524,13 @@ public void setFlag(boolean flag) { } static class Lego { - @Id - Integer id; + @Id Integer id; public Lego(Integer id) { this.id = id; } - public Lego() { - } + public Lego() {} public Integer getId() { return this.id; @@ -569,7 +559,8 @@ public String getUnknown() { } public boolean equals(final Object o) { - if (o == this) return true; + if (o == this) + return true; if (!(o instanceof final LegoDto other)) return false; final Object this$name = this.getName(); @@ -592,7 +583,8 @@ public int hashCode() { } public String toString() { - return "AbstractR2dbcRepositoryIntegrationTests.LegoDto(name=" + this.getName() + ", unknown=" + this.getUnknown() + ")"; + return "AbstractR2dbcRepositoryIntegrationTests.LegoDto(name=" + this.getName() + ", unknown=" + this.getUnknown() + + ")"; } } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/CompositeIdRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/CompositeIdRepositoryIntegrationTests.java index 9e868577fb..681e582f4e 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/CompositeIdRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/CompositeIdRepositoryIntegrationTests.java @@ -68,17 +68,17 @@ void before() { this.jdbc = new JdbcTemplate(createDataSource()); try { - this.jdbc.execute("DROP TABLE with_composite_id"); + this.jdbc.execute("DROP TABLE \"with_composite_id\""); } catch (DataAccessException e) {} this.jdbc.execute(""" - CREATE TABLE with_composite_id ( + CREATE TABLE \"with_composite_id\" ( one int, two varchar(255), name varchar(255), primary key (one, two))"""); - this.jdbc.execute("INSERT INTO with_composite_id VALUES (42, 'HBAR','Walter')"); - this.jdbc.execute("INSERT INTO with_composite_id VALUES (23, '2PI','Jesse')"); + this.jdbc.execute("INSERT INTO \"with_composite_id\" VALUES (42, 'HBAR','Walter')"); + this.jdbc.execute("INSERT INTO \"with_composite_id\" VALUES (23, '2PI','Jesse')"); } /** diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java index 5ac98729b0..d6b05a46fa 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java @@ -15,7 +15,19 @@ */ package org.springframework.data.r2dbc.repository; +import static org.assertj.core.api.Assertions.*; + import io.r2dbc.spi.ConnectionFactory; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.sql.DataSource; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -36,22 +48,13 @@ import org.springframework.data.repository.reactive.ReactiveCrudRepository; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; - -import javax.sql.DataSource; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static org.assertj.core.api.Assertions.*; /** * Integration tests for {@link LegoSetRepository} using {@link R2dbcRepositoryFactory} against H2. * * @author Mark Paluch * @author Zsombor Gegesy + * @author Jens Schauder */ @ExtendWith(SpringExtension.class) @ContextConfiguration @@ -63,7 +66,8 @@ public class H2R2dbcRepositoryIntegrationTests extends AbstractR2dbcRepositoryIn @Configuration @EnableR2dbcRepositories(considerNestedRepositories = true, - includeFilters = @Filter(classes = {H2LegoSetRepository.class, IdOnlyEntityRepository.class}, type = FilterType.ASSIGNABLE_TYPE)) + includeFilters = @Filter(classes = { H2LegoSetRepository.class, IdOnlyEntityRepository.class }, + type = FilterType.ASSIGNABLE_TYPE)) static class IntegrationTestConfiguration extends AbstractR2dbcConfiguration { @Bean @@ -93,11 +97,21 @@ protected ConnectionFactory createConnectionFactory() { return H2TestSupport.createConnectionFactory(); } + @Override + protected String getDropTableStatement() { + return H2TestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return H2TestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; } + @Override + protected String getCountQuery() { + return H2TestSupport.COUNT_FROM_LEGOSET; + } + @Override protected Class getRepositoryInterfaceType() { return H2LegoSetRepository.class; @@ -157,12 +171,11 @@ void shouldInsertIdOnlyEntity() { this.jdbc.execute("CREATE TABLE ID_ONLY(id serial CONSTRAINT id_only_pk PRIMARY KEY)"); - IdOnlyEntity entity1 = new IdOnlyEntity(); - idOnlyEntityRepository.saveAll(Collections.singletonList(entity1)) - .as(StepVerifier::create) // - .consumeNextWith( actual -> { - assertThat(actual.getId()).isNotNull(); - }).verifyComplete(); + IdOnly entity1 = new IdOnly(); + idOnlyEntityRepository.saveAll(Collections.singletonList(entity1)).as(StepVerifier::create) // + .consumeNextWith(actual -> { + assertThat(actual.getId()).isNotNull(); + }).verifyComplete(); } @Test // gh-519 @@ -178,47 +191,45 @@ interface H2LegoSetRepository extends LegoSetRepository { Mono findByName(String name); - @Query("SELECT MAX(manual) FROM legoset WHERE name = :name") + @Query("SELECT MAX(manual) FROM \"legoset\" WHERE name = :name") Mono findMax(String name); @Override - @Query("SELECT name FROM legoset") + @Query("SELECT name FROM \"legoset\"") Flux findAsProjection(); @Override - @Query("SELECT * FROM legoset WHERE manual = :manual") + @Query("SELECT * FROM \"legoset\" WHERE manual = :manual") Mono findByManual(int manual); @Override - @Query("SELECT id FROM legoset") + @Query("SELECT id FROM \"legoset\"") Flux findAllIds(); - @Query("UPDATE legoset set manual = :manual") + @Query("UPDATE \"legoset\" set manual = :manual") @Modifying Mono updateManual(int manual); - @Query("UPDATE legoset set manual = :manual") + @Query("UPDATE \"legoset\" set manual = :manual") @Modifying Mono updateManualAndReturnBoolean(int manual); - @Query("UPDATE legoset set manual = :manual") + @Query("UPDATE \"legoset\" set manual = :manual") @Modifying Mono updateManualAndReturnNothing(int manual); - @Query("UPDATE legoset set manual = :manual") + @Query("UPDATE \"legoset\" set manual = :manual") @Modifying Mono updateManualAndReturnDouble(int manual); } - interface IdOnlyEntityRepository extends ReactiveCrudRepository {} + interface IdOnlyEntityRepository extends ReactiveCrudRepository {} - @Table("id_only") - static class IdOnlyEntity { - @Id - Integer id; + @Table() + static class IdOnly { + @Id Integer id; - public IdOnlyEntity() { - } + public IdOnly() {} public Integer getId() { return this.id; diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MariaDbR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MariaDbR2dbcRepositoryIntegrationTests.java index 0b15167c47..280be6ded4 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MariaDbR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MariaDbR2dbcRepositoryIntegrationTests.java @@ -39,6 +39,7 @@ * Integration tests for {@link LegoSetRepository} using {@link R2dbcRepositoryFactory} against MariaDB. * * @author Mark Paluch + * @author Jens Schauder */ @ExtendWith(SpringExtension.class) @ContextConfiguration @@ -68,11 +69,21 @@ protected ConnectionFactory createConnectionFactory() { return MariaDbTestSupport.createConnectionFactory(database); } + @Override + protected String getDropTableStatement() { + return MariaDbTestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return MariaDbTestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; } + @Override + protected String getCountQuery() { + return MariaDbTestSupport.COUNT_FROM_LEGOSET; + } + @Override protected Class getRepositoryInterfaceType() { return MySqlLegoSetRepository.class; @@ -81,15 +92,27 @@ protected Class getRepositoryInterfaceType() { interface MySqlLegoSetRepository extends LegoSetRepository { @Override - @Query("SELECT name FROM legoset") + @Query("SELECT name FROM `legoset`") Flux findAsProjection(); @Override - @Query("SELECT * FROM legoset WHERE manual = :manual") + @Query("SELECT * FROM `legoset` WHERE manual = :manual") Mono findByManual(int manual); @Override - @Query("SELECT id FROM legoset") + @Query("SELECT id FROM `legoset`") Flux findAllIds(); + + @Override + @Query("SELECT name from `legoset`") + Flux findAsDtoProjection(); + + @Override + @Query("DELETE from `legoset`") + Mono deleteAllAndReturnCount(); + + @Override + @Query("DELETE from `legoset` where manual = :manual") + Mono deleteAllByManual(int manual); } } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MySqlR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MySqlR2dbcRepositoryIntegrationTests.java index 8ca2cf0a70..789bd2451c 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MySqlR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/MySqlR2dbcRepositoryIntegrationTests.java @@ -39,6 +39,7 @@ * Integration tests for {@link LegoSetRepository} using {@link R2dbcRepositoryFactory} against MySQL. * * @author Mark Paluch + * @author Jens Schauder */ @ExtendWith(SpringExtension.class) @ContextConfiguration @@ -68,11 +69,21 @@ protected ConnectionFactory createConnectionFactory() { return MySqlDbTestSupport.createConnectionFactory(database); } + @Override + protected String getDropTableStatement() { + return MySqlDbTestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return MySqlDbTestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; } + @Override + protected String getCountQuery() { + return MySqlDbTestSupport.COUNT_FROM_LEGOSET; + } + @Override protected Class getRepositoryInterfaceType() { return MySqlLegoSetRepository.class; @@ -81,15 +92,28 @@ protected Class getRepositoryInterfaceType() { interface MySqlLegoSetRepository extends LegoSetRepository { @Override - @Query("SELECT name FROM legoset") + @Query("SELECT name FROM `legoset`") Flux findAsProjection(); @Override - @Query("SELECT * FROM legoset WHERE manual = :manual") + @Query("SELECT * FROM `legoset` WHERE manual = :manual") Mono findByManual(int manual); @Override - @Query("SELECT id FROM legoset") + @Query("SELECT id FROM `legoset`") Flux findAllIds(); + + @Override + @Query("SELECT name from `legoset`") + Flux findAsDtoProjection(); + + @Override + @Query("DELETE from `legoset` where manual = :manual") + Mono deleteAllByManual(int manual); + + @Override + @Query("DELETE from `legoset`") + + Mono deleteAllAndReturnCount(); } } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/OracleR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/OracleR2dbcRepositoryIntegrationTests.java index 6331453ba2..7dcb74f04e 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/OracleR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/OracleR2dbcRepositoryIntegrationTests.java @@ -72,11 +72,21 @@ protected ConnectionFactory createConnectionFactory() { return OracleTestSupport.createConnectionFactory(database); } + @Override + protected String getDropTableStatement() { + return OracleTestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return OracleTestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; } + @Override + protected String getCountQuery() { + return OracleTestSupport.COUNT_FROM_LEGOSET; + } + @Override protected Class getRepositoryInterfaceType() { return OracleLegoSetRepository.class; diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/PostgresR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/PostgresR2dbcRepositoryIntegrationTests.java index 9fa9fe03f6..377be49bef 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/PostgresR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/PostgresR2dbcRepositoryIntegrationTests.java @@ -31,7 +31,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan.Filter; @@ -72,9 +71,8 @@ public class PostgresR2dbcRepositoryIntegrationTests extends AbstractR2dbcReposi @Configuration @EnableR2dbcRepositories(considerNestedRepositories = true, - includeFilters = @Filter( - classes = { PostgresLegoSetRepository.class, WithJsonRepository.class, WithHStoreRepository.class, WithIdFromSequenceRepository.class }, - type = FilterType.ASSIGNABLE_TYPE)) + includeFilters = @Filter(classes = { PostgresLegoSetRepository.class, WithJsonRepository.class, + WithHStoreRepository.class, WithIdFromSequenceRepository.class }, type = FilterType.ASSIGNABLE_TYPE)) static class IntegrationTestConfiguration extends AbstractR2dbcConfiguration { @Bean @@ -111,11 +109,21 @@ protected ConnectionFactory createConnectionFactory() { return PostgresTestSupport.createConnectionFactory(database); } + @Override + protected String getDropTableStatement() { + return PostgresTestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return PostgresTestSupport.CREATE_TABLE_LEGOSET + ";CREATE SEQUENCE IF NOT EXISTS person_seq;"; } + @Override + protected String getCountQuery() { + return PostgresTestSupport.COUNT_FROM_LEGOSET; + } + @Override protected Class getRepositoryInterfaceType() { return PostgresLegoSetRepository.class; @@ -229,8 +237,7 @@ void shouldSaveAndLoadHStore() { static class WithJson { - @Id - Long id; + @Id Long id; Json jsonValue; @@ -247,8 +254,7 @@ interface WithJsonRepository extends ReactiveCrudRepository { static class WithIdFromSequence { @Id - @Sequence(sequence = "target_sequence") - Long id; + @Sequence(sequence = "target_sequence") Long id; String name; @@ -265,8 +271,7 @@ interface WithIdFromSequenceRepository extends ReactiveCrudRepository hstoreValue; diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/ProjectingRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/ProjectingRepositoryIntegrationTests.java index 4c1a8fc7bd..fff0d974f0 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/ProjectingRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/ProjectingRepositoryIntegrationTests.java @@ -73,13 +73,13 @@ void before() { this.jdbc = new JdbcTemplate(createDataSource()); try { - this.jdbc.execute("DROP TABLE immutable_non_null"); + this.jdbc.execute("DROP TABLE \"immutable_non_null\""); } catch (DataAccessException e) { } - this.jdbc.execute("CREATE TABLE immutable_non_null (id serial PRIMARY KEY, name varchar(255), email varchar(255))"); - this.jdbc.execute("INSERT INTO immutable_non_null VALUES (42, 'Walter', 'heisenberg@the-white-family.com')"); + this.jdbc.execute("CREATE TABLE \"immutable_non_null\" (id serial PRIMARY KEY, name varchar(255), email varchar(255))"); + this.jdbc.execute("INSERT INTO \"immutable_non_null\" VALUES (42, 'Walter', 'heisenberg@the-white-family.com')"); } /** diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/SqlServerR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/SqlServerR2dbcRepositoryIntegrationTests.java index 301a848163..0e04c98e8b 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/SqlServerR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/SqlServerR2dbcRepositoryIntegrationTests.java @@ -71,11 +71,21 @@ protected ConnectionFactory createConnectionFactory() { return SqlServerTestSupport.createConnectionFactory(database); } + @Override + protected String getDropTableStatement() { + return SqlServerTestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return SqlServerTestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; } + @Override + protected String getCountQuery() { + return SqlServerTestSupport.COUNT_FROM_LEGOSET; + } + @Override protected Class getRepositoryInterfaceType() { return SqlServerLegoSetRepository.class; diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java index d631130d17..d997d16b62 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java @@ -77,9 +77,9 @@ @MockitoSettings(strictness = Strictness.LENIENT) class PartTreeR2dbcQueryUnitTests { - private static final String TABLE = "users"; - private static final String[] ALL_FIELDS_ARRAY = new String[] { ".id", ".first_name", ".last_name", ".date_of_birth", - ".age", ".active" }; + private static final String TABLE = "\"users\""; + private static final String[] ALL_FIELDS_ARRAY = new String[] { ".\"id\"", ".\"first_name\"", ".\"last_name\"", + ".\"date_of_birth\"", ".\"age\"", ".\"active\"" }; private static final String[] ALL_FIELDS_ARRAY_PREFIXED = Arrays.stream(ALL_FIELDS_ARRAY).map(f -> TABLE + f) .toArray(String[]::new); private static final String ALL_FIELDS = String.join(", ", ALL_FIELDS_ARRAY_PREFIXED); @@ -121,7 +121,7 @@ void createsQueryToFindAllEntitiesByStringAttribute() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name = $1"); + .where(TABLE + ".\"first_name\" = $1"); } @Test // GH-282 @@ -134,7 +134,7 @@ void createsQueryWithIsNullCondition() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name IS NULL"); + .where(TABLE + ".\"first_name\" IS NULL"); } @Test // GH-282 @@ -145,9 +145,9 @@ void createsQueryWithLimitForExistsProjection() throws Exception { PreparedOperation query = createQuery(queryMethod, r2dbcQuery, "John"); PreparedOperationAssert.assertThat(query) // - .selects(TABLE + ".id") // + .selects(TABLE + ".\"id\"") // .from(TABLE) // - .where(TABLE + ".first_name = $1 LIMIT 1"); + .where(TABLE + ".\"first_name\" = $1 LIMIT 1"); } @Test // GH-282 @@ -161,7 +161,7 @@ void createsQueryToFindAllEntitiesByTwoStringAttributes() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".last_name = $1 AND (" + TABLE + ".first_name = $2)"); + .where(TABLE + ".\"last_name\" = $1 AND (" + TABLE + ".\"first_name\" = $2)"); } @Test // GH-282 @@ -175,7 +175,7 @@ void createsQueryToFindAllEntitiesByOneOfTwoStringAttributes() throws Exception PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".last_name = $1 OR (" + TABLE + ".first_name = $2)"); + .where(TABLE + ".\"last_name\" = $1 OR (" + TABLE + ".\"first_name\" = $2)"); } @Test // GH-282, GH-349 @@ -191,7 +191,7 @@ void createsQueryToFindAllEntitiesByDateAttributeBetween() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".date_of_birth BETWEEN $1 AND $2"); + .where(TABLE + ".\"date_of_birth\" BETWEEN $1 AND $2"); BindTarget bindTarget = mock(BindTarget.class); preparedOperation.bindTo(bindTarget); @@ -211,7 +211,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeLessThan() throws Exception PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age < $1"); + .where(TABLE + ".\"age\" < $1"); } @Test // GH-282 @@ -225,7 +225,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeLessThanEqual() throws Excep PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age <= $1"); + .where(TABLE + ".\"age\" <= $1"); } @Test // GH-282 @@ -239,7 +239,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeGreaterThan() throws Excepti PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age > $1"); + .where(TABLE + ".\"age\" > $1"); } @Test // GH-282 @@ -253,7 +253,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeGreaterThanEqual() throws Ex PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age >= $1"); + .where(TABLE + ".\"age\" >= $1"); } @Test // GH-282 @@ -267,7 +267,7 @@ void createsQueryToFindAllEntitiesByDateAttributeAfter() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".date_of_birth > $1"); + .where(TABLE + ".\"date_of_birth\" > $1"); } @Test // GH-282 @@ -280,7 +280,7 @@ void createsQueryToFindAllEntitiesByDateAttributeBefore() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".date_of_birth < $1"); + .where(TABLE + ".\"date_of_birth\" < $1"); } @Test // GH-282 @@ -294,7 +294,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeIsNull() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age IS NULL"); + .where(TABLE + ".\"age\" IS NULL"); } @Test // GH-282 @@ -308,7 +308,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeIsNotNull() throws Exception PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age IS NOT NULL"); + .where(TABLE + ".\"age\" IS NOT NULL"); } @Test // GH-282 @@ -322,7 +322,7 @@ void createsQueryToFindAllEntitiesByStringAttributeLike() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name LIKE $1"); + .where(TABLE + ".\"first_name\" LIKE $1"); } @Test // GH-282 @@ -336,7 +336,7 @@ void createsQueryToFindAllEntitiesByStringAttributeNotLike() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name NOT LIKE $1"); + .where(TABLE + ".\"first_name\" NOT LIKE $1"); } @Test // GH-282 @@ -350,7 +350,7 @@ void createsQueryToFindAllEntitiesByStringAttributeStartingWith() throws Excepti PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name LIKE $1"); + .where(TABLE + ".\"first_name\" LIKE $1"); } @Test // GH-282 @@ -377,7 +377,7 @@ void createsQueryToFindAllEntitiesByStringAttributeEndingWith() throws Exception PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name LIKE $1"); + .where(TABLE + ".\"first_name\" LIKE $1"); } @Test // GH-282 @@ -404,7 +404,7 @@ void createsQueryToFindAllEntitiesByStringAttributeContaining() throws Exception PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name LIKE $1"); + .where(TABLE + ".\"first_name\" LIKE $1"); } @Test // GH-282 @@ -431,7 +431,7 @@ void createsQueryToFindAllEntitiesByStringAttributeNotContaining() throws Except PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name NOT LIKE $1"); + .where(TABLE + ".\"first_name\" NOT LIKE $1"); } @Test // GH-282 @@ -457,8 +457,8 @@ void createsQueryToFindAllEntitiesByIntegerAttributeWithDescendingOrderingByStri PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age = $1") // - .orderBy("users.last_name DESC"); + .where(TABLE + ".\"age\" = $1") // + .orderBy("\"users\".\"last_name\" DESC"); } @Test // GH-282 @@ -472,8 +472,8 @@ void createsQueryToFindAllEntitiesByIntegerAttributeWithAscendingOrderingByStrin PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age = $1") // - .orderBy("users.last_name ASC"); + .where(TABLE + ".\"age\" = $1") // + .orderBy("\"users\".\"last_name\" ASC"); } @Test // GH-282 @@ -487,7 +487,7 @@ void createsQueryToFindAllEntitiesByStringAttributeNot() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".last_name != $1"); + .where(TABLE + ".\"last_name\" != $1"); } @Test // GH-282 @@ -502,7 +502,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeIn() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age IN ($1)"); + .where(TABLE + ".\"age\" IN ($1)"); } @Test // GH-282 @@ -517,7 +517,7 @@ void createsQueryToFindAllEntitiesByIntegerAttributeNotIn() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".age NOT IN ($1)"); + .where(TABLE + ".\"age\" NOT IN ($1)"); } @Test // GH-282, GH-698 @@ -531,7 +531,7 @@ void createsQueryToFindAllEntitiesByBooleanAttributeTrue() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".active = $1"); + .where(TABLE + ".\"active\" = $1"); } @Test // GH-282, GH-698 @@ -545,7 +545,7 @@ void createsQueryToFindAllEntitiesByBooleanAttributeFalse() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".active = $1"); + .where(TABLE + ".\"active\" = $1"); } @Test // GH-282 @@ -559,7 +559,7 @@ void createsQueryToFindAllEntitiesByStringAttributeIgnoringCase() throws Excepti PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where("UPPER(" + TABLE + ".first_name) = UPPER($1)"); + .where("UPPER(" + TABLE + ".\"first_name\") = UPPER($1)"); } @Test // GH-282 @@ -608,7 +608,7 @@ void allowsSortingByNonDomainProperties() throws Exception { PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery, "foo", Sort.by("foobar")); PreparedOperationAssert.assertThat(preparedOperation) // - .orderBy("users.foobar ASC"); + .orderBy("\"users\".foobar ASC"); preparedOperation = createQuery(queryMethod, r2dbcQuery, "foo", SqlSort.unsafe(Direction.ASC, "sum(foobar)")); PreparedOperationAssert.assertThat(preparedOperation) // @@ -636,7 +636,7 @@ void createsQueryWithLimitToFindEntitiesByStringAttribute() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name = $1 LIMIT 3"); + .where(TABLE + ".\"first_name\" = $1 LIMIT 3"); } @Test // GH-282 @@ -650,7 +650,7 @@ void createsQueryToFindFirstEntityByStringAttribute() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .selects(ALL_FIELDS_ARRAY_PREFIXED) // .from(TABLE) // - .where(TABLE + ".first_name = $1 LIMIT 1"); + .where(TABLE + ".\"first_name\" = $1 LIMIT 1"); } @Test // GH-341 @@ -664,7 +664,7 @@ void createsQueryToDeleteByFirstName() throws Exception { PreparedOperationAssert.assertThat(preparedOperation) // .deletes() // .from(TABLE) // - .where(TABLE + ".first_name = $1"); + .where(TABLE + ".\"first_name\" = $1"); } @Test // GH-344 @@ -675,7 +675,7 @@ void createsQueryToFindAllEntitiesByStringAttributeWithDistinct() throws Excepti PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery, "John"); PreparedOperationAssert.assertThat(preparedOperation) // - .selectsDistinct(TABLE + ".first_name", TABLE + ".foo") // + .selectsDistinct(TABLE + ".\"first_name\"", TABLE + ".foo") // .from(TABLE); } @@ -688,12 +688,13 @@ void createsQueryToFindByOpenProjection() throws Exception { PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery); PreparedOperationAssert.assertThat(preparedOperation) // - .selects("users.id", "users.first_name", "users.last_name", "users.date_of_birth", "users.age", "users.active") // + .selects("\"users\".\"id\"", "\"users\".\"first_name\"", "\"users\".\"last_name\"", + "\"users\".\"date_of_birth\"", "\"users\".\"age\"", "\"users\".\"active\"") // .from(TABLE); } @Test - // GH-475, GH-1687 + // GH-475, GH-1687 void createsDtoProjectionQuery() throws Exception { R2dbcQueryMethod queryMethod = getQueryMethod("findAsDtoProjectionByAge", Integer.TYPE); @@ -701,7 +702,8 @@ void createsDtoProjectionQuery() throws Exception { PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery, 42); PreparedOperationAssert.assertThat(preparedOperation) // - .selects("users.id", "users.first_name", "users.last_name", "users.date_of_birth", "users.age", "users.active") // + .selects("\"users\".\"id\"", "\"users\".\"first_name\"", "\"users\".\"last_name\"", + "\"users\".\"date_of_birth\"", "\"users\".\"age\"", "\"users\".\"active\"") // .from(TABLE); } @@ -713,9 +715,9 @@ void createsQueryForCountProjection() throws Exception { PreparedOperation query = createQuery(queryMethod, r2dbcQuery, "John"); PreparedOperationAssert.assertThat(query) // - .selects("COUNT(users.id)") // + .selects("COUNT(\"users\".\"id\")") // .from(TABLE) // - .where(TABLE + ".first_name = $1"); + .where(TABLE + ".\"first_name\" = $1"); } @Test // GH-1041 @@ -730,9 +732,10 @@ void createQueryWithPessimisticWriteLock() throws Exception { PreparedOperation query = createQuery(queryMethod, r2dbcQuery, firstname, lastname); PreparedOperationAssert.assertThat(query) // - .selects("users.id", "users.first_name", "users.last_name", "users.date_of_birth", "users.age", "users.active") // + .selects("\"users\".\"id\"", "\"users\".\"first_name\"", "\"users\".\"last_name\"", + "\"users\".\"date_of_birth\"", "\"users\".\"age\"", "\"users\".\"active\"") // .from(TABLE) // - .where("users.first_name = $1 AND (users.last_name = $2) FOR UPDATE OF users"); + .where("\"users\".\"first_name\" = $1 AND (\"users\".\"last_name\" = $2) FOR UPDATE OF \"users\""); } @Test // GH-1041 @@ -747,9 +750,10 @@ void createQueryWithPessimisticReadLock() throws Exception { PreparedOperation query = createQuery(queryMethod, r2dbcQuery, firstname, age); PreparedOperationAssert.assertThat(query) // - .selects("users.id", "users.first_name", "users.last_name", "users.date_of_birth", "users.age", "users.active") // + .selects("\"users\".\"id\"", "\"users\".\"first_name\"", "\"users\".\"last_name\"", + "\"users\".\"date_of_birth\"", "\"users\".\"age\"", "\"users\".\"active\"") // .from(TABLE) // - .where("users.first_name = $1 AND (users.age = $2) FOR SHARE OF users"); + .where("\"users\".\"first_name\" = $1 AND (\"users\".\"age\" = $2) FOR SHARE OF \"users\""); } @Test // GH-1285 @@ -776,7 +780,7 @@ void createsQueryWithoutIdForCountProjection() throws Exception { PreparedOperationAssert.assertThat(query) // .selects("COUNT(1)") // .from(TABLE) // - .where(TABLE + ".first_name = $1"); + .where(TABLE + ".\"first_name\" = $1"); } @Test // GH-1310 @@ -789,7 +793,7 @@ void createsQueryWithoutIdForExistsProjection() throws Exception { PreparedOperationAssert.assertThat(query) // .selects("1") // .from(TABLE) // - .where(TABLE + ".first_name = $1 LIMIT 1"); + .where(TABLE + ".\"first_name\" = $1 LIMIT 1"); } private PreparedOperation createQuery(R2dbcQueryMethod queryMethod, PartTreeR2dbcQuery r2dbcQuery, diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethodUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethodUnitTests.java index b15c9b8d36..8f37b9ba57 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethodUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/R2dbcQueryMethodUnitTests.java @@ -18,8 +18,6 @@ import static org.assertj.core.api.Assertions.*; import kotlin.Unit; -import org.springframework.data.relational.repository.Lock; -import org.springframework.data.relational.core.sql.LockMode; import reactor.core.publisher.Mono; import java.lang.annotation.Retention; @@ -29,7 +27,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -39,7 +36,9 @@ import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; import org.springframework.data.r2dbc.repository.Modifying; import org.springframework.data.relational.core.mapping.RelationalMappingContext; +import org.springframework.data.relational.core.sql.LockMode; import org.springframework.data.relational.core.sql.SqlIdentifier; +import org.springframework.data.relational.repository.Lock; import org.springframework.data.relational.repository.query.RelationalEntityMetadata; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; @@ -50,6 +49,7 @@ * @author Mark Paluch * @author Stephen Cohen * @author Diego Krupitza + * @author Jens Schauder */ class R2dbcQueryMethodUnitTests { @@ -67,7 +67,7 @@ void detectsCollectionFromReturnTypeIfReturnTypeAssignable() throws Exception { RelationalEntityMetadata metadata = queryMethod.getEntityInformation(); assertThat(metadata.getJavaType()).isAssignableFrom(Contact.class); - assertThat(metadata.getTableName()).isEqualTo(SqlIdentifier.unquoted("contact")); + assertThat(metadata.getTableName()).isEqualTo(SqlIdentifier.quoted("CONTACT")); } @Test // gh-235 @@ -93,7 +93,7 @@ void detectsTableNameFromRepoTypeIfReturnTypeNotAssignable() throws Exception { RelationalEntityMetadata metadata = queryMethod.getEntityInformation(); assertThat(metadata.getJavaType()).isAssignableFrom(Address.class); - assertThat(metadata.getTableName()).isEqualTo(SqlIdentifier.unquoted("contact")); + assertThat(metadata.getTableName()).isEqualTo(SqlIdentifier.quoted("CONTACT")); } @Test diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/AbstractSimpleR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/AbstractSimpleR2dbcRepositoryIntegrationTests.java index 77886452cb..44e9f861c1 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/AbstractSimpleR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/AbstractSimpleR2dbcRepositoryIntegrationTests.java @@ -54,6 +54,7 @@ import org.springframework.data.relational.repository.support.MappingRelationalEntityInformation; import org.springframework.data.repository.query.FluentQuery; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.r2dbc.core.DatabaseClient; /** @@ -76,6 +77,7 @@ public abstract class AbstractSimpleR2dbcRepositoryIntegrationTests extends R2db SimpleR2dbcRepository repository; SimpleR2dbcRepository repositoryWithNonScalarId; JdbcTemplate jdbc; + NamedParameterJdbcTemplate namedJdbc; @BeforeEach void before() { @@ -96,10 +98,11 @@ void before() { this.jdbc = createJdbcTemplate(createDataSource()); try { - this.jdbc.execute("DROP TABLE legoset"); + this.jdbc.execute(getDropTableStatement()); } catch (DataAccessException e) {} this.jdbc.execute(getCreateTableStatement()); + this.namedJdbc = new NamedParameterJdbcTemplate(jdbc); } /** @@ -109,6 +112,11 @@ void before() { */ protected abstract DataSource createDataSource(); + /** + * Returns teh DROP TABLE statement for {@code legoset} with properly quoted tablename + */ + abstract protected String getDropTableStatement(); + /** * Returns the CREATE TABLE statement for table {@code legoset} with the following three columns: *
    @@ -146,7 +154,7 @@ void shouldSaveNewObjectAndSetVersionIfWrapperVersionPropertyExists() { .consumeNextWith(actual -> assertThat(actual.getVersion()).isEqualTo(0)) // .verifyComplete(); - Map map = jdbc.queryForMap("SELECT * FROM legoset"); + Map map = jdbc.queryForMap("SELECT * FROM \"legoset\""); assertThat(map) // .containsEntry("name", "SCHAUFELRADBAGGER") // .containsEntry("manual", 12) // @@ -164,7 +172,7 @@ void shouldSaveNewObjectAndSetVersionIfPrimitiveVersionPropertyExists() { .consumeNextWith(actual -> assertThat(actual.getVersion()).isEqualTo(1)) // .verifyComplete(); - Map map = jdbc.queryForMap("SELECT * FROM legoset"); + Map map = jdbc.queryForMap("SELECT * FROM \"legoset\""); assertThat(map) // .containsEntry("name", "SCHAUFELRADBAGGER") // .containsEntry("manual", 12) // @@ -175,8 +183,8 @@ void shouldSaveNewObjectAndSetVersionIfPrimitiveVersionPropertyExists() { @Test void shouldUpdateObject() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); LegoSet legoSet = new LegoSet(id, "SCHAUFELRADBAGGER", 12); legoSet.setManual(14); @@ -186,18 +194,22 @@ void shouldUpdateObject() { .expectNextCount(1) // .verifyComplete(); - Map map = jdbc.queryForMap("SELECT * FROM legoset"); + Map map = selectLegoSetForMap(); assertThat(map) // .containsEntry("name", "SCHAUFELRADBAGGER") // .containsEntry("manual", 14) // .containsKey("id"); } + private Map selectLegoSetForMap() { + return jdbc.queryForMap("SELECT * FROM \"legoset\""); + } + @Test // gh-93 void shouldUpdateVersionableObjectAndIncreaseVersion() { - jdbc.execute("INSERT INTO legoset (name, manual, version) VALUES('SCHAUFELRADBAGGER', 12, 42)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertIntoLegoSet("SCHAUFELRADBAGGER", 12, 42); + Integer id = getSelectIdFromSingleLegoset(); LegoSetVersionable legoSet = new LegoSetVersionable(id, "SCHAUFELRADBAGGER", 12, 42); legoSet.setManual(14); @@ -209,7 +221,7 @@ void shouldUpdateVersionableObjectAndIncreaseVersion() { assertThat(legoSet.getVersion()).isEqualTo(43); - Map map = jdbc.queryForMap("SELECT * FROM legoset"); + Map map = selectLegoSetForMap(); assertThat(map) // .containsEntry("name", "SCHAUFELRADBAGGER") // .containsEntry("manual", 14) // @@ -217,11 +229,16 @@ void shouldUpdateVersionableObjectAndIncreaseVersion() { .containsKey("id"); } + private void insertIntoLegoSet(String name, int manualId, int version) { + jdbc.execute( + "INSERT INTO \"legoset\" (name, manual, version) VALUES('" + name + "', " + manualId + ", " + version + ")"); + } + @Test // gh-93 void shouldFailWithOptimistickLockingWhenVersionDoesNotMatchOnUpdate() { - jdbc.execute("INSERT INTO legoset (name, manual, version) VALUES('SCHAUFELRADBAGGER', 12, 42)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + jdbc.execute("INSERT INTO \"legoset\" (name, manual, version) VALUES('SCHAUFELRADBAGGER', 12, 42)"); + Integer id = jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); LegoSetVersionable legoSet = new LegoSetVersionable(id, "SCHAUFELRADBAGGER", 12, 0); @@ -248,7 +265,7 @@ void shouldSaveObjectsUsingIterable() { .expectNext(15) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = selectLegoSetCount(); assertThat(count).isEqualTo(4); } @@ -263,15 +280,15 @@ void shouldSaveObjectsUsingPublisher() { .expectNextCount(2) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM \"legoset\"", Integer.class); assertThat(count).isEqualTo(2); } @Test void shouldFindById() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + Integer id = jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); repository.findById(id) // .as(StepVerifier::create) // @@ -286,8 +303,8 @@ void shouldFindById() { @Test void shouldExistsById() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + Integer id = jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); repository.existsById(id) // .as(StepVerifier::create) // @@ -303,8 +320,8 @@ void shouldExistsById() { @Test void shouldExistsByIdPublisher() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); repository.existsById(Mono.just(id)) // .as(StepVerifier::create) // @@ -320,8 +337,8 @@ void shouldExistsByIdPublisher() { @Test void shouldFindByAll() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); repository.findAll() // .map(LegoSet::getName) // @@ -334,10 +351,10 @@ void shouldFindByAll() { @Test // gh-407 void shouldFindAllWithSort() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 15)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 15)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); repository.findAll(Sort.by("manual").ascending()) // .map(LegoSet::getName) // @@ -354,10 +371,10 @@ void shouldFindAllWithSort() { @Test void shouldFindAllByIdUsingIterable() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - List ids = jdbc.queryForList("SELECT id FROM legoset", Integer.class); + List ids = jdbc.queryForList("SELECT id FROM \"legoset\"", Integer.class); repository.findAllById(ids) // .map(LegoSet::getName) // @@ -372,10 +389,10 @@ void shouldFindAllByIdUsingIterable() { @Test void shouldFindAllByIdUsingPublisher() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - List ids = jdbc.queryForList("SELECT id FROM legoset", Integer.class); + List ids = jdbc.queryForList("SELECT id FROM \"legoset\"", Integer.class); repository.findAllById(Flux.fromIterable(ids)) // .map(LegoSet::getName) // @@ -395,8 +412,8 @@ void shouldCount() { .expectNext(0L) // .verifyComplete(); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); repository.count() // .as(StepVerifier::create) // @@ -407,36 +424,36 @@ void shouldCount() { @Test void shouldDeleteById() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); repository.deleteById(id) // .as(StepVerifier::create) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = selectLegoSetCount(); assertThat(count).isEqualTo(0); } @Test void shouldDeleteByIdPublisher() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); repository.deleteById(Mono.just(id)) // .as(StepVerifier::create) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = selectLegoSetCount(); assertThat(count).isEqualTo(0); } @Test void shouldDelete() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); LegoSet legoSet = new LegoSet(id, "SCHAUFELRADBAGGER", 12); @@ -444,15 +461,15 @@ void shouldDelete() { .as(StepVerifier::create) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM \"legoset\"", Integer.class); assertThat(count).isEqualTo(0); } @Test void shouldDeleteAllUsingIterable() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + Integer id = jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); LegoSet legoSet = new LegoSet(id, "SCHAUFELRADBAGGER", 12); @@ -460,15 +477,15 @@ void shouldDeleteAllUsingIterable() { .as(StepVerifier::create) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM \"legoset\"", Integer.class); assertThat(count).isEqualTo(0); } @Test void shouldDeleteAllUsingPublisher() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); LegoSet legoSet = new LegoSet(id, "SCHAUFELRADBAGGER", 12); @@ -476,29 +493,29 @@ void shouldDeleteAllUsingPublisher() { .as(StepVerifier::create) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = selectLegoSetCount(); assertThat(count).isEqualTo(0); } @Test // gh-498 void shouldDeleteAllById() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); repository.deleteAllById(Collections.singletonList(id)) // .as(StepVerifier::create) // .verifyComplete(); - Integer count = jdbc.queryForObject("SELECT COUNT(*) FROM legoset", Integer.class); + Integer count = selectLegoSetCount(); assertThat(count).isEqualTo(0); } @Test // gh-538 void shouldSelectByExampleUsingId() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); legoSet.setId(id); @@ -514,8 +531,8 @@ void shouldSelectByExampleUsingId() { @Test // gh-538 void shouldSelectByExampleUsingName() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); legoSet.setName("SCHAUFELRADBAGGER"); @@ -531,8 +548,8 @@ void shouldSelectByExampleUsingName() { @Test // gh-538 void shouldSelectByExampleUsingManual() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + insertLegoset("SCHAUFELRADBAGGER", 12); + Integer id = getSelectIdFromSingleLegoset(); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); legoSet.setManual(12); @@ -548,10 +565,10 @@ void shouldSelectByExampleUsingManual() { @Test // gh-538 void shouldSelectByExampleUsingGlobalStringMatcher() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon space base', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars space base', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon construction kit', 14)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars construction kit', 15)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon space base', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars space base', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon construction kit', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars construction kit', 15)"); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); @@ -589,10 +606,10 @@ void shouldSelectByExampleUsingGlobalStringMatcher() { @Test // gh-538 void shouldSelectByExampleUsingFieldLevelStringMatcher() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon space base', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars space base', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon construction kit', 14)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars construction kit', 15)"); + insertLegoset("Moon space base", 12); + insertLegoset("Mars space base", 13); + insertLegoset("Moon construction kit", 14); + insertLegoset("Mars construction kit", 15); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); @@ -633,10 +650,10 @@ void shouldSelectByExampleUsingFieldLevelStringMatcher() { @Test // gh-538 void shouldSelectByExampleIgnoringCase() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon space base', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars space base', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon construction kit', 14)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars construction kit', 15)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon space base', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars space base', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon construction kit', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars construction kit', 15)"); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); @@ -664,10 +681,10 @@ void shouldSelectByExampleIgnoringCase() { @Test // gh-538 void shouldFailSelectByExampleWhenUsingRegEx() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon space base', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars space base', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon construction kit', 14)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars construction kit', 15)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon space base', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars space base', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon construction kit', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars construction kit', 15)"); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); @@ -701,10 +718,10 @@ void shouldFailSelectByExampleWhenUsingRegEx() { @Test // gh-538 void shouldSelectByExampleIncludingNull() { - jdbc.execute("INSERT INTO legoset (name, extra, manual) VALUES('Moon space base', 'base', 12)"); - jdbc.execute("INSERT INTO legoset (name, extra, manual) VALUES( 'Mars space base', 'base', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon construction kit', 14)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars construction kit', 15)"); + insertLegoset("Moon space base", "base", 12); + insertLegoset("Mars space base", "base", 13); + insertLegoset("Moon construction kit", 14); + insertLegoset("Mars construction kit", 15); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); legoSet.setExtra("base"); @@ -721,10 +738,10 @@ void shouldSelectByExampleIncludingNull() { @Test // gh-538 void shouldSelectByExampleWithAnyMatching() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon space base', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars space base', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Moon construction kit', 14)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('Mars construction kit', 15)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon space base', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars space base', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Moon construction kit', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('Mars construction kit', 15)"); LegoSet legoSet = new LegoSet(); legoSet.setName("Moon space base"); @@ -742,8 +759,8 @@ void shouldSelectByExampleWithAnyMatching() { @Test // gh-538 void shouldCountByExampleUsingId() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + Integer id = jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); legoSet.setId(id); @@ -759,8 +776,8 @@ void shouldCountByExampleUsingId() { @Test // gh-538 void shouldCheckExistenceByExampleUsingId() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - Integer id = jdbc.queryForObject("SELECT id FROM legoset", Integer.class); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + Integer id = jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); LegoSetWithNonScalarId legoSet = new LegoSetWithNonScalarId(); legoSet.setId(id); @@ -776,10 +793,10 @@ void shouldCheckExistenceByExampleUsingId() { @Test // GH-663 void findByShouldReturnFirstResult() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 15)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 12)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 15)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setName("FORSCHUNGSSCHIFF"); @@ -795,10 +812,10 @@ void findByShouldReturnFirstResult() { @Test // GH-663 void findByShouldReturnOneResult() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setName("FORSCHUNGSSCHIFF"); @@ -821,10 +838,10 @@ void findByShouldReturnOneResult() { @Test // GH-663 void findByShouldReturnAll() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setManual(13); @@ -838,10 +855,10 @@ void findByShouldReturnAll() { @Test // GH-1609 void findByScrollPosition() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setManual(13); @@ -868,10 +885,10 @@ void findByScrollPosition() { @Test // GH-663 void findByShouldApplySortAll() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setManual(13); @@ -894,10 +911,10 @@ void findByShouldApplySortAll() { @Test // GH-663 void findByShouldApplyProjection() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setName("FORSCHUNGSSCHIFF"); @@ -914,10 +931,10 @@ void findByShouldApplyProjection() { @Test // GH-663 void findByShouldApplyProjectionAs() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setName("FORSCHUNGSSCHIFF"); @@ -933,10 +950,10 @@ void findByShouldApplyProjectionAs() { @Test // GH-663 void findByShouldApplyPagination() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setManual(13); @@ -965,10 +982,10 @@ void findByShouldApplyPagination() { @Test // GH-663 void findByShouldCount() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('FORSCHUNGSSCHIFF', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setManual(13); @@ -990,9 +1007,9 @@ void findByShouldCount() { @Test // GH-663 void findByShouldReportExists() { - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('VOLTRON', 13)"); - jdbc.execute("INSERT INTO legoset (name, manual) VALUES('RALLYEAUTO', 14)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('SCHAUFELRADBAGGER', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('VOLTRON', 13)"); + jdbc.execute("INSERT INTO \"legoset\" (name, manual) VALUES('RALLYEAUTO', 14)"); LegoSet probe = new LegoSet(); probe.setManual(13); @@ -1011,6 +1028,22 @@ void findByShouldReportExists() { .verifyComplete(); } + private Integer selectLegoSetCount() { + return jdbc.queryForObject("SELECT COUNT(*) FROM \"legoset\"", Integer.class); + } + + private Integer getSelectIdFromSingleLegoset() { + return jdbc.queryForObject("SELECT id FROM \"legoset\"", Integer.class); + } + + private void insertLegoset(String name, int manualId) { + jdbc.update("INSERT INTO \"legoset\" (name, manual) VALUES(?, ?)", name, manualId); + } + + private void insertLegoset(String name, String extra, int manualId) { + jdbc.update("INSERT INTO \"legoset\" (name, extra, manual) VALUES(?, ?, ?)", name, extra, manualId); + } + @Table("legoset") static class LegoSet { diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/H2SimpleR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/H2SimpleR2dbcRepositoryIntegrationTests.java index 40fe8cfc40..651549395f 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/H2SimpleR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/H2SimpleR2dbcRepositoryIntegrationTests.java @@ -15,7 +15,15 @@ */ package org.springframework.data.r2dbc.repository.support; +import static org.assertj.core.api.Assertions.*; + import io.r2dbc.spi.ConnectionFactory; +import reactor.test.StepVerifier; + +import java.util.Map; + +import javax.sql.DataSource; + import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -33,12 +41,6 @@ import org.springframework.data.relational.repository.support.MappingRelationalEntityInformation; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; -import reactor.test.StepVerifier; - -import javax.sql.DataSource; -import java.util.Map; - -import static org.assertj.core.api.Assertions.*; /** * Integration tests for {@link SimpleR2dbcRepository} against H2. @@ -68,6 +70,11 @@ protected DataSource createDataSource() { return H2TestSupport.createDataSource(); } + @Override + protected String getDropTableStatement() { + return H2TestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return H2TestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; @@ -113,14 +120,13 @@ void updateShouldFailIfRowDoesNotExist() { .verifyErrorSatisfies(actual -> { assertThat(actual).isInstanceOf(TransientDataAccessException.class) - .hasMessage("Failed to update table [legoset]; Row with Id [9999] does not exist"); + .hasMessage("Failed to update table [\"legoset\"]; Row with Id [9999] does not exist"); }); } static class AlwaysNew implements Persistable { - @Id - Long id; + @Id Long id; String name; public AlwaysNew(Long id, String name) { diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/PostgresSimpleR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/PostgresSimpleR2dbcRepositoryIntegrationTests.java index 899be8bc6d..b43bbf150f 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/PostgresSimpleR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/PostgresSimpleR2dbcRepositoryIntegrationTests.java @@ -21,7 +21,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; - import org.springframework.context.annotation.Configuration; import org.springframework.data.r2dbc.config.AbstractR2dbcConfiguration; import org.springframework.data.r2dbc.testing.ExternalDatabase; @@ -33,6 +32,7 @@ * Integration tests for {@link SimpleR2dbcRepository} against Postgres. * * @author Mark Paluch + * @author Jens Schauder */ @ExtendWith(SpringExtension.class) @ContextConfiguration @@ -54,6 +54,11 @@ protected DataSource createDataSource() { return PostgresTestSupport.createDataSource(database); } + @Override + protected String getDropTableStatement() { + return PostgresTestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return PostgresTestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlInspectingR2dbcRepositoryUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlInspectingR2dbcRepositoryUnitTests.java index 4e2a430e9f..0dfdd7f732 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlInspectingR2dbcRepositoryUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlInspectingR2dbcRepositoryUnitTests.java @@ -32,7 +32,6 @@ import org.springframework.data.r2dbc.core.DefaultReactiveDataAccessStrategy; import org.springframework.data.r2dbc.core.ReactiveDataAccessStrategy; import org.springframework.data.r2dbc.dialect.H2Dialect; -import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; import org.springframework.data.r2dbc.repository.Query; import org.springframework.data.r2dbc.testing.StatementRecorder; @@ -53,7 +52,6 @@ public class SqlInspectingR2dbcRepositoryUnitTests { StatementRecorder recorder = StatementRecorder.newInstance(); ReactiveDataAccessStrategy dataAccessStrategy = new DefaultReactiveDataAccessStrategy(H2Dialect.INSTANCE); - @BeforeEach @SuppressWarnings("unchecked") public void before() { @@ -75,9 +73,10 @@ public void replacesSpelExpressionInQuery() { repository.findBySpel().block(Duration.ofMillis(100)); - StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(SqlInspectingR2dbcRepositoryUnitTests::isSelect); + StatementRecorder.RecordedStatement statement = recorder + .getCreatedStatement(SqlInspectingR2dbcRepositoryUnitTests::isSelect); - assertThat(statement.getSql()).isEqualTo("select * from PERSONx"); + assertThat(statement.getSql()).isEqualTo("select * from \"PERSON\"x"); } private static boolean isSelect(String sql) { @@ -85,7 +84,7 @@ private static boolean isSelect(String sql) { } interface MyPersonRepository extends Repository { - @Query("select * from #{#tableName +'x'}") + @Query("select * from #{#tableName + 'x'}") Mono findBySpel(); } diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlServerSimpleR2dbcRepositoryIntegrationTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlServerSimpleR2dbcRepositoryIntegrationTests.java index d9d2cfce61..8afd8e7a49 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlServerSimpleR2dbcRepositoryIntegrationTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/support/SqlServerSimpleR2dbcRepositoryIntegrationTests.java @@ -33,6 +33,7 @@ * Integration tests for {@link SimpleR2dbcRepository} against Microsoft SQL Server. * * @author Mark Paluch + * @author Jens Schauder */ @ExtendWith(SpringExtension.class) @ContextConfiguration @@ -55,6 +56,11 @@ protected DataSource createDataSource() { return SqlServerTestSupport.createDataSource(database); } + @Override + protected String getDropTableStatement() { + return SqlServerTestSupport.DROP_TABLE_LEGOSET; + } + @Override protected String getCreateTableStatement() { return SqlServerTestSupport.CREATE_TABLE_LEGOSET_WITH_ID_GENERATION; diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java index 98c8b19e00..4ad0249d2d 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/H2TestSupport.java @@ -32,7 +32,7 @@ */ public class H2TestSupport { - public static String CREATE_TABLE_LEGOSET = "CREATE TABLE legoset (\n" // + public static String CREATE_TABLE_LEGOSET = "CREATE TABLE \"legoset\" (\n" // + " id integer CONSTRAINT id1 PRIMARY KEY,\n" // + " version integer NULL,\n" // + " name varchar(255) NOT NULL,\n" // @@ -40,7 +40,11 @@ public class H2TestSupport { + " cert bytea NULL\n" // + ");"; - public static String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE legoset (\n" // + public static final String DROP_TABLE_LEGOSET = "DROP TABLE \"legoset\""; + + public static final String COUNT_FROM_LEGOSET = "SELECT count(*) AS count FROM \"legoset\""; + + public static String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE \"legoset\" (\n" // + " id integer AUTO_INCREMENT CONSTRAINT id1 PRIMARY KEY,\n" // + " version integer NULL,\n" // + " name varchar(255) NOT NULL,\n" // diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java index 1946f16410..d8dae397bf 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MariaDbTestSupport.java @@ -40,28 +40,17 @@ public class MariaDbTestSupport { private static ExternalDatabase testContainerDatabase; - public static final String CREATE_TABLE_LEGOSET = "CREATE TABLE legoset (\n" // - + " id integer PRIMARY KEY,\n" // - + " name varchar(255) NOT NULL,\n" // - + " manual integer NULL\n," // - + " cert varbinary(255) NULL\n" // - + ") ENGINE=InnoDB;"; + public static final String DROP_TABLE_LEGOSET = "DROP TABLE `legoset`"; + + public static final String COUNT_FROM_LEGOSET = "SELECT count(*) AS count FROM `legoset`"; - public static final String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE legoset (\n" // + public static final String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE `legoset` (\n" // + " id integer AUTO_INCREMENT PRIMARY KEY,\n" // + " name varchar(255) NOT NULL,\n" // + " flag boolean NOT NULL,\n" // + " manual integer NULL\n" // + ") ENGINE=InnoDB;"; - public static final String CREATE_TABLE_LEGOSET_WITH_MIXED_CASE_NAMES = "CREATE TABLE `LegoSet` (\n" // - + " `Id` integer AUTO_INCREMENT PRIMARY KEY,\n" // - + " `Name` varchar(255) NOT NULL,\n" // - + " `Manual` integer NULL\n" // - + ") ENGINE=InnoDB;"; - - public static final String DROP_TABLE_LEGOSET_WITH_MIXED_CASE_NAMES = "DROP TABLE `LegoSet`"; - /** * Returns a database either hosted locally at {@code localhost:3306/mysql} or running inside Docker. * diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MySqlDbTestSupport.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MySqlDbTestSupport.java index 9fb7fa406f..db3273f5ec 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MySqlDbTestSupport.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/MySqlDbTestSupport.java @@ -39,28 +39,17 @@ public class MySqlDbTestSupport { private static ExternalDatabase testContainerDatabase; - public static final String CREATE_TABLE_LEGOSET = "CREATE TABLE legoset (\n" // - + " id integer PRIMARY KEY,\n" // - + " name varchar(255) NOT NULL,\n" // - + " manual integer NULL\n," // - + " cert varbinary(255) NULL\n" // - + ") ENGINE=InnoDB;"; + public static final String DROP_TABLE_LEGOSET = "DROP TABLE `legoset`"; + + public static final String COUNT_FROM_LEGOSET = "SELECT count(*) AS count FROM `legoset`"; - public static final String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE legoset (\n" // + public static final String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE `legoset` (\n" // + " id integer AUTO_INCREMENT PRIMARY KEY,\n" // + " name varchar(255) NOT NULL,\n" // + " flag boolean NOT NULL,\n" // + " manual integer NULL\n" // + ") ENGINE=InnoDB;"; - public static final String CREATE_TABLE_LEGOSET_WITH_MIXED_CASE_NAMES = "CREATE TABLE `LegoSet` (\n" // - + " `Id` integer AUTO_INCREMENT PRIMARY KEY,\n" // - + " `Name` varchar(255) NOT NULL,\n" // - + " `Manual` integer NULL\n" // - + ") ENGINE=InnoDB;"; - - public static final String DROP_TABLE_LEGOSET_WITH_MIXED_CASE_NAMES = "DROP TABLE `LegoSet`"; - /** * Returns a database either hosted locally at {@code localhost:3306/mysql} or running inside Docker. * diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java index 9f40dc7ae8..58f5299ba1 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OracleTestSupport.java @@ -42,13 +42,6 @@ public class OracleTestSupport { private static ExternalDatabase testContainerDatabase; - public static String CREATE_TABLE_LEGOSET = "CREATE TABLE legoset (\n" // - + " id INTEGER PRIMARY KEY,\n" // - + " version INTEGER NULL,\n" // - + " name VARCHAR2(255) NOT NULL,\n" // - + " manual INTEGER NULL,\n" // - + " cert RAW(255) NULL\n" // - + ")"; public static String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE legoset (\n" // + " id INTEGER GENERATED by default on null as IDENTITY PRIMARY KEY,\n" // @@ -58,6 +51,10 @@ public class OracleTestSupport { + " manual INTEGER NULL\n" // + ")"; + public static final String DROP_TABLE_LEGOSET = "DROP TABLE \"legoset\""; + + public static final String COUNT_FROM_LEGOSET = "SELECT count(*) AS count FROM \"legoset\""; + public static final String CREATE_TABLE_LEGOSET_WITH_MIXED_CASE_NAMES = "CREATE TABLE \"LegoSet\" (\n" // + " \"Id\" INTEGER GENERATED by default on null as IDENTITY PRIMARY KEY,\n" // + " \"Name\" VARCHAR2(255) NOT NULL,\n" // diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OutboundRowAssert.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OutboundRowAssert.java index 74688590f3..02167487ee 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OutboundRowAssert.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/OutboundRowAssert.java @@ -25,7 +25,6 @@ import org.assertj.core.error.ShouldBeEmpty; import org.assertj.core.error.ShouldContain; import org.assertj.core.error.ShouldNotBeEmpty; - import org.springframework.data.r2dbc.mapping.OutboundRow; import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.r2dbc.core.Parameter; @@ -56,7 +55,7 @@ public static OutboundRowAssert assertThat(OutboundRow actual) { * @see SqlIdentifier#unquoted(String) */ public OutboundRowAssert containsColumn(String identifier) { - return containsColumn(SqlIdentifier.unquoted(identifier)); + return containsColumn(SqlIdentifier.quoted(identifier)); } /** @@ -131,7 +130,7 @@ public OutboundRowAssert containsOnlyColumns(Iterable columns) { * @see SqlIdentifier#unquoted(String) */ public OutboundRowAssert containsColumnWithValue(String identifier, Object value) { - return containsColumnWithValue(SqlIdentifier.unquoted(identifier), value); + return containsColumnWithValue(SqlIdentifier.quoted(identifier), value); } /** @@ -163,7 +162,7 @@ public OutboundRowAssert containsColumnWithValue(SqlIdentifier identifier, Objec * @see SqlIdentifier#unquoted(String) */ public OutboundRowAssert containsColumns(String... identifier) { - return containsColumns(Arrays.stream(identifier).map(SqlIdentifier::unquoted).toArray(SqlIdentifier[]::new)); + return containsColumns(Arrays.stream(identifier).map(SqlIdentifier::quoted).toArray(SqlIdentifier[]::new)); } /** @@ -223,7 +222,7 @@ public OutboundRowAssert containsEmptyColumn(SqlIdentifier identifier) { * @return a new assertions object. */ public ParameterAssert withColumn(String identifier) { - return withColumn(SqlIdentifier.unquoted(identifier)); + return withColumn(SqlIdentifier.quoted(identifier)); } /** @@ -326,7 +325,7 @@ public ParameterAssert hasType(Class type) { if (!this.actual.getType().equals(type)) { failWithMessage(new BasicErrorMessageFactory( "Expecting\n" + " <%s>\n" + "to be instance of:\n" + " <%s>\n" + "but was not", actual.getType(), type) - .create()); + .create()); } return this; diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java index c0a3e88d7c..5690a3861d 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/PostgresTestSupport.java @@ -46,6 +46,10 @@ public class PostgresTestSupport { + " cert bytea NULL\n" // + ");"; + public static final String DROP_TABLE_LEGOSET = "DROP TABLE legoset"; + + public static final String COUNT_FROM_LEGOSET = "SELECT count(*) AS count FROM legoset"; + public static String CREATE_TABLE_LEGOSET_WITH_ID_GENERATION = "CREATE TABLE legoset (\n" // + " id serial CONSTRAINT id1 PRIMARY KEY,\n" // + " version integer NULL,\n" // diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java index 5766413d3a..734f2ab87b 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/testing/SqlServerTestSupport.java @@ -36,6 +36,8 @@ */ public class SqlServerTestSupport { + public static final String DROP_TABLE_LEGOSET = "DROP TABLE `legoset`"; + public static final String COUNT_FROM_LEGOSET = "SELECT count(*) AS count FROM [legoset]"; private static ExternalDatabase testContainerDatabase; public static String CREATE_TABLE_LEGOSET = "CREATE TABLE legoset (\n" // diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml index 8fd6d7a6f0..59e576e23d 100644 --- a/spring-data-relational/pom.xml +++ b/spring-data-relational/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-relational - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT Spring Data Relational Spring Data Relational support @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-1993-force-quoting-SNAPSHOT diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/PostgresDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/PostgresDialect.java index a06b4e3b25..4a787f9e19 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/PostgresDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/PostgresDialect.java @@ -51,10 +51,9 @@ public class PostgresDialect extends AbstractDialect { * Singleton instance. * * @deprecated use either the {@code org.springframework.data.r2dbc.dialect.PostgresDialect} or - * {@code org.springframework.data.jdbc.core.dialect.JdbcPostgresDialect}. + * {@code org.springframework.data.jdbc.core.dialect.JdbcPostgresDialect}. */ - @Deprecated(forRemoval = true) - public static final PostgresDialect INSTANCE = new PostgresDialect(); + @Deprecated(forRemoval = true) public static final PostgresDialect INSTANCE = new PostgresDialect(); private static final Set> POSTGRES_SIMPLE_TYPES = Set.of(UUID.class, URL.class, URI.class, InetAddress.class, Map.class); @@ -102,7 +101,7 @@ public LimitClause limit() { return LIMIT_CLAUSE; } - private final PostgresLockClause LOCK_CLAUSE = new PostgresLockClause(this.getIdentifierProcessing()); + private final PostgresLockClause LOCK_CLAUSE = new PostgresLockClause(); @Override public LockClause lock() { @@ -121,12 +120,6 @@ public Collection getConverters() { static class PostgresLockClause implements LockClause { - private final IdentifierProcessing identifierProcessing; - - PostgresLockClause(IdentifierProcessing identifierProcessing) { - this.identifierProcessing = identifierProcessing; - } - @Override public String getLock(LockOptions lockOptions) { @@ -144,7 +137,7 @@ public String getLock(LockOptions lockOptions) { } // without schema - String tableName = last.toSql(this.identifierProcessing); + String tableName = last.toSql(PostgresDialect.identifierProcessing); return switch (lockOptions.getLockMode()) { case PESSIMISTIC_WRITE -> "FOR UPDATE OF " + tableName; diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/DerivedSqlIdentifier.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/DerivedSqlIdentifier.java index 945793f8fa..c3bd07e1dd 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/DerivedSqlIdentifier.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/DerivedSqlIdentifier.java @@ -42,6 +42,7 @@ class DerivedSqlIdentifier implements SqlIdentifier { DerivedSqlIdentifier(String name, boolean quoted) { Assert.hasText(name, "A database object must have at least on name part."); + this.name = name; this.quoted = quoted; this.toString = quoted ? toSql(IdentifierProcessing.ANSI) : this.name;