[#4075] Bad result from Query.getBindValues() when named Params are repeated
This commit is contained in:
parent
d48960d80c
commit
90a15a5dab
@ -68,6 +68,7 @@ import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.annotation.Generated;
|
||||
import javax.sql.DataSource;
|
||||
@ -378,9 +379,10 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri
|
||||
public List<Object> extractBindValues(QueryPart part) {
|
||||
List<Object> result = new ArrayList<Object>();
|
||||
|
||||
for (Param<?> param : extractParams0(part, false).values()) {
|
||||
result.add(param.getValue());
|
||||
}
|
||||
ParamCollector collector = new ParamCollector(configuration(), false);
|
||||
collector.visit(part);
|
||||
for (Entry<String, Param<?>> entry : collector.resultList)
|
||||
result.add(entry.getValue().getValue());
|
||||
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
@ -41,10 +41,12 @@
|
||||
package org.jooq.impl;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.AbstractMap.SimpleImmutableEntry;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.jooq.BindContext;
|
||||
import org.jooq.Configuration;
|
||||
@ -62,10 +64,11 @@ import org.jooq.tools.StringUtils;
|
||||
*/
|
||||
class ParamCollector extends AbstractBindContext {
|
||||
|
||||
final Map<String, Param<?>> resultFlat = new LinkedHashMap<String, Param<?>>();
|
||||
final Map<String, List<Param<?>>> result = new LinkedHashMap<String, List<Param<?>>>();
|
||||
final Map<String, Param<?>> resultFlat = new LinkedHashMap<String, Param<?>>();
|
||||
final Map<String, List<Param<?>>> result = new LinkedHashMap<String, List<Param<?>>>();
|
||||
final List<Entry<String, Param<?>>> resultList = new ArrayList<Map.Entry<String, Param<?>>>();
|
||||
|
||||
private final boolean includeInlinedParams;
|
||||
private final boolean includeInlinedParams;
|
||||
|
||||
ParamCollector(Configuration configuration, boolean includeInlinedParams) {
|
||||
super(configuration, null);
|
||||
@ -81,13 +84,16 @@ class ParamCollector extends AbstractBindContext {
|
||||
// [#3131] Inlined parameters should not be returned in some contexts
|
||||
if (includeInlinedParams || !param.isInline()) {
|
||||
String i = String.valueOf(nextIndex());
|
||||
String paramName = param.getParamName();
|
||||
|
||||
if (StringUtils.isBlank(param.getParamName())) {
|
||||
if (StringUtils.isBlank(paramName)) {
|
||||
resultFlat.put(i, param);
|
||||
resultList.add(new SimpleImmutableEntry<String, Param<?>>(i, param));
|
||||
result(i).add(param);
|
||||
}
|
||||
else {
|
||||
resultFlat.put(param.getParamName(), param);
|
||||
resultList.add(new SimpleImmutableEntry<String, Param<?>>(param.getParamName(), param));
|
||||
result(param.getParamName()).add(param);
|
||||
}
|
||||
}
|
||||
|
||||
@ -41,7 +41,9 @@
|
||||
package org.jooq.test;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
import static java.util.Collections.nCopies;
|
||||
import static org.jooq.impl.DSL.inline;
|
||||
import static org.jooq.impl.DSL.param;
|
||||
import static org.jooq.impl.DSL.val;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
@ -78,4 +80,14 @@ public class ParamTest extends AbstractTest {
|
||||
|
||||
assertEquals(asList(1, 3), query.getBindValues());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNamedBindValues() {
|
||||
Query query = create.select(param("a"), param("a")).where(param("b").eq(param("b")));
|
||||
assertEquals(nCopies(4, null), query.getBindValues());
|
||||
|
||||
query.bind("a", 1);
|
||||
query.bind("b", 2);
|
||||
assertEquals(asList(1, 1, 2, 2), query.getBindValues());
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user