Skip to content

Commit dd6eede

Browse files
committed
Properly expand reused collection parameters in R2DBC NamedParameterUtils
Prior to this commit, NamedParameterUtils in spring-r2dbc did not properly expand reused collection parameters. Specifically, values in a supplied collection were only expanded in the resulting query once, for the first occurrence of the named parameter. To address that, this commit effectively reinstates the original logic for ExpandedQuery from NamedParameterUtils in the Spring Data R2DBC project. https://github.com/spring-projects/spring-data-relational/blob/94958f5eb66cbe2e8e025155cd99abf36f6f91f4/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/NamedParameterUtils.java#L486 Closes gh-34768
1 parent de97e35 commit dd6eede

File tree

2 files changed

+26
-25
lines changed

2 files changed

+26
-25
lines changed

spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java

+26-23
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
* @author Juergen Hoeller
5050
* @author Mark Paluch
5151
* @author Anton Naydenov
52+
* @author Sam Brannen
5253
* @since 5.3
5354
*/
5455
abstract class NamedParameterUtils {
@@ -545,41 +546,43 @@ public void bindTo(BindTarget target) {
545546
}
546547

547548
private void bindNull(BindTarget target, String identifier, Parameter parameter) {
548-
List<BindMarker> bindMarkers = getBindMarkers(identifier);
549+
List<List<BindMarker>> bindMarkers = getBindMarkers(identifier);
549550
if (bindMarkers == null) {
550551
target.bind(identifier, parameter);
551552
return;
552553
}
553-
for (BindMarker bindMarker : bindMarkers) {
554-
bindMarker.bind(target, parameter);
554+
for (List<BindMarker> outer : bindMarkers) {
555+
for (BindMarker bindMarker : outer) {
556+
bindMarker.bind(target, parameter);
557+
}
555558
}
556559
}
557560

558-
@SuppressWarnings({"rawtypes", "unchecked"})
559561
private void bind(BindTarget target, String identifier, Parameter parameter) {
560-
List<BindMarker> bindMarkers = getBindMarkers(identifier);
562+
List<List<BindMarker>> bindMarkers = getBindMarkers(identifier);
561563
if (bindMarkers == null) {
562564
target.bind(identifier, parameter);
563565
return;
564566
}
565-
if (parameter.getValue() instanceof Collection collection) {
566-
Iterator<Object> iterator = collection.iterator();
567-
Iterator<BindMarker> markers = bindMarkers.iterator();
568-
while (iterator.hasNext()) {
569-
Object valueToBind = iterator.next();
570-
if (valueToBind instanceof Object[] objects) {
571-
for (Object object : objects) {
572-
bind(target, markers, object);
567+
568+
for (List<BindMarker> outer : bindMarkers) {
569+
if (parameter.getValue() instanceof Collection<?> collection) {
570+
Iterator<BindMarker> markers = outer.iterator();
571+
for (Object valueToBind : collection) {
572+
if (valueToBind instanceof Object[] objects) {
573+
for (Object object : objects) {
574+
bind(target, markers, object);
575+
}
576+
}
577+
else {
578+
bind(target, markers, valueToBind);
573579
}
574-
}
575-
else {
576-
bind(target, markers, valueToBind);
577580
}
578581
}
579-
}
580-
else {
581-
for (BindMarker bindMarker : bindMarkers) {
582-
bindMarker.bind(target, parameter);
582+
else {
583+
for (BindMarker bindMarker : outer) {
584+
bindMarker.bind(target, parameter);
585+
}
583586
}
584587
}
585588
}
@@ -592,14 +595,14 @@ private void bind(BindTarget target, Iterator<BindMarker> markers, Object valueT
592595
}
593596

594597
@Nullable
595-
private List<BindMarker> getBindMarkers(String identifier) {
598+
private List<List<BindMarker>> getBindMarkers(String identifier) {
596599
List<NamedParameters.NamedParameter> parameters = this.parameters.getMarker(identifier);
597600
if (parameters == null) {
598601
return null;
599602
}
600-
List<BindMarker> markers = new ArrayList<>();
603+
List<List<BindMarker>> markers = new ArrayList<>();
601604
for (NamedParameters.NamedParameter parameter : parameters) {
602-
markers.addAll(parameter.placeholders);
605+
markers.add(new ArrayList<>(parameter.placeholders));
603606
}
604607
return markers;
605608
}

spring-r2dbc/src/test/java/org/springframework/r2dbc/core/NamedParameterUtilsTests.java

-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.util.Map;
2222

2323
import io.r2dbc.spi.Parameters;
24-
import org.junit.jupiter.api.Disabled;
2524
import org.junit.jupiter.api.Test;
2625
import org.junit.jupiter.params.ParameterizedTest;
2726
import org.junit.jupiter.params.provider.ValueSource;
@@ -350,7 +349,6 @@ void multipleEqualCollectionParameterReferencesForIndexedMarkersBindsValuesOnce(
350349
}
351350

352351
@Test // gh-34768
353-
@Disabled("Disabled until gh-34768 is addressed")
354352
void multipleEqualCollectionParameterReferencesForAnonymousMarkersBindsValuesTwice() {
355353
String sql = "SELECT * FROM fund_info WHERE fund_code IN (:fundCodes) OR fund_code IN (:fundCodes)";
356354

0 commit comments

Comments
 (0)