diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java index be39065ce5..d2a4c09203 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java @@ -75,6 +75,7 @@ abstract class AbstractGenerator implements Generator { boolean generateGlobalUDTReferences = true; boolean fluentSetters = false; String fullyQualifiedTypes = ""; + boolean generateTableValuedFunctions = true; protected GeneratorStrategyWrapper strategy; final Language language; @@ -119,6 +120,16 @@ abstract class AbstractGenerator implements Generator { this.generateRelations = generateRelations; } + @Override + public boolean generateTableValuedFunctions() { + return generateTableValuedFunctions; + } + + @Override + public void setGenerateTableValuedFunctions(boolean generateTableValuedFunctions) { + this.generateTableValuedFunctions = generateTableValuedFunctions; + } + @Override public boolean generateInstanceFields() { return generateInstanceFields; diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java index 31a7b49e43..e899ec82a1 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java @@ -448,6 +448,8 @@ public class GenerationTool { generator.setUseSchemaVersionProvider(true); if (!StringUtils.isBlank(g.getDatabase().getCatalogVersionProvider())) generator.setUseCatalogVersionProvider(true); + if (g.getDatabase().isTableValuedFunctions() != null) + generator.setGenerateTableValuedFunctions(g.getDatabase().isTableValuedFunctions()); // Generator properties that should in fact be strategy properties strategy.setInstanceFields(generator.generateInstanceFields()); diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java index 7fb0c45621..238adc0701 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java @@ -85,6 +85,16 @@ public interface Generator { */ void setGenerateRelations(boolean generateRelations); + /** + * Whether table-valued functions should be generated as tables. + */ + boolean generateTableValuedFunctions(); + + /** + * Whether table-valued functions should be generated as tables. + */ + void setGenerateTableValuedFunctions(boolean generateTableValuedFunctions); + /** * Whether instance fields should be generated (as opposed to static fields) */ diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index 2d75830d36..b3aabd2db2 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -200,6 +200,7 @@ public class JavaGenerator extends AbstractGenerator { this.database = db; this.database.addFilter(new AvoidAmbiguousClassesFilter()); this.database.setIncludeRelations(generateRelations()); + this.database.setTableValuedFunctions(generateTableValuedFunctions()); String url = ""; try { @@ -245,6 +246,7 @@ public class JavaGenerator extends AbstractGenerator { log.info(" daos", generateDaos()); log.info(" relations", generateRelations() + ((!generateRelations && generateDaos) ? " (forced to true because of )" : "")); + log.info(" table-valued functions", generateTableValuedFunctions()); log.info(" global references", generateGlobalObjectReferences()); log.info("----------------------------------------------------------"); @@ -4370,7 +4372,6 @@ public class JavaGenerator extends AbstractGenerator { return; } - final String className = out.ref(getStrategy().getFullJavaClassName(function)); final String recordClassName = out.ref(getStrategy().getFullJavaClassName(function, Mode.RECORD)); // [#3456] Local variables should not collide with actual function arguments diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java index 2d145680bd..fb38e0d6f4 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java @@ -141,6 +141,7 @@ public abstract class AbstractDatabase implements Database { private List packages; private Relations relations; private boolean includeRelations = true; + private boolean tableValuedFunctions = true; private transient Map> sequencesBySchema; private transient Map> identitiesBySchema; @@ -720,6 +721,16 @@ public abstract class AbstractDatabase implements Database { return includeRelations; } + @Override + public final void setTableValuedFunctions(boolean tableValuedFunctions) { + this.tableValuedFunctions = tableValuedFunctions; + } + + @Override + public final boolean tableValuedFunctions() { + return tableValuedFunctions; + } + @Override public final List getSequences(SchemaDefinition schema) { if (sequences == null) { diff --git a/jOOQ-meta/src/main/java/org/jooq/util/Database.java b/jOOQ-meta/src/main/java/org/jooq/util/Database.java index fd7fc7fa31..caddde8f43 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/Database.java @@ -469,6 +469,16 @@ public interface Database { */ boolean includeRelations(); + /** + * [#4838] Whether table-valued functions should be reported as tables. + */ + void setTableValuedFunctions(boolean tableValuedFunctions); + + /** + * [#4838] Whether table-valued functions should be reported as tables. + */ + boolean tableValuedFunctions(); + /** * Check for the existence of a table in the dictionary views. */ diff --git a/jOOQ-meta/src/main/java/org/jooq/util/firebird/FirebirdDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/firebird/FirebirdDatabase.java index 153ff3d8c3..3c01351ea4 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/firebird/FirebirdDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/firebird/FirebirdDatabase.java @@ -42,8 +42,10 @@ package org.jooq.util.firebird; import static org.jooq.impl.DSL.choose; import static org.jooq.impl.DSL.decode; +import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.select; +import static org.jooq.impl.DSL.trueCondition; import static org.jooq.util.firebird.rdb.Tables.RDB$GENERATORS; import static org.jooq.util.firebird.rdb.Tables.RDB$INDEX_SEGMENTS; import static org.jooq.util.firebird.rdb.Tables.RDB$PROCEDURES; @@ -249,6 +251,9 @@ public class FirebirdDatabase extends AbstractDatabase { // "selectable" procedures .where(RDB$PROCEDURES.RDB$PROCEDURE_TYPE.eq((short) 1)) + .and(tableValuedFunctions() + ? trueCondition() + : falseCondition()) ) .orderBy(1)) { diff --git a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java index 4a1062fd83..df5eece7cb 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java @@ -42,15 +42,19 @@ package org.jooq.util.postgres; import static org.jooq.impl.DSL.array; +import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.count; import static org.jooq.impl.DSL.decode; +import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.max; import static org.jooq.impl.DSL.name; +import static org.jooq.impl.DSL.not; import static org.jooq.impl.DSL.row; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.selectOne; +import static org.jooq.impl.DSL.trueCondition; import static org.jooq.impl.DSL.upper; import static org.jooq.impl.DSL.val; import static org.jooq.util.postgres.PostgresDSL.arrayAppend; @@ -85,8 +89,10 @@ import org.jooq.Record; import org.jooq.Record2; import org.jooq.Record4; import org.jooq.Record5; +import org.jooq.Record6; import org.jooq.Result; import org.jooq.SQLDialect; +import org.jooq.Select; import org.jooq.exception.DataAccessException; import org.jooq.impl.DSL; import org.jooq.tools.JooqLogger; @@ -256,6 +262,10 @@ public class PostgresDatabase extends AbstractDatabase { List result = new ArrayList(); Map map = new HashMap(); + Select> empty = + select(inline(""), inline(""), inline(""), inline(false), inline(false), inline("")) + .where(falseCondition()); + for (Record record : create() .select() .from( @@ -310,19 +320,23 @@ public class PostgresDatabase extends AbstractDatabase { // [#3375] [#3376] Include table-valued functions in the set of tables .unionAll( - select( - ROUTINES.ROUTINE_SCHEMA, - ROUTINES.ROUTINE_NAME, - ROUTINES.SPECIFIC_NAME, - inline(true).as("table_valued_function"), - inline(false).as("materialized_view"), - inline("")) - .from(ROUTINES) - .join(PG_NAMESPACE).on(ROUTINES.SPECIFIC_SCHEMA.eq(PG_NAMESPACE.NSPNAME)) - .join(PG_PROC).on(PG_PROC.PRONAMESPACE.eq(oid(PG_NAMESPACE))) - .and(PG_PROC.PRONAME.concat("_").concat(oid(PG_PROC)).eq(ROUTINES.SPECIFIC_NAME)) - .where(ROUTINES.ROUTINE_SCHEMA.in(getInputSchemata())) - .and(PG_PROC.PRORETSET)) + tableValuedFunctions() + + ? select( + ROUTINES.ROUTINE_SCHEMA, + ROUTINES.ROUTINE_NAME, + ROUTINES.SPECIFIC_NAME, + inline(true).as("table_valued_function"), + inline(false).as("materialized_view"), + inline("")) + .from(ROUTINES) + .join(PG_NAMESPACE).on(ROUTINES.SPECIFIC_SCHEMA.eq(PG_NAMESPACE.NSPNAME)) + .join(PG_PROC).on(PG_PROC.PRONAMESPACE.eq(oid(PG_NAMESPACE))) + .and(PG_PROC.PRONAME.concat("_").concat(oid(PG_PROC)).eq(ROUTINES.SPECIFIC_NAME)) + .where(ROUTINES.ROUTINE_SCHEMA.in(getInputSchemata())) + .and(PG_PROC.PRORETSET) + + : empty) .asTable("tables")) .orderBy(1, 2) .fetch()) { @@ -683,7 +697,9 @@ public class PostgresDatabase extends AbstractDatabase { .join(PG_PROC).on(PG_PROC.PRONAMESPACE.eq(oid(PG_NAMESPACE))) .and(PG_PROC.PRONAME.concat("_").concat(oid(PG_PROC)).eq(r1.SPECIFIC_NAME)) .where(r1.ROUTINE_SCHEMA.in(getInputSchemata())) - .andNot(PG_PROC.PRORETSET) + .and(tableValuedFunctions() + ? condition(not(PG_PROC.PRORETSET)) + : trueCondition()) .orderBy( r1.ROUTINE_SCHEMA.asc(), r1.ROUTINE_NAME.asc()) diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd index 905825419e..8f480128d2 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.8.0.xsd @@ -543,6 +543,16 @@ artefacts (e.g. in combination with enumTypes) --> + + +