From d1320bf98e71f3aaaeace99d8cedcda52c0a455f Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 12 Aug 2014 11:16:57 +0200 Subject: [PATCH] [#3533] Avoid using named parameters for Oracle, if not really needed --- .../all/testcases/RoutineAndUDTTests.java | 14 +- .../java/org/jooq/impl/AbstractRoutine.java | 136 +++++++++--------- 2 files changed, 76 insertions(+), 74 deletions(-) diff --git a/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RoutineAndUDTTests.java b/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RoutineAndUDTTests.java index ba91fdc30b..60ebd867a3 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RoutineAndUDTTests.java +++ b/jOOQ-test/src/test/java/org/jooq/test/all/testcases/RoutineAndUDTTests.java @@ -50,6 +50,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeNotNull; +import static org.junit.Assume.assumeTrue; import java.sql.Date; import java.util.Arrays; @@ -236,31 +238,27 @@ extends BaseTestget()) { - log.info("SKIPPING", "procedure tests with default parameters"); - return; - } + assumeTrue(pdefault.field("P_IN_NUMBER").call("isDefaulted").get()); } catch (ReflectException e) { log.info("SKIPPING", "procedure tests with default parameters"); return; } + // Call with defaulted IN parameters only Reflect executedWithDefaults = pdefault.create(); executedWithDefaults.call("execute", create().configuration()); assertEquals(0, executedWithDefaults.call("getPOutNumber").get().intValue()); assertEquals("0", executedWithDefaults.call("getPOutVarchar").get()); assertEquals(Date.valueOf("1981-07-10"), executedWithDefaults.call("getPOutDate").get()); + // Call with all values provided Reflect executedWithoutDefault = pdefault.create(); executedWithoutDefault.call("setPInNumber", 123); executedWithoutDefault.call("setPInVarchar", "abc"); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 39c3bfdefc..d4e6cb1d83 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -42,6 +42,7 @@ package org.jooq.impl; import static org.jooq.Clause.FIELD; import static org.jooq.Clause.FIELD_FUNCTION; +// ... import static org.jooq.SQLDialect.POSTGRES; // ... import static org.jooq.impl.DSL.function; @@ -113,12 +114,14 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro private final DataType type; private Parameter returnParameter; private boolean overloaded; + private boolean hasDefaultedParameters; // ------------------------------------------------------------------------ // Call-data attributes (call-specific) // ------------------------------------------------------------------------ private final Map, Field> inValues; + private final Set> inValuesDefaulted; private final Set> inValuesNonDefaulted; private transient Field function; @@ -152,6 +155,7 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro this.inParameters = new ArrayList>(); this.outParameters = new ArrayList>(); this.inValues = new HashMap, Field>(); + this.inValuesDefaulted = new HashSet>(); this.inValuesNonDefaulted = new HashSet>(); this.results = new HashMap, Object>(); this.type = type; @@ -182,9 +186,10 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro setField(parameter, val(null, parameter.getDataType())); } - // [#1183] Add the field to the in-values and mark them as non-defaulted + // [#1183] [#3533] Add the field to the in-values and mark them as non-defaulted else { inValues.put(parameter, value); + inValuesDefaulted.remove(parameter); inValuesNonDefaulted.add(parameter); } } @@ -352,8 +357,8 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro final void bind0(BindContext context) { for (Parameter parameter : getParameters()) { - // [#1183] Skip defaulted parameters - if (getInParameters().contains(parameter) && !inValuesNonDefaulted.contains(parameter)) { + // [#1183] [#3533] Skip defaulted parameters + if (getInParameters().contains(parameter) && inValuesDefaulted.contains(parameter)) { continue; } @@ -402,8 +407,8 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro toSQLOutParam(context, parameter); } - // [#1183] Omit defaulted parameters - else if (!inValuesNonDefaulted.contains(parameter)) { + // [#1183] [#3533] Omit defaulted parameters + else if (inValuesDefaulted.contains(parameter)) { continue; } @@ -428,62 +433,54 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro } private final void toSQLEnd(RenderContext context) { - switch (context.configuration().dialect().family()) { - /* [pro] xx - xxxx xxxxxxx - xxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxx - xxxxxx - - xx [/pro] */ - default: - context.sql(" }"); - break; + /* [pro] xx + xx xxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxx xx xxxxxxx x + xxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxx + x + xxxx + xx [/pro] */ + { + context.sql(" }"); } } private final void toSQLBegin(RenderContext context) { - switch (context.configuration().dialect().family()) { - /* [pro] xx - xxxx xxxxxxx - xxxxxxxxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxxxx - xxxxxx - - xx [/pro] */ - default: - context.sql("{ "); - break; + /* [pro] xx + xx xxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxx xx xxxxxxx x + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxx + x + xxxx + xx [/pro] */ + { + context.sql("{ "); } } private final void toSQLAssign(RenderContext context) { - switch (context.configuration().dialect().family()) { - /* [pro] xx - xxxx xxxxxxx - xxxxxxxxxxxxxx xx xxx - xxxxxx - - xx [/pro] */ - default: - context.sql("? = "); - break; + /* [pro] xx + xx xxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxx xx xxxxxxx x + xxxxxxxxxxxxxx xx xxx + x + xxxx + xx [/pro] */ + { + context.sql("? = "); } } private final void toSQLCall(RenderContext context) { - switch (context.configuration().dialect().family()) { - /* [pro] xx - xxxx xxxxxxx - xxxxxx - - xx [/pro] */ - default: - context.sql("call "); - break; + /* [pro] xx + xx xxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxx xx xxxxxxx x + x + xxxx + xx [/pro] */ + { + context.sql("call "); } toSQLQualifiedName(context); @@ -491,11 +488,9 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro private final void toSQLOutParam(RenderContext context, Parameter parameter) { /* [pro] xx - xxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x - xxxx xxxxxxx - xxxxxxxxxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxx xx xxx - xxxxxx + xx xxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxx xx xxxxxxx x + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxx xx xxx x xx [/pro] */ @@ -504,11 +499,9 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro private final void toSQLInParam(RenderContext context, Parameter parameter, Field value) { /* [pro] xx - xxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x - xxxx xxxxxxx - xxxxxxxxxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxx xx xxx - xxxxxx + xx xxxxxxxxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxx xx xxxxxxx x + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxx xx xxx x xx [/pro] */ @@ -670,32 +663,43 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro return overloaded; } - protected final void addInParameter(Parameter parameter) { - inParameters.add(parameter); + private final boolean hasDefaultedParameters() { + return hasDefaultedParameters && !inValuesDefaulted.isEmpty(); + } + + private final void addParameter(Parameter parameter) { allParameters.add(parameter); + hasDefaultedParameters |= parameter.isDefaulted(); + } + + protected final void addInParameter(Parameter parameter) { + addParameter(parameter); + inParameters.add(parameter); // IN parameters are initialised with null by default inValues.put(parameter, val(null, parameter.getDataType())); - // [#1183] non-defaulted parameters are marked as such - if (!parameter.isDefaulted()) { + // [#1183] [#3533] defaulted parameters are marked as such + if (parameter.isDefaulted()) + inValuesDefaulted.add(parameter); + else inValuesNonDefaulted.add(parameter); - } } + protected final void addInOutParameter(Parameter parameter) { addInParameter(parameter); outParameters.add(parameter); } protected final void addOutParameter(Parameter parameter) { + addParameter(parameter); outParameters.add(parameter); - allParameters.add(parameter); } protected final void setReturnParameter(Parameter parameter) { + addParameter(parameter); returnParameter = parameter; - allParameters.add(parameter); } public final Field asField() {