[#4075] Bad result from Query.getBindValues() when named Params are repeated

This commit is contained in:
Lukas Eder 2015-02-18 14:08:24 +01:00
parent d48960d80c
commit 90a15a5dab
3 changed files with 27 additions and 7 deletions

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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());
}
}