From 6227d96341ae567fcbe59bf8e4d477f9e70020a6 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Wed, 17 Apr 2019 16:22:21 +0200 Subject: [PATCH] #75 - Polishing. Clarified code a little. Added a warning to `AnonymousBindMarkers`: Anonymous bind markers are problematic because the have to appear in generated SQL in the same order they get generated. This might cause challenges in the future with complex generate statements. For example those containing subselects which limit the freedom of arranging bind markers. Original pull request: #84. --- .../data/r2dbc/dialect/AnonymousBindMarkers.java | 6 ++++++ ...actTransactionalDatabaseClientIntegrationTests.java | 10 ++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java b/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java index 32b4cc1..c144245 100644 --- a/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java +++ b/src/main/java/org/springframework/data/r2dbc/dialect/AnonymousBindMarkers.java @@ -21,6 +21,12 @@ import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; * Anonymous, index-based bind marker using a static placeholder. Instances are bound by the ordinal position ordered by * the appearance of the placeholder. This implementation creates indexed bind markers using an anonymous placeholder * that correlates with an index. + *

+ * Note: Anonymous bind markers are problematic because the have to appear in generated SQL in the same order they get generated. + * + * This might cause challenges in the future with complex generate statements. + * For example those containing subselects which limit the freedom of arranging bind markers. + *

* * @author Mark Paluch */ diff --git a/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java b/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java index 628020f..deecc2e 100644 --- a/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/function/AbstractTransactionalDatabaseClientIntegrationTests.java @@ -209,13 +209,19 @@ public abstract class AbstractTransactionalDatabaseClientIntegrationTests extend Flux transactionIds = databaseClient.inTransaction(db -> { + // We have to execute a sql statement first. + // Otherwise some databases (MySql) don't have a transaction id. Mono insert = db.execute().sql(getInsertIntoLegosetStatement()) // .bind(0, 42055) // .bind(1, "SCHAUFELRADBAGGER") // .bindNull(2, Integer.class) // .fetch().rowsUpdated(); - Flux txId = db.execute().sql(getCurrentTransactionIdStatement()).map((r, md) -> r.get(0)).all(); + Flux txId = db.execute() // + .sql(getCurrentTransactionIdStatement()) // + .map((row, md) -> row.get(0)) // + .all(); + return insert.thenMany(txId.concatWith(txId)); }); @@ -223,7 +229,7 @@ public abstract class AbstractTransactionalDatabaseClientIntegrationTests extend .consumeNextWith(actual -> { assertThat(actual).hasSize(2); - assertThat(actual).containsExactly(actual.get(1), actual.get(0)); + assertThat(actual.get(0)).isEqualTo(actual.get(1)); }) // .verifyComplete(); }