From ebe9d22b2f61a7f5bc5b010e07f256d09c7ce4e2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 8 Sep 2014 14:35:07 +0200 Subject: [PATCH] [#3623] Add ParamType.NAMED_OR_INLINED to render named parameters only if a name is given --- jOOQ/src/main/java/org/jooq/DSLContext.java | 14 +++++- .../java/org/jooq/impl/AbstractParam.java | 6 ++- .../java/org/jooq/impl/AbstractQuery.java | 2 + .../java/org/jooq/impl/DefaultDSLContext.java | 6 +++ jOOQ/src/main/java/org/jooq/impl/Utils.java | 3 +- jOOQ/src/main/java/org/jooq/impl/Val.java | 6 +-- .../main/resources/xsd/jooq-runtime-3.5.0.xsd | 6 ++- .../test/java/org/jooq/test/RenderTest.java | 44 ++++++++++++++----- 8 files changed, 69 insertions(+), 18 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index 85a5744acd..86a5ac8835 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -262,13 +262,25 @@ public interface DSLContext { * variables as named parameters. *

* This is the same as calling - * renderContext().namedParams(true).render(part) + * renderContext().paramType(NAMED).render(part) * * @param part The {@link QueryPart} to be rendered * @return The rendered SQL */ String renderNamedParams(QueryPart part); + /** + * Render a QueryPart in the context of this DSLContext, rendering bind + * variables as named parameters, or inlined parameters if they have no name. + *

+ * This is the same as calling + * renderContext().paramType(NAMED_OR_INLINED).render(part) + * + * @param part The {@link QueryPart} to be rendered + * @return The rendered SQL + */ + String renderNamedOrInlinedParams(QueryPart part); + /** * Render a QueryPart in the context of this DSLContext, inlining all bind * variables. diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java index 6871642c64..f66caf7425 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractParam.java @@ -43,11 +43,13 @@ package org.jooq.impl; import static org.jooq.Clause.FIELD; import static org.jooq.Clause.FIELD_VALUE; import static org.jooq.conf.ParamType.INLINED; +import static org.jooq.conf.ParamType.NAMED_OR_INLINED; import org.jooq.Clause; import org.jooq.Context; import org.jooq.DataType; import org.jooq.Param; +import org.jooq.tools.StringUtils; /** * A base implementation for {@link Param} @@ -133,6 +135,8 @@ abstract class AbstractParam extends AbstractField implements Param { } final boolean isInline(Context context) { - return isInline() || context.paramType() == INLINED; + return isInline() + || (context.paramType() == INLINED) + || (context.paramType() == NAMED_OR_INLINED && StringUtils.isBlank(paramName)); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java index 01cbd960ef..e116b7571d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java @@ -475,6 +475,8 @@ abstract class AbstractQuery extends AbstractQueryPart implements Query, Attacha return create().renderInlined(this); case NAMED: return create().renderNamedParams(this); + case NAMED_OR_INLINED: + return create().renderNamedOrInlinedParams(this); } throw new IllegalArgumentException("ParamType not supported: " + paramType); diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java index 28cd5c4475..b5d7cd89f0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java @@ -42,6 +42,7 @@ package org.jooq.impl; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.conf.ParamType.NAMED; +import static org.jooq.conf.ParamType.NAMED_OR_INLINED; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.fieldByName; import static org.jooq.impl.DSL.queryPart; @@ -374,6 +375,11 @@ public class DefaultDSLContext implements DSLContext, Serializable { return renderContext().paramType(NAMED).render(part); } + @Override + public String renderNamedOrInlinedParams(QueryPart part) { + return renderContext().paramType(NAMED_OR_INLINED).render(part); + } + @Override public String renderInlined(QueryPart part) { return renderContext().paramType(INLINED).render(part); diff --git a/jOOQ/src/main/java/org/jooq/impl/Utils.java b/jOOQ/src/main/java/org/jooq/impl/Utils.java index 30d35711e6..71638fdc5e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Utils.java +++ b/jOOQ/src/main/java/org/jooq/impl/Utils.java @@ -46,6 +46,7 @@ import static org.jooq.SQLDialect.CUBRID; import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.conf.ParamType.NAMED; +import static org.jooq.conf.ParamType.NAMED_OR_INLINED; import static org.jooq.conf.SettingsTools.reflectionCaching; import static org.jooq.conf.SettingsTools.updatablePrimaryKeys; import static org.jooq.impl.DSL.concat; @@ -1270,7 +1271,7 @@ final class Utils { else if (sqlChars[i] == '?' && substituteIndex < substitutes.size()) { QueryPart substitute = substitutes.get(substituteIndex++); - if (render.paramType() == INLINED || render.paramType() == NAMED) { + if (render.paramType() == INLINED || render.paramType() == NAMED || render.paramType() == NAMED_OR_INLINED) { render.visit(substitute); } else { diff --git a/jOOQ/src/main/java/org/jooq/impl/Val.java b/jOOQ/src/main/java/org/jooq/impl/Val.java index 97efbccf72..d177b3267d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Val.java +++ b/jOOQ/src/main/java/org/jooq/impl/Val.java @@ -60,8 +60,8 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... // ... -import static org.jooq.conf.ParamType.INLINED; import static org.jooq.conf.ParamType.NAMED; +import static org.jooq.conf.ParamType.NAMED_OR_INLINED; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.using; import static org.jooq.tools.StringUtils.leftPad; @@ -313,7 +313,7 @@ class Val extends AbstractParam { * {@link RenderContext#namedParams()} */ private final String getBindVariable(RenderContext context) { - if (context.paramType() == NAMED) { + if (context.paramType() == NAMED || context.paramType() == NAMED_OR_INLINED) { int index = context.nextIndex(); if (StringUtils.isBlank(getParamName())) { @@ -631,7 +631,7 @@ class Val extends AbstractParam { final void bind0(BindContext context) { // [#1302] Bind value only if it was not explicitly forced to be inlined - if (!isInline() && context.paramType() != INLINED) { + if (!isInline(context)) { context.bindValue(value, this); } } diff --git a/jOOQ/src/main/resources/xsd/jooq-runtime-3.5.0.xsd b/jOOQ/src/main/resources/xsd/jooq-runtime-3.5.0.xsd index 2eb629657b..0840766acd 100644 --- a/jOOQ/src/main/resources/xsd/jooq-runtime-3.5.0.xsd +++ b/jOOQ/src/main/resources/xsd/jooq-runtime-3.5.0.xsd @@ -38,7 +38,8 @@ - question marks - named parameters - - inlined values + - named or inlined parameters + - inlined parameters This value is overridden by statementType == STATIC_STATEMENT, in case of which, this defaults to INLINED @@ -128,6 +129,9 @@ + + + diff --git a/jOOQ/src/test/java/org/jooq/test/RenderTest.java b/jOOQ/src/test/java/org/jooq/test/RenderTest.java index 5261a831f9..2fd94f3ceb 100644 --- a/jOOQ/src/test/java/org/jooq/test/RenderTest.java +++ b/jOOQ/src/test/java/org/jooq/test/RenderTest.java @@ -44,9 +44,11 @@ import static org.jooq.SQLDialect.MYSQL; import static org.jooq.conf.ParamType.INDEXED; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.conf.ParamType.NAMED; +import static org.jooq.conf.ParamType.NAMED_OR_INLINED; import static org.jooq.conf.RenderKeywordStyle.LOWER; import static org.jooq.conf.RenderKeywordStyle.UPPER; import static org.jooq.conf.StatementType.STATIC_STATEMENT; +import static org.jooq.impl.DSL.param; import static org.jooq.impl.DSL.val; import org.jooq.DSLContext; @@ -72,13 +74,14 @@ public class RenderTest extends AbstractTest { assertEquals("select ?, ? from dual", q.getSQL(false)); assertEquals("select 1, 'A' from dual", q.getSQL(true)); assertEquals("select ?, ? from dual", q.getSQL(INDEXED)); - assertEquals("select :1, :2 from dual", q.getSQL(NAMED)); + assertEquals("select :var, :2 from dual", q.getSQL(NAMED)); + assertEquals("select :var, 'A' from dual", q.getSQL(NAMED_OR_INLINED)); assertEquals("select 1, 'A' from dual", q.getSQL(INLINED)); } @Test public void testGetSQL() { - Query q = create.select(val(1), val("A")); + Query q = create.select(param("var", 1), val("A")); testGetSQL0(q, "select ?, ? from dual"); } @@ -86,7 +89,7 @@ public class RenderTest extends AbstractTest { public void testGetSQLWithParamTypeINDEXED() { Query q = DSL.using(SQLDialect.MYSQL, new Settings().withParamType(INDEXED)) - .select(val(1), val("A")); + .select(param("var", 1), val("A")); testGetSQL0(q, "select ?, ? from dual"); } @@ -96,7 +99,7 @@ public class RenderTest extends AbstractTest { Query q = DSL.using(SQLDialect.MYSQL, new Settings().withParamType(INDEXED) .withStatementType(STATIC_STATEMENT)) - .select(val(1), val("A")); + .select(param("var", 1), val("A")); testGetSQL0(q, "select 1, 'A' from dual"); } @@ -105,17 +108,36 @@ public class RenderTest extends AbstractTest { public void testGetSQLWithParamTypeNAMED() { Query q = DSL.using(SQLDialect.MYSQL, new Settings().withParamType(NAMED)) - .select(val(1), val("A")); + .select(param("var", 1), val("A")); - testGetSQL0(q, "select :1, :2 from dual"); + testGetSQL0(q, "select :var, :2 from dual"); } @Test public void testGetSQLWithParamTypeNAMEDandStatementTypeSTATIC() { Query q = DSL.using(SQLDialect.MYSQL, new Settings().withParamType(NAMED) - .withStatementType(STATIC_STATEMENT)) - .select(val(1), val("A")); + .withStatementType(STATIC_STATEMENT)) + .select(param("var", 1), val("A")); + + testGetSQL0(q, "select 1, 'A' from dual"); + } + + @Test + public void testGetSQLWithParamTypeNAMED_OR_INLINED() { + Query q = + DSL.using(SQLDialect.MYSQL, new Settings().withParamType(NAMED_OR_INLINED)) + .select(param("var", 1), val("A")); + + testGetSQL0(q, "select :var, 'A' from dual"); + } + + @Test + public void testGetSQLWithParamTypeNAMED_OR_INLINEDandStatementTypeSTATIC() { + Query q = + DSL.using(SQLDialect.MYSQL, new Settings().withParamType(NAMED_OR_INLINED) + .withStatementType(STATIC_STATEMENT)) + .select(param("var", 1), val("A")); testGetSQL0(q, "select 1, 'A' from dual"); } @@ -124,7 +146,7 @@ public class RenderTest extends AbstractTest { public void testGetSQLWithParamTypeINLINED() { Query q = DSL.using(SQLDialect.MYSQL, new Settings().withParamType(INLINED)) - .select(val(1), val("A")); + .select(param("var", 1), val("A")); testGetSQL0(q, "select 1, 'A' from dual"); } @@ -133,8 +155,8 @@ public class RenderTest extends AbstractTest { public void testGetSQLWithParamTypeINLINEDandStatementTypeSTATIC() { Query q = DSL.using(SQLDialect.MYSQL, new Settings().withParamType(INLINED) - .withStatementType(STATIC_STATEMENT)) - .select(val(1), val("A")); + .withStatementType(STATIC_STATEMENT)) + .select(param("var", 1), val("A")); testGetSQL0(q, "select 1, 'A' from dual"); }