diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java
index 87bbb27273..75ac2d263b 100644
--- a/jOOQ/src/main/java/org/jooq/DSLContext.java
+++ b/jOOQ/src/main/java/org/jooq/DSLContext.java
@@ -223,6 +223,10 @@ public interface DSLContext {
*
* The returned List is immutable. To modify bind values, use
* {@link #extractParams(QueryPart)} instead.
+ *
+ * Unlike {@link #extractParams(QueryPart)}, which returns also inlined
+ * parameters, this returns only actual bind values that will render an
+ * actual bind value as a question mark "?"
*/
List extractBindValues(QueryPart part);
diff --git a/jOOQ/src/main/java/org/jooq/Query.java b/jOOQ/src/main/java/org/jooq/Query.java
index 553845297a..7c5e6313bb 100644
--- a/jOOQ/src/main/java/org/jooq/Query.java
+++ b/jOOQ/src/main/java/org/jooq/Query.java
@@ -176,6 +176,10 @@ public interface Query extends QueryPart, Attachable {
* Retrieve the bind values that will be bound by this Query. This
* List cannot be modified. To modify bind values, use
* {@link #getParams()} instead.
+ *
+ * Unlike {@link #getParams()}, which returns also inlined parameters, this
+ * returns only actual bind values that will render an actual bind value as
+ * a question mark "?"
*
* @see DSLContext#extractBindValues(QueryPart)
*/
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
index aec8d38ed9..0f69e9b97d 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
@@ -309,7 +309,7 @@ public class DefaultDSLContext implements DSLContext, Serializable {
public List extractBindValues(QueryPart part) {
List result = new ArrayList();
- for (Param> param : extractParams(part).values()) {
+ for (Param> param : extractParams0(part, false).values()) {
result.add(param.getValue());
}
@@ -318,7 +318,11 @@ public class DefaultDSLContext implements DSLContext, Serializable {
@Override
public Map> extractParams(QueryPart part) {
- ParamCollector collector = new ParamCollector(configuration);
+ return extractParams0(part, true);
+ }
+
+ final Map> extractParams0(QueryPart part, boolean includeInlinedParams) {
+ ParamCollector collector = new ParamCollector(configuration, includeInlinedParams);
collector.visit(part);
return Collections.unmodifiableMap(collector.result);
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java b/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java
index d1298d7c45..23703ad10d 100644
--- a/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java
+++ b/jOOQ/src/main/java/org/jooq/impl/ParamCollector.java
@@ -61,10 +61,13 @@ import org.jooq.tools.StringUtils;
*/
class ParamCollector extends AbstractBindContext {
- final Map> result = new LinkedHashMap>();
+ final Map> result = new LinkedHashMap>();
+ private final boolean includeInlinedParams;
- ParamCollector(Configuration configuration) {
+ ParamCollector(Configuration configuration, boolean includeInlinedParams) {
super(configuration);
+
+ this.includeInlinedParams = includeInlinedParams;
}
@Override
@@ -76,13 +79,17 @@ class ParamCollector extends AbstractBindContext {
protected final void bindInternal(QueryPartInternal internal) {
if (internal instanceof Param) {
Param> param = (Param>) internal;
- String i = String.valueOf(nextIndex());
- if (StringUtils.isBlank(param.getParamName())) {
- result.put(i, param);
- }
- else {
- result.put(param.getParamName(), param);
+ // [#3131] Inlined parameters should not be returned in some contexts
+ if (includeInlinedParams || !param.isInline()) {
+ String i = String.valueOf(nextIndex());
+
+ if (StringUtils.isBlank(param.getParamName())) {
+ result.put(i, param);
+ }
+ else {
+ result.put(param.getParamName(), param);
+ }
}
}
else {
diff --git a/jOOQ/src/test/java/org/jooq/test/ParamTest.java b/jOOQ/src/test/java/org/jooq/test/ParamTest.java
new file mode 100644
index 0000000000..acfc53ffcc
--- /dev/null
+++ b/jOOQ/src/test/java/org/jooq/test/ParamTest.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2009-2014, Data Geekery GmbH (http://www.datageekery.com)
+ * All rights reserved.
+ *
+ * This work is dual-licensed
+ * - under the Apache Software License 2.0 (the "ASL")
+ * - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
+ * =============================================================================
+ * You may choose which license applies to you:
+ *
+ * - If you're using this work with Open Source databases, you may choose
+ * either ASL or jOOQ License.
+ * - If you're using this work with at least one commercial database, you must
+ * choose jOOQ License
+ *
+ * For more information, please visit http://www.jooq.org/licenses
+ *
+ * Apache Software License 2.0:
+ * -----------------------------------------------------------------------------
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * jOOQ License and Maintenance Agreement:
+ * -----------------------------------------------------------------------------
+ * Data Geekery grants the Customer the non-exclusive, timely limited and
+ * non-transferable license to install and use the Software under the terms of
+ * the jOOQ License and Maintenance Agreement.
+ *
+ * This library is distributed with a LIMITED WARRANTY. See the jOOQ License
+ * and Maintenance Agreement for more details: http://www.jooq.org/licensing
+ */
+package org.jooq.test;
+
+import static java.util.Arrays.asList;
+import static org.jooq.impl.DSL.inline;
+import static org.jooq.impl.DSL.val;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jooq.Param;
+import org.jooq.Query;
+
+import org.junit.Test;
+
+/**
+ * @author Lukas Eder
+ */
+public class ParamTest extends AbstractTest {
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testData() {
+ Query query = create.select(val(1), inline(2)).where(val(3).ne(inline(4)));
+ List > values = new ArrayList >(query.getParams().values());
+
+ assertEquals(asList(val(1), inline(2), val(3), inline(4)), values);
+ assertEquals(1, values.get(0).getValue());
+ assertEquals(2, values.get(1).getValue());
+ assertEquals(3, values.get(2).getValue());
+ assertEquals(4, values.get(3).getValue());
+
+ assertFalse(values.get(0).isInline());
+ assertTrue(values.get(1).isInline());
+ assertFalse(values.get(2).isInline());
+ assertTrue(values.get(3).isInline());
+
+ assertEquals(asList(1, 3), query.getBindValues());
+ }
+}