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 60ebd867a3..551fa8839e 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 @@ -58,6 +58,7 @@ import java.util.Arrays; // ... import org.jooq.Configuration; +import org.jooq.DSLContext; import org.jooq.Field; import org.jooq.InsertQuery; import org.jooq.Record; @@ -67,6 +68,7 @@ import org.jooq.Record3; import org.jooq.Record6; import org.jooq.Result; import org.jooq.SQLDialect; +import org.jooq.Select; import org.jooq.SelectQuery; import org.jooq.Table; import org.jooq.TableRecord; @@ -79,6 +81,8 @@ import org.jooq.test.jOOQAbstractTest; import org.jooq.tools.reflect.Reflect; import org.jooq.tools.reflect.ReflectException; +import org.junit.Assume; + public class RoutineAndUDTTests< A extends UpdatableRecord & Record6, AP, @@ -270,11 +274,7 @@ extends BaseTest f = (Field) FOneField(); + Select> select = create.select(f).where(f.eq(f)); + + assertEquals(FOneField().getDataType().convert(1), create.fetchValue(select)); + assertTrue(create.render(select).contains("select (select")); + assertTrue(create.render(select).contains("= (select")); + } + public void testStoredFunctionsWithNoSchema() throws Exception { - if (cRoutines() == null) { - log.info("SKIPPING", "functions test with no schema"); - return; - } + Assume.assumeNotNull(cRoutines()); /* [pro] xx xx xxx xxxxx xxx xx xxxxx xxxxxxxxxxx xxxxxxxx xxxxxx xxxx xx xxx xxxxx xxxxxx @@ -398,8 +409,7 @@ extends BaseTest extends AbstractQueryPart implements Ro /** * The {@link Field} representation of this {@link Routine} */ - private class RoutineField extends AbstractFunction { + private class RoutineField extends AbstractField { /** * Generated UID @@ -776,8 +778,8 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro } @Override - final Field getFunction0(Configuration c) { - RenderContext local = create(c).renderContext(); + public void accept(Context ctx) { + RenderContext local = create(ctx).renderContext(); toSQLQualifiedName(local); Field[] array = new Field[getInParameters().size()]; @@ -786,7 +788,7 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro for (Parameter p : getInParameters()) { // Disambiguate overloaded function signatures - if (POSTGRES == c.dialect() && isOverloaded()) { + if (POSTGRES == ctx.dialect() && isOverloaded()) { array[i] = getInValues().get(p).cast(p.getType()); } else { @@ -796,7 +798,14 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro i++; } - return function(local.render(), getDataType(), array); + Field result = function(local.render(), getDataType(), array); + + // [#3592] Decrease SQL -> PL/SQL context switches with Oracle Scalar Subquery Caching + if (TRUE.equals(settings(ctx.configuration()).isRenderScalarSubqueriesForStoredFunctions())) { + result = DSL.select(result).asField(); + } + + ctx.visit(result); } } 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 e21421f11b..2eb629657b 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 @@ -29,6 +29,11 @@ + + +