diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java index 8f311380ae..b8ce506892 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java @@ -519,8 +519,6 @@ class GenerationUtil { } case H2: - return name(H2DataType.OTHER.getTypeName()); - case HSQLDB: default: { diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index e6ce1c79fe..3db8f2109c 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -2783,6 +2783,8 @@ public abstract class AbstractDatabase implements Database { @Override public final boolean isArrayType(String dataType) { + String upper = dataType.toUpperCase(); + switch (getDialect().family()) { @@ -2793,17 +2795,19 @@ public abstract class AbstractDatabase implements Database { - case H2: case POSTGRES: case YUGABYTE: - return "ARRAY".equals(dataType.toUpperCase()); + return "ARRAY".equals(upper); + + case H2: + return "ARRAY".equals(upper) || upper.endsWith(" ARRAY"); case HSQLDB: default: // TODO: Is there any more robust way to recognise these? // For instance, there could be a UDT that is called this way - return dataType.toUpperCase().endsWith(" ARRAY"); + return upper.endsWith(" ARRAY"); } } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java index 9c170f37f8..f31780cf13 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java @@ -37,7 +37,14 @@ */ package org.jooq.meta.h2; +import static java.util.Arrays.asList; import static org.jooq.Records.mapping; +import static org.jooq.SQLDialect.H2; +// ... +// ... +import static org.jooq.impl.DSL.arrayAgg; +import static org.jooq.impl.DSL.coalesce; +import static org.jooq.impl.DSL.concat; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; @@ -46,6 +53,7 @@ import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.noCondition; import static org.jooq.impl.DSL.not; import static org.jooq.impl.DSL.nullif; +import static org.jooq.impl.DSL.nvl; import static org.jooq.impl.DSL.one; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.upper; @@ -65,6 +73,13 @@ import static org.jooq.meta.h2.information_schema.Tables.SEQUENCES; import static org.jooq.meta.h2.information_schema.Tables.TABLES; import static org.jooq.meta.h2.information_schema.Tables.TYPE_INFO; import static org.jooq.meta.h2.information_schema.Tables.VIEWS; +import static org.jooq.meta.hsqldb.information_schema.Tables.CHECK_CONSTRAINTS; +import static org.jooq.meta.hsqldb.information_schema.Tables.DOMAIN_CONSTRAINTS; +import static org.jooq.meta.hsqldb.information_schema.Tables.ELEMENT_TYPES; +import static org.jooq.meta.hsqldb.information_schema.Tables.KEY_COLUMN_USAGE; +import static org.jooq.meta.hsqldb.information_schema.Tables.REFERENTIAL_CONSTRAINTS; +import static org.jooq.meta.hsqldb.information_schema.Tables.ROUTINES; +import static org.jooq.meta.hsqldb.information_schema.Tables.TABLE_CONSTRAINTS; import java.io.StringReader; import java.math.BigDecimal; @@ -90,7 +105,6 @@ import org.jooq.Table; import org.jooq.TableField; import org.jooq.TableOptions.TableType; import org.jooq.impl.DSL; -import org.jooq.impl.SQLDataType; import org.jooq.meta.AbstractDatabase; import org.jooq.meta.AbstractIndexDefinition; import org.jooq.meta.ArrayDefinition; @@ -115,6 +129,12 @@ import org.jooq.meta.SchemaDefinition; import org.jooq.meta.SequenceDefinition; import org.jooq.meta.TableDefinition; import org.jooq.meta.UDTDefinition; +import org.jooq.meta.hsqldb.information_schema.Tables; +import org.jooq.meta.hsqldb.information_schema.tables.CheckConstraints; +import org.jooq.meta.hsqldb.information_schema.tables.DomainConstraints; +import org.jooq.meta.hsqldb.information_schema.tables.Domains; +import org.jooq.meta.hsqldb.information_schema.tables.KeyColumnUsage; +import org.jooq.tools.JooqLogger; import org.jooq.tools.StringUtils; import org.jooq.tools.csv.CSVReader; import org.jooq.util.h2.H2DataType; @@ -149,25 +169,7 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase List result = new ArrayList<>(); // Same implementation as in HSQLDBDatabase and MySQLDatabase - Map> indexes = create() - .select( - INDEXES.TABLE_SCHEMA, - INDEXES.TABLE_NAME, - INDEXES.INDEX_NAME, - INDEXES.NON_UNIQUE, - INDEXES.COLUMN_NAME, - INDEXES.ORDINAL_POSITION, - INDEXES.ASC_OR_DESC) - .from(INDEXES) - .where(INDEXES.TABLE_SCHEMA.in(getInputSchemata())) - .and(getIncludeSystemIndexes() - ? noCondition() - : not(condition(INDEXES.IS_GENERATED))) - .orderBy( - INDEXES.TABLE_SCHEMA, - INDEXES.TABLE_NAME, - INDEXES.INDEX_NAME, - INDEXES.ORDINAL_POSITION) + Map> indexes = indexes() .fetchGroups( new Field[] { INDEXES.TABLE_SCHEMA, @@ -226,6 +228,61 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase return result; } + private ResultQuery indexes() { + if (is2_0_202()) + return indexes2_0(); + else + return indexes1_4(); + } + + private ResultQuery indexes2_0() { + return create() + .select( + INDEXES.TABLE_SCHEMA, + INDEXES.TABLE_NAME, + INDEXES.INDEX_NAME, + field(field(INDEXES.getQualifiedName().append("INDEX_TYPE_NAME")).ne(inline("UNIQUE INDEX"))).as(INDEXES.NON_UNIQUE), + field("i.column_name", INDEXES.COLUMN_NAME).as(INDEXES.COLUMN_NAME), + field("i.ordinal_position", INDEXES.ORDINAL_POSITION).as(INDEXES.ORDINAL_POSITION), + field("i.ordering_specification", INDEXES.ASC_OR_DESC).as(INDEXES.ASC_OR_DESC)) + .from(INDEXES) + .join("information_schema.index_columns i") + .on("{0} = i.table_schema", INDEXES.TABLE_SCHEMA) + .and("{0} = i.table_name", INDEXES.TABLE_NAME) + .and("{0} = i.index_name", INDEXES.INDEX_NAME) + .where(INDEXES.TABLE_SCHEMA.in(getInputSchemata())) + .and(getIncludeSystemIndexes() + ? noCondition() + : not(condition(INDEXES.IS_GENERATED))) + .orderBy( + INDEXES.TABLE_SCHEMA, + INDEXES.TABLE_NAME, + INDEXES.INDEX_NAME, + field("i.ordinal_position")); + } + + private ResultQuery indexes1_4() { + return create() + .select( + INDEXES.TABLE_SCHEMA, + INDEXES.TABLE_NAME, + INDEXES.INDEX_NAME, + INDEXES.NON_UNIQUE, + INDEXES.COLUMN_NAME, + INDEXES.ORDINAL_POSITION, + INDEXES.ASC_OR_DESC) + .from(INDEXES) + .where(INDEXES.TABLE_SCHEMA.in(getInputSchemata())) + .and(getIncludeSystemIndexes() + ? noCondition() + : not(condition(INDEXES.IS_GENERATED))) + .orderBy( + INDEXES.TABLE_SCHEMA, + INDEXES.TABLE_NAME, + INDEXES.INDEX_NAME, + INDEXES.ORDINAL_POSITION); + } + @Override protected void loadPrimaryKeys(DefaultRelations relations) throws SQLException { for (Record record : primaryKeys(getInputSchemata())) { @@ -263,16 +320,42 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase @Override public ResultQuery> primaryKeys(List schemas) { + if (is2_0_202()) + return keys2_0(schemas, Arrays.>asList(inline("PRIMARY KEY"), inline("PRIMARY_KEY"))); + // Workaround for https://github.com/h2database/h2database/issues/1000 - return keys(schemas, Arrays.>asList(inline("PRIMARY KEY"), inline("PRIMARY_KEY"))); + else + return keys1_4(schemas, Arrays.>asList(inline("PRIMARY KEY"), inline("PRIMARY_KEY"))); } @Override public ResultQuery> uniqueKeys(List schemas) { - return keys(schemas, Arrays.>asList(inline("UNIQUE"))); + if (is2_0_202()) + return keys2_0(schemas, Arrays.>asList(inline("UNIQUE"))); + else + return keys1_4(schemas, Arrays.>asList(inline("UNIQUE"))); } - private ResultQuery> keys(List schemas, List> constraintTypes) { + private ResultQuery> keys2_0(List schemas, List> constraintTypes) { + return create() + .select( + KEY_COLUMN_USAGE.TABLE_CATALOG, + KEY_COLUMN_USAGE.TABLE_SCHEMA, + KEY_COLUMN_USAGE.TABLE_NAME, + KEY_COLUMN_USAGE.CONSTRAINT_NAME, + KEY_COLUMN_USAGE.COLUMN_NAME, + KEY_COLUMN_USAGE.ORDINAL_POSITION.coerce(INTEGER)) + .from(KEY_COLUMN_USAGE) + .where(KEY_COLUMN_USAGE.tableConstraints().CONSTRAINT_TYPE.in(constraintTypes)) + .and(KEY_COLUMN_USAGE.tableConstraints().TABLE_SCHEMA.in(schemas)) + .orderBy( + KEY_COLUMN_USAGE.TABLE_SCHEMA.asc(), + KEY_COLUMN_USAGE.TABLE_NAME.asc(), + KEY_COLUMN_USAGE.CONSTRAINT_NAME.asc(), + KEY_COLUMN_USAGE.ORDINAL_POSITION.asc()); + } + + private ResultQuery> keys1_4(List schemas, List> constraintTypes) { return create().select( CONSTRAINTS.TABLE_CATALOG, CONSTRAINTS.TABLE_SCHEMA, @@ -295,6 +378,72 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase @Override protected void loadForeignKeys(DefaultRelations relations) throws SQLException { + if (is2_0_202()) + loadForeignKeys2_0(relations); + else + loadForeignKeys1_4(relations); + } + + private void loadForeignKeys2_0(DefaultRelations relations) { + KeyColumnUsage fkKcu = KEY_COLUMN_USAGE.as("fk_kcu"); + KeyColumnUsage pkKcu = KEY_COLUMN_USAGE.as("pk_kcu"); + + for (Record record : create() + .select( + REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME, + REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA, + TABLE_CONSTRAINTS.TABLE_NAME, + fkKcu.CONSTRAINT_NAME, + fkKcu.TABLE_SCHEMA, + fkKcu.TABLE_NAME, + fkKcu.COLUMN_NAME, + pkKcu.COLUMN_NAME + ) + .from(REFERENTIAL_CONSTRAINTS) + .join(fkKcu) + .on(fkKcu.CONSTRAINT_SCHEMA.equal(REFERENTIAL_CONSTRAINTS.CONSTRAINT_SCHEMA)) + .and(fkKcu.CONSTRAINT_NAME.equal(REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME)) + .join(TABLE_CONSTRAINTS) + .on(TABLE_CONSTRAINTS.CONSTRAINT_SCHEMA.eq(REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA)) + .and(TABLE_CONSTRAINTS.CONSTRAINT_NAME.eq(REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME)) + .join(pkKcu) + .on(pkKcu.CONSTRAINT_SCHEMA.eq(TABLE_CONSTRAINTS.CONSTRAINT_SCHEMA)) + .and(pkKcu.CONSTRAINT_NAME.eq(TABLE_CONSTRAINTS.CONSTRAINT_NAME)) + .and(pkKcu.ORDINAL_POSITION.eq(fkKcu.POSITION_IN_UNIQUE_CONSTRAINT)) + .where(fkKcu.TABLE_SCHEMA.in(getInputSchemata())) + .orderBy( + fkKcu.TABLE_SCHEMA.asc(), + fkKcu.TABLE_NAME.asc(), + fkKcu.CONSTRAINT_NAME.asc(), + fkKcu.ORDINAL_POSITION.asc()) + ) { + SchemaDefinition foreignKeySchema = getSchema(record.get(fkKcu.TABLE_SCHEMA)); + SchemaDefinition uniqueKeySchema = getSchema(record.get(REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA)); + + String foreignKey = record.get(fkKcu.CONSTRAINT_NAME); + String foreignKeyTableName = record.get(fkKcu.TABLE_NAME); + String foreignKeyColumn = record.get(fkKcu.COLUMN_NAME); + String uniqueKey = record.get(REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME); + String uniqueKeyTableName = record.get(TABLE_CONSTRAINTS.TABLE_NAME); + String uniqueKeyColumn = record.get(pkKcu.COLUMN_NAME); + + TableDefinition foreignKeyTable = getTable(foreignKeySchema, foreignKeyTableName); + TableDefinition uniqueKeyTable = getTable(uniqueKeySchema, uniqueKeyTableName); + + if (foreignKeyTable != null && uniqueKeyTable != null) + relations.addForeignKey( + foreignKey, + foreignKeyTable, + foreignKeyTable.getColumn(foreignKeyColumn), + uniqueKey, + uniqueKeyTable, + uniqueKeyTable.getColumn(uniqueKeyColumn), + true + ); + } + } + + private void loadForeignKeys1_4(DefaultRelations relations) { for (Record record : create().select( CROSS_REFERENCES.FK_NAME, CROSS_REFERENCES.FKTABLE_NAME, @@ -345,10 +494,45 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase @Override protected void loadCheckConstraints(DefaultRelations relations) throws SQLException { + if (is2_0_202()) + loadCheckConstraints2_0(relations); + else + loadCheckConstraints1_4(relations); + } + + private void loadCheckConstraints2_0(DefaultRelations relations) { + CheckConstraints cc = CHECK_CONSTRAINTS.as("cc"); + + for (Record record : create() + .select( + cc.tableConstraints().TABLE_SCHEMA, + cc.tableConstraints().TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE + ) + .from(cc) + .where(cc.tableConstraints().TABLE_SCHEMA.in(getInputSchemata())) + ) { + + SchemaDefinition schema = getSchema(record.get(cc.tableConstraints().TABLE_SCHEMA)); + TableDefinition table = getTable(schema, record.get(cc.tableConstraints().TABLE_NAME)); + + if (table != null) { + relations.addCheckConstraint(table, new DefaultCheckConstraintDefinition( + schema, + table, + record.get(cc.CONSTRAINT_NAME), + record.get(cc.CHECK_CLAUSE) + )); + } + } + } + + private void loadCheckConstraints1_4(DefaultRelations relations) { // TODO [https://github.com/h2database/h2database/issues/2286] // Starting from H2 1.4.201, we should no longer produce the below UNION - Select> inlineChecks = is1_4_201() + Select> inlineChecks = is2_0_202() ? select(inline(""), inline(""), inline(""), inline("")).where(falseCondition()) : select( COLUMNS.TABLE_SCHEMA, @@ -406,6 +590,18 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase @Override public ResultQuery> sequences(List schemas) { + Field minValue = is2_0_202() + ? field(SEQUENCES.getQualifiedName().append("MINIMUM_VALUE"), SEQUENCES.MIN_VALUE.getDataType()) + : SEQUENCES.MIN_VALUE; + + Field maxValue = is2_0_202() + ? field(SEQUENCES.getQualifiedName().append("MAXIMUM_VALUE"), SEQUENCES.MAX_VALUE.getDataType()) + : SEQUENCES.MAX_VALUE; + + Field isCycle = is2_0_202() + ? field(field(SEQUENCES.getQualifiedName().append("CYCLE_OPTION")).eq(inline("YES"))) + : SEQUENCES.IS_CYCLE; + return create() .select( inline(null, VARCHAR).as("catalog"), @@ -416,9 +612,9 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase inline(null, INTEGER).as("scale"), inline(null, BIGINT).as("start_value"), nullif(SEQUENCES.INCREMENT, inline(1L)).as(SEQUENCES.INCREMENT), - nullif(SEQUENCES.MIN_VALUE, inline(1L)).coerce(NUMERIC).as(SEQUENCES.MIN_VALUE), - nullif(SEQUENCES.MAX_VALUE, inline(DEFAULT_SEQUENCE_MAXVALUE)).coerce(NUMERIC).as(SEQUENCES.MAX_VALUE), - SEQUENCES.IS_CYCLE, + nullif(minValue, inline(1L)).coerce(NUMERIC).as(SEQUENCES.MIN_VALUE), + nullif(maxValue, inline(DEFAULT_SEQUENCE_MAXVALUE)).coerce(NUMERIC).as(SEQUENCES.MAX_VALUE), + isCycle.as(SEQUENCES.IS_CYCLE), nullif(SEQUENCES.CACHE, inline(DEFAULT_SEQUENCE_CACHE)).as(SEQUENCES.CACHE) ) .from(SEQUENCES) @@ -487,9 +683,12 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase .fetch(mapping(TableRecord::new))) { SchemaDefinition schema = getSchema(r.schema); + String source = r.source; + if (source != null && !source.toLowerCase().startsWith("create")) + source = "create view \"" + r.table + "\" as " + source; if (schema != null) - result.add(new H2TableDefinition(schema, r.table, r.comment, r.type, r.source)); + result.add(new H2TableDefinition(schema, r.table, r.comment, r.type, source)); } return result; @@ -497,6 +696,56 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase @Override protected List getRoutines0() throws SQLException { + if (is2_0_202()) + return getRoutines2_0(); + else + return getRoutines1_4(); + } + + private List getRoutines2_0() { + List result = new ArrayList<>(); + + for (Record record : create() + .select( + ROUTINES.ROUTINE_SCHEMA, + ROUTINES.ROUTINE_NAME, + ROUTINES.SPECIFIC_NAME, + coalesce( + concat(ELEMENT_TYPES.DATA_TYPE, inline(" ARRAY")), + ROUTINES.DATA_TYPE, + when(ROUTINES.ROUTINE_TYPE.eq(inline("FUNCTION")), inline("RESULT_SET")) + ).as(ROUTINES.DATA_TYPE), + ROUTINES.NUMERIC_PRECISION, + ROUTINES.NUMERIC_SCALE) + .from(ROUTINES) + .leftOuterJoin(ELEMENT_TYPES) + .on(ROUTINES.ROUTINE_SCHEMA.equal(ELEMENT_TYPES.OBJECT_SCHEMA)) + .and(ROUTINES.ROUTINE_NAME.equal(ELEMENT_TYPES.OBJECT_NAME)) + .and(ROUTINES.DTD_IDENTIFIER.equal(ELEMENT_TYPES.COLLECTION_TYPE_IDENTIFIER)) + .where(ROUTINES.ROUTINE_SCHEMA.in(getInputSchemata())) + .and(tableValuedFunctions() + ? ROUTINES.DATA_TYPE.isNull().or(ROUTINES.DATA_TYPE.notLike(inline("ROW(%"))) + : noCondition()) + .orderBy( + ROUTINES.ROUTINE_SCHEMA, + ROUTINES.ROUTINE_NAME) + ) { + result.add(new H2RoutineDefinition( + getSchema(record.get(ROUTINES.ROUTINE_SCHEMA)), + record.get(ROUTINES.ROUTINE_NAME), + record.get(ROUTINES.SPECIFIC_NAME), + record.get(ROUTINES.DATA_TYPE), + record.get(ROUTINES.NUMERIC_PRECISION), + record.get(ROUTINES.NUMERIC_SCALE), + null, + null + )); + } + + return result; + } + + private List getRoutines1_4() { List result = new ArrayList<>(); Field overloaded = field(select(field(DSL.exists( @@ -541,7 +790,7 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase ? record.get(FUNCTION_ALIASES.COLUMN_COUNT, String.class) : null; - result.add(new H2RoutineDefinition(schema, name, comment, typeName, precision, scale, overload)); + result.add(new H2RoutineDefinition(schema, name, null, typeName, precision, scale, comment, overload)); } } @@ -558,18 +807,69 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase protected List getEnums0() throws SQLException { List result = new ArrayList<>(); - if (!is1_4_197()) + if (!is1_4_197() && !is2_0_202()) return result; - getInlineEnums(result); - getDomainEnums(result); + if (is2_0_202()) { + getInlineEnums2_0(result); + getDomainEnums2_0(result); + } + else { + getInlineEnums1_4(result); + getDomainEnums1_4(result); + } return result; } + private void getInlineEnums2_0(List result) { + // TODO: Re-generate the H2 schema and use generated code to run this query + + create().resultQuery(("" + + "select c.TABLE_SCHEMA , c.TABLE_NAME , c.COLUMN_NAME , array_agg(ev.value_name order by ev.VALUE_ORDINAL)\n" + + "from INFORMATION_SCHEMA.ENUM_VALUES ev\n" + + "join information_schema.columns c\n" + + "on ev.OBJECT_SCHEMA = c.TABLE_SCHEMA\n" + + "and ev.OBJECT_NAME = c.TABLE_NAME\n" + + "and ev.ENUM_IDENTIFIER = c.DTD_IDENTIFIER\n" + + "where ev.OBJECT_TYPE = 'TABLE'\n" + + "and c.DOMAIN_NAME IS NULL\n" + + "group by c.TABLE_SCHEMA , c.TABLE_NAME , c.COLUMN_NAME\n" + + "order by 1, 2, 3\n" + + "")) + .coerce(COLUMNS.TABLE_SCHEMA, COLUMNS.TABLE_NAME, COLUMNS.COLUMN_NAME, arrayAgg(COLUMNS.COLUMN_NAME)) + .forEach(r -> { + SchemaDefinition schema = getSchema(r.value1()); + if (schema == null) + return; + + // [#1237] Don't generate enum classes for columns in MySQL tables + // that are excluded from code generation + TableDefinition tableDefinition = getTable(schema, r.value2()); + if (tableDefinition != null) { + ColumnDefinition columnDefinition = tableDefinition.getColumn(r.value3()); + + if (columnDefinition != null) { + + // [#1137] Avoid generating enum classes for enum types that + // are explicitly forced to another type + if (getConfiguredForcedType(columnDefinition, columnDefinition.getType()) == null) { + String name = r.value2() + "_" + r.value3(); + DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, name, ""); + + for (String string : r.value4()) + definition.addLiteral(string); + + result.add(definition); + } + } + } + }); + } + static final /* record */ class EnumRecord { private final String schema; private final String table; private final String column; private final String type; public EnumRecord(String schema, String table, String column, String type) { this.schema = schema; this.table = table; this.column = column; this.type = type; } public String schema() { return schema; } public String table() { return table; } public String column() { return column; } public String type() { return type; } @Override public boolean equals(Object o) { if (!(o instanceof EnumRecord)) return false; EnumRecord other = (EnumRecord) o; if (!java.util.Objects.equals(this.schema, other.schema)) return false; if (!java.util.Objects.equals(this.table, other.table)) return false; if (!java.util.Objects.equals(this.column, other.column)) return false; if (!java.util.Objects.equals(this.type, other.type)) return false; return true; } @Override public int hashCode() { return java.util.Objects.hash(this.schema, this.table, this.column, this.type); } @Override public String toString() { return new StringBuilder("EnumRecord[").append("schema=").append(this.schema).append(", table=").append(this.table).append(", column=").append(this.column).append(", type=").append(this.type).append("]").toString(); } } - private void getInlineEnums(List result) { + private void getInlineEnums1_4(List result) { enumLoop: for (EnumRecord r : create() @@ -592,11 +892,10 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase if (schema == null) continue enumLoop; - String name = r.table + "_" + r.column; - // [#1237] Don't generate enum classes for columns in MySQL tables // that are excluded from code generation TableDefinition tableDefinition = getTable(schema, r.table); + if (tableDefinition != null) { ColumnDefinition columnDefinition = tableDefinition.getColumn(r.column); @@ -605,6 +904,7 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase // [#1137] Avoid generating enum classes for enum types that // are explicitly forced to another type if (getConfiguredForcedType(columnDefinition, columnDefinition.getType()) == null) { + String name = r.table + "_" + r.column; DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, name, ""); CSVReader reader = new CSVReader( @@ -624,9 +924,34 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase } } + private void getDomainEnums2_0(List result) { + // TODO: Re-generate the H2 schema and use generated code to run this query + + create().resultQuery(("" + + "select object_schema, object_name, array_agg(ev.value_name order by ev.VALUE_ORDINAL)\n" + + "from INFORMATION_SCHEMA.ENUM_VALUES ev\n" + + "where ev.OBJECT_TYPE = 'DOMAIN'\n" + + "group by object_schema, object_name\n" + + "order by 1, 2\n" + + "")) + .coerce(COLUMNS.TABLE_SCHEMA, COLUMNS.TABLE_NAME, arrayAgg(COLUMNS.COLUMN_NAME)) + .forEach(r -> { + + SchemaDefinition schema = getSchema(r.value1()); + if (schema == null) + return; + + DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, r.value2(), ""); + for (String string : r.value3()) + definition.addLiteral(string); + + result.add(definition); + }); + } + static final /* record */ class DomainRecord { private final String schema; private final String name; private final String sql; public DomainRecord(String schema, String name, String sql) { this.schema = schema; this.name = name; this.sql = sql; } public String schema() { return schema; } public String name() { return name; } public String sql() { return sql; } @Override public boolean equals(Object o) { if (!(o instanceof DomainRecord)) return false; DomainRecord other = (DomainRecord) o; if (!java.util.Objects.equals(this.schema, other.schema)) return false; if (!java.util.Objects.equals(this.name, other.name)) return false; if (!java.util.Objects.equals(this.sql, other.sql)) return false; return true; } @Override public int hashCode() { return java.util.Objects.hash(this.schema, this.name, this.sql); } @Override public String toString() { return new StringBuilder("DomainRecord[").append("schema=").append(this.schema).append(", name=").append(this.name).append(", sql=").append(this.sql).append("]").toString(); } } - private void getDomainEnums(List result) { + private void getDomainEnums1_4(List result) { enumLoop: for (DomainRecord r : create() @@ -664,25 +989,85 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase @Override protected List getDomains0() throws SQLException { + if (is2_0_202()) + return getDomains2_0(); + else + return getDomains1_4(); + } + + private List getDomains2_0() { List result = new ArrayList<>(); + Domains d = Tables.DOMAINS.as("d"); + DomainConstraints dc = DOMAIN_CONSTRAINTS.as("dc"); + for (Record record : create() .select( - DOMAINS.DOMAIN_SCHEMA, - DOMAINS.DOMAIN_NAME, - DOMAINS.TYPE_NAME, - DOMAINS.PRECISION, - DOMAINS.SCALE, - DOMAINS.IS_NULLABLE, - DOMAINS.COLUMN_DEFAULT, - DOMAINS.CHECK_CONSTRAINT) - .from(DOMAINS) - .where(DOMAINS.DOMAIN_SCHEMA.in(getInputSchemata())) - - // [#7917] Starting from 1.4.198, ENUM types are stored as domains - .and(DOMAINS.TYPE_NAME.ne(inline("ENUM"))) - .orderBy(DOMAINS.DOMAIN_SCHEMA, DOMAINS.DOMAIN_NAME) + d.DOMAIN_SCHEMA, + d.DOMAIN_NAME, + d.DATA_TYPE, + d.CHARACTER_MAXIMUM_LENGTH, + coalesce(d.DATETIME_PRECISION, d.NUMERIC_PRECISION).as(d.NUMERIC_PRECISION), + d.NUMERIC_SCALE, + d.DOMAIN_DEFAULT, + dc.checkConstraints().CHECK_CLAUSE) + .from(d) + .leftJoin(dc) + .on(d.DOMAIN_CATALOG.eq(dc.DOMAIN_CATALOG)) + .and(d.DOMAIN_SCHEMA.eq(dc.DOMAIN_SCHEMA)) + .and(d.DOMAIN_NAME.eq(dc.DOMAIN_NAME)) + .where(d.DOMAIN_SCHEMA.in(getInputSchemata())) + .and(d.DATA_TYPE.ne(inline("ENUM"))) + .orderBy(d.DOMAIN_SCHEMA, d.DOMAIN_NAME) ) { + SchemaDefinition schema = getSchema(record.get(d.DOMAIN_SCHEMA)); + + DataTypeDefinition baseType = new DefaultDataTypeDefinition( + this, + schema, + record.get(d.DATA_TYPE), + record.get(d.CHARACTER_MAXIMUM_LENGTH), + record.get(d.NUMERIC_PRECISION), + record.get(d.NUMERIC_SCALE), + true, + record.get(d.DOMAIN_DEFAULT) + ); + + DefaultDomainDefinition domain = new DefaultDomainDefinition( + schema, + record.get(d.DOMAIN_NAME), + baseType + ); + + if (!StringUtils.isBlank(record.get(dc.checkConstraints().CHECK_CLAUSE))) + domain.addCheckClause(record.get(dc.checkConstraints().CHECK_CLAUSE)); + + result.add(domain); + } + + return result; + } + + private List getDomains1_4() { + List result = new ArrayList<>(); + + for (Record record : create() + .select( + DOMAINS.DOMAIN_SCHEMA, + DOMAINS.DOMAIN_NAME, + DOMAINS.TYPE_NAME, + DOMAINS.PRECISION, + DOMAINS.SCALE, + DOMAINS.IS_NULLABLE, + DOMAINS.COLUMN_DEFAULT, + DOMAINS.CHECK_CONSTRAINT) + .from(DOMAINS) + .where(DOMAINS.DOMAIN_SCHEMA.in(getInputSchemata())) + + // [#7917] Starting from 1.4.198, ENUM types are stored as domains + .and(DOMAINS.TYPE_NAME.ne(inline("ENUM"))) + .orderBy(DOMAINS.DOMAIN_SCHEMA, DOMAINS.DOMAIN_NAME)) { + // [#7644] [#11721] H2 puts DATETIME_PRECISION in NUMERIC_SCALE column boolean isTimestamp = record.get(DOMAINS.TYPE_NAME).trim().toLowerCase().startsWith("timestamp"); @@ -732,13 +1117,13 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase private Boolean is1_4_197; private Boolean is1_4_198; - private Boolean is1_4_201; + private Boolean is2_0_202; boolean is1_4_197() { - // [#5874] The COLUMNS.COLUMN_TYPE column was introduced in H2 1.4.197 + // [#5874] The COLUMNS.COLUMN_TYPE column was introduced in H2 1.4.197 but removed again in H2 2.0.202 if (is1_4_197 == null) - is1_4_197 = exists(COLUMNS.COLUMN_TYPE); + is1_4_197 = configuredDialectIsNotFamilyAndSupports(asList(H2), () -> exists(COLUMNS.COLUMN_TYPE)); return is1_4_197; } @@ -747,18 +1132,17 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase // [#5874] The COLUMNS.IS_VISIBLE column was introduced in H2 1.4.198 if (is1_4_198 == null) - is1_4_198 = exists(COLUMNS.IS_VISIBLE); + is1_4_198 = configuredDialectIsNotFamilyAndSupports(asList(H2), () -> exists(COLUMNS.IS_VISIBLE)); return is1_4_198; } - boolean is1_4_201() { + boolean is2_0_202() { - // [https://github.com/h2database/h2database/issues/2286] - // The COLUMNS.CHECK_CONSTRAINT column was removed backwards incompatibly in H2 1.4.201 - if (is1_4_201 == null) - is1_4_201 = !exists(COLUMNS.CHECK_CONSTRAINT); + // [#9609] The view was removed in H2 2.0: https://github.com/h2database/h2database/issues/2286 + if (is2_0_202 == null) + is2_0_202 = configuredDialectIsNotFamilyAndSupports(asList(H2), () -> !exists(CONSTRAINTS)); - return is1_4_201; + return is2_0_202; } } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2RoutineDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2RoutineDefinition.java index 9c8b3c8a7f..f22c7ce569 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2RoutineDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2RoutineDefinition.java @@ -38,12 +38,21 @@ package org.jooq.meta.h2; +import static org.jooq.impl.DSL.concat; +import static org.jooq.impl.DSL.condition; +import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.noCondition; +import static org.jooq.impl.DSL.nvl; +import static org.jooq.impl.DSL.val; import static org.jooq.meta.h2.information_schema.Tables.FUNCTION_COLUMNS; +import static org.jooq.meta.hsqldb.information_schema.Tables.ELEMENT_TYPES; +import static org.jooq.meta.hsqldb.information_schema.Tables.PARAMETERS; +import static org.jooq.meta.hsqldb.information_schema.Tables.ROUTINES; import java.sql.SQLException; import org.jooq.Record; +import org.jooq.Result; import org.jooq.meta.AbstractRoutineDefinition; import org.jooq.meta.DataTypeDefinition; import org.jooq.meta.DefaultDataTypeDefinition; @@ -62,18 +71,16 @@ import org.jooq.util.h2.H2DataType; */ public class H2RoutineDefinition extends AbstractRoutineDefinition { - public H2RoutineDefinition(SchemaDefinition schema, String name, String comment, String typeName, Number precision, Number scale) { - this(schema, name, comment, typeName, precision, scale, null); - } + private final String specificName; // internal name for the function used by H2 - public H2RoutineDefinition(SchemaDefinition schema, String name, String comment, String typeName, Number precision, Number scale, String overload) { + public H2RoutineDefinition(SchemaDefinition schema, String name, String specificName, String dataType, Number precision, Number scale, String comment, String overload) { super(schema, null, name, comment, overload); - if (!StringUtils.isBlank(typeName)) { + if (!StringUtils.isBlank(dataType)) { DataTypeDefinition type = new DefaultDataTypeDefinition( getDatabase(), schema, - typeName, + dataType, precision, precision, scale, @@ -83,10 +90,65 @@ public class H2RoutineDefinition extends AbstractRoutineDefinition { this.returnValue = new DefaultParameterDefinition(this, "RETURN_VALUE", -1, type); } + + this.specificName = specificName; } @Override protected void init0() throws SQLException { + if (((H2Database) getDatabase()).is2_0_202()) + init2_0(); + else + init1_4(); + } + + private void init2_0() { + Result result = create().select( + PARAMETERS.PARAMETER_MODE, + PARAMETERS.PARAMETER_NAME, + nvl(concat(ELEMENT_TYPES.DATA_TYPE, inline(" ARRAY")), PARAMETERS.DATA_TYPE).as(PARAMETERS.DATA_TYPE), + nvl(ELEMENT_TYPES.CHARACTER_MAXIMUM_LENGTH, PARAMETERS.CHARACTER_MAXIMUM_LENGTH).as(PARAMETERS.CHARACTER_MAXIMUM_LENGTH), + nvl(ELEMENT_TYPES.NUMERIC_PRECISION, PARAMETERS.NUMERIC_PRECISION).as(PARAMETERS.NUMERIC_PRECISION), + nvl(ELEMENT_TYPES.NUMERIC_SCALE, PARAMETERS.NUMERIC_SCALE).as(PARAMETERS.NUMERIC_SCALE), + PARAMETERS.ORDINAL_POSITION) + .from(PARAMETERS) + .join(ROUTINES) + .on(PARAMETERS.SPECIFIC_SCHEMA.eq(ROUTINES.SPECIFIC_SCHEMA)) + .and(PARAMETERS.SPECIFIC_NAME.eq(ROUTINES.SPECIFIC_NAME)) + .leftJoin(ELEMENT_TYPES) + .on(PARAMETERS.SPECIFIC_SCHEMA.eq(ELEMENT_TYPES.OBJECT_SCHEMA)) + .and(PARAMETERS.SPECIFIC_NAME.eq(ELEMENT_TYPES.OBJECT_NAME)) + .and(PARAMETERS.DTD_IDENTIFIER.eq(ELEMENT_TYPES.COLLECTION_TYPE_IDENTIFIER)) + .where(PARAMETERS.SPECIFIC_SCHEMA.eq(getSchema().getName())) + .and(PARAMETERS.SPECIFIC_NAME.eq(specificName)) + .orderBy(PARAMETERS.ORDINAL_POSITION.asc()).fetch(); + + for (Record record : result) { + String inOut = record.get(PARAMETERS.PARAMETER_MODE); + + DataTypeDefinition type = new DefaultDataTypeDefinition( + getDatabase(), + getSchema(), + record.get(PARAMETERS.DATA_TYPE), + record.get(PARAMETERS.CHARACTER_MAXIMUM_LENGTH), + record.get(PARAMETERS.NUMERIC_PRECISION), + record.get(PARAMETERS.NUMERIC_SCALE), + null, + (String) null + ); + + ParameterDefinition parameter = new DefaultParameterDefinition( + this, + record.get(PARAMETERS.PARAMETER_NAME).replaceAll("@", ""), + record.get(PARAMETERS.ORDINAL_POSITION, int.class), + type + ); + + addParameter(InOutDefinition.getFromString(inOut), parameter); + } + } + + private void init1_4() { for (Record record : create() .select( FUNCTION_COLUMNS.COLUMN_NAME, diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java index 2140e7b955..7079977ca8 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2TableDefinition.java @@ -39,28 +39,39 @@ package org.jooq.meta.h2; import static org.jooq.impl.DSL.any; import static org.jooq.impl.DSL.choose; +import static org.jooq.impl.DSL.coalesce; +import static org.jooq.impl.DSL.concat; +import static org.jooq.impl.DSL.condition; +import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.noCondition; +import static org.jooq.impl.DSL.nvl; import static org.jooq.impl.DSL.when; -import static org.jooq.impl.DSL.zero; +import static org.jooq.impl.SQLDataType.BOOLEAN; +import static org.jooq.impl.SQLDataType.INTEGER; import static org.jooq.meta.h2.information_schema.Tables.COLUMNS; +import static org.jooq.meta.hsqldb.information_schema.Tables.ELEMENT_TYPES; import static org.jooq.tools.StringUtils.defaultString; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import org.jooq.Field; import org.jooq.Name; import org.jooq.Param; import org.jooq.Record; +import org.jooq.Table; import org.jooq.TableOptions.TableType; import org.jooq.meta.AbstractTableDefinition; import org.jooq.meta.ColumnDefinition; import org.jooq.meta.DataTypeDefinition; +import org.jooq.meta.Database; import org.jooq.meta.DefaultColumnDefinition; import org.jooq.meta.DefaultDataTypeDefinition; import org.jooq.meta.SchemaDefinition; +import org.jooq.meta.hsqldb.information_schema.Tables; /** * H2 table definition @@ -78,64 +89,163 @@ public class H2TableDefinition extends AbstractTableDefinition { super(schema, name, comment, tableType, source); } + final H2Database getH2Database() { + return (H2Database) super.getDatabase(); + } + @Override public List getElements0() throws SQLException { + if (getH2Database().is2_0_202()) + return getElements2_0(); + else + return getElements1_4(); + } + + public List getElements2_0() { List result = new ArrayList<>(); - // [#7206] H2 defaults to these precision/scale values when a DECIMAL/NUMERIC type - // does not have any precision/scale. What works in H2 works in almost no - // other database, which is relevant when using the DDLDatabase for instance, - // which is based on the H2Database - Param maxP = inline(65535); - Param maxS = inline(32767); + H2Database db = (H2Database) getDatabase(); for (Record record : create().select( COLUMNS.COLUMN_NAME, COLUMNS.ORDINAL_POSITION, // [#2230] [#11733] Translate INTERVAL_TYPE to supported types - (((H2Database) getDatabase()).is1_4_198() - ? (when(COLUMNS.INTERVAL_TYPE.like(any(inline("%YEAR%"), inline("%MONTH%"))), inline("INTERVAL YEAR TO MONTH")) + nvl(concat(ELEMENT_TYPES.DATA_TYPE, inline(" ARRAY")), + when(COLUMNS.INTERVAL_TYPE.like(any(inline("%YEAR%"), inline("%MONTH%"))), inline("INTERVAL YEAR TO MONTH")) .when(COLUMNS.INTERVAL_TYPE.like(any(inline("%DAY%"), inline("%HOUR%"), inline("%MINUTE%"), inline("%SECOND%"))), inline("INTERVAL DAY TO SECOND")) - .else_(COLUMNS.TYPE_NAME)) - : COLUMNS.TYPE_NAME + .else_(Tables.COLUMNS.DATA_TYPE) ).as(COLUMNS.TYPE_NAME), - (((H2Database) getDatabase()).is1_4_197() - ? COLUMNS.COLUMN_TYPE - : COLUMNS.TYPE_NAME - ).as(COLUMNS.COLUMN_TYPE), - choose().when(COLUMNS.NUMERIC_PRECISION.eq(maxP).and(COLUMNS.NUMERIC_SCALE.eq(maxS)), zero()) - .otherwise(COLUMNS.CHARACTER_MAXIMUM_LENGTH).as(COLUMNS.CHARACTER_MAXIMUM_LENGTH), - COLUMNS.NUMERIC_PRECISION.decode(maxP, zero(), COLUMNS.NUMERIC_PRECISION).as(COLUMNS.NUMERIC_PRECISION), - COLUMNS.NUMERIC_SCALE.decode(maxS, zero(), COLUMNS.NUMERIC_SCALE).as(COLUMNS.NUMERIC_SCALE), + nvl(ELEMENT_TYPES.CHARACTER_MAXIMUM_LENGTH, COLUMNS.CHARACTER_MAXIMUM_LENGTH).as(COLUMNS.CHARACTER_MAXIMUM_LENGTH), + coalesce( + ELEMENT_TYPES.DATETIME_PRECISION, + ELEMENT_TYPES.NUMERIC_PRECISION, + COLUMNS.DATETIME_PRECISION, + COLUMNS.NUMERIC_PRECISION).as(COLUMNS.NUMERIC_PRECISION), + nvl(ELEMENT_TYPES.NUMERIC_SCALE, COLUMNS.NUMERIC_SCALE).as(COLUMNS.NUMERIC_SCALE), COLUMNS.IS_NULLABLE, - COLUMNS.IS_COMPUTED, + field(Tables.COLUMNS.IS_GENERATED.eq(inline("ALWAYS"))).as(COLUMNS.IS_COMPUTED), + Tables.COLUMNS.GENERATION_EXPRESSION, COLUMNS.COLUMN_DEFAULT, COLUMNS.REMARKS, - COLUMNS.SEQUENCE_NAME, - ((H2Database) getDatabase()).is1_4_198() ? COLUMNS.DOMAIN_SCHEMA : inline("").as(COLUMNS.DOMAIN_SCHEMA), - ((H2Database) getDatabase()).is1_4_198() ? COLUMNS.DOMAIN_NAME : inline("").as(COLUMNS.DOMAIN_NAME) + field(Tables.COLUMNS.IS_IDENTITY.eq(inline("YES"))).as(Tables.COLUMNS.IS_IDENTITY), + COLUMNS.DOMAIN_SCHEMA, + COLUMNS.DOMAIN_NAME ) .from(COLUMNS) + .leftJoin(ELEMENT_TYPES) + .on(Tables.COLUMNS.TABLE_SCHEMA.equal(ELEMENT_TYPES.OBJECT_SCHEMA)) + .and(Tables.COLUMNS.TABLE_NAME.equal(ELEMENT_TYPES.OBJECT_NAME)) + .and(Tables.COLUMNS.DTD_IDENTIFIER.equal(ELEMENT_TYPES.COLLECTION_TYPE_IDENTIFIER)) .where(COLUMNS.TABLE_SCHEMA.equal(getSchema().getName())) .and(COLUMNS.TABLE_NAME.equal(getName())) .and(!getDatabase().getIncludeInvisibleColumns() - ? ((H2Database) getDatabase()).is1_4_198() - ? COLUMNS.IS_VISIBLE.eq(inline("TRUE")) - : COLUMNS.COLUMN_TYPE.notLike(inline("%INVISIBLE%")) + ? condition(COLUMNS.IS_VISIBLE.coerce(BOOLEAN)) : noCondition()) - .orderBy(COLUMNS.ORDINAL_POSITION)) { + .orderBy(COLUMNS.ORDINAL_POSITION) + ) { // [#5331] AUTO_INCREMENT (MySQL style) // [#5331] DEFAULT nextval('sequence') (PostgreSQL style) // [#6332] [#6339] system-generated defaults shouldn't produce a default clause boolean isIdentity = - null != record.get(COLUMNS.SEQUENCE_NAME) + record.get(Tables.COLUMNS.IS_IDENTITY, boolean.class) || defaultString(record.get(COLUMNS.COLUMN_DEFAULT)).trim().toLowerCase().startsWith("nextval"); boolean isComputed = record.get(COLUMNS.IS_COMPUTED, boolean.class); - // [#7644] H2 puts DATETIME_PRECISION in NUMERIC_SCALE column + // [#681] Domain name if available + Name userType = record.get(COLUMNS.DOMAIN_NAME) != null + ? name(record.get(COLUMNS.DOMAIN_SCHEMA), record.get(COLUMNS.DOMAIN_NAME)) + : name(getSchema().getName(), getName() + "_" + record.get(COLUMNS.COLUMN_NAME)); + + DataTypeDefinition type = new DefaultDataTypeDefinition( + getDatabase(), + getSchema(), + record.get(COLUMNS.TYPE_NAME), + record.get(COLUMNS.CHARACTER_MAXIMUM_LENGTH), + record.get(COLUMNS.NUMERIC_PRECISION), + record.get(COLUMNS.NUMERIC_SCALE), + record.get(COLUMNS.IS_NULLABLE, boolean.class), + isIdentity || isComputed ? null : record.get(COLUMNS.COLUMN_DEFAULT), + userType + ).generatedAlwaysAs(isComputed ? record.get(Tables.COLUMNS.GENERATION_EXPRESSION) : null); + + result.add(new DefaultColumnDefinition( + getDatabase().getTable(getSchema(), getName()), + record.get(COLUMNS.COLUMN_NAME), + result.size() + 1, + type, + isIdentity, + record.get(COLUMNS.REMARKS)) + ); + } + + return result; + } + + public List getElements1_4() { + List result = new ArrayList<>(); + + // [#7206] H2 defaults to these precision/scale values when a DECIMAL/NUMERIC type + // does not have any precision/scale. What works in H2 works in almost no + // other database, which is relevant when using the DDLDatabase for instance, + // which is based on the H2Database + Param maxP = inline(65535L); + Param maxS = inline(32767L); + + H2Database db = (H2Database) getDatabase(); + Field columnsDataType = + db.is1_4_197() + ? COLUMNS.COLUMN_TYPE + : COLUMNS.TYPE_NAME; + + for (Record record : create().select( + COLUMNS.COLUMN_NAME, + COLUMNS.ORDINAL_POSITION, + + // [#2230] [#11733] Translate INTERVAL_TYPE to supported types + (db.is1_4_198() + ? (when(COLUMNS.INTERVAL_TYPE.like(any(inline("%YEAR%"), inline("%MONTH%"))), inline("INTERVAL YEAR TO MONTH")) + .when(COLUMNS.INTERVAL_TYPE.like(any(inline("%DAY%"), inline("%HOUR%"), inline("%MINUTE%"), inline("%SECOND%"))), inline("INTERVAL DAY TO SECOND")) + .else_(columnsDataType)) + : columnsDataType + ).as(COLUMNS.TYPE_NAME), + columnsDataType.as(COLUMNS.COLUMN_TYPE), + choose().when(COLUMNS.NUMERIC_PRECISION.eq(maxP).and(COLUMNS.NUMERIC_SCALE.eq(maxS)), inline(0L)) + .otherwise(COLUMNS.CHARACTER_MAXIMUM_LENGTH).as(COLUMNS.CHARACTER_MAXIMUM_LENGTH), + COLUMNS.NUMERIC_PRECISION.decode(maxP, inline(0L), COLUMNS.NUMERIC_PRECISION).as(COLUMNS.NUMERIC_PRECISION), + COLUMNS.NUMERIC_SCALE.decode(maxS, inline(0L), COLUMNS.NUMERIC_SCALE).as(COLUMNS.NUMERIC_SCALE), + COLUMNS.IS_NULLABLE, + COLUMNS.IS_COMPUTED.as(COLUMNS.IS_COMPUTED), + COLUMNS.COLUMN_DEFAULT.as("GENERATION_EXPRESSION"), + COLUMNS.COLUMN_DEFAULT, + COLUMNS.REMARKS, + field(COLUMNS.SEQUENCE_NAME.isNotNull()).as("IS_IDENTITY"), + db.is1_4_198() ? COLUMNS.DOMAIN_SCHEMA : inline("").as(COLUMNS.DOMAIN_SCHEMA), + db.is1_4_198() ? COLUMNS.DOMAIN_NAME : inline("").as(COLUMNS.DOMAIN_NAME) + ) + .from(COLUMNS) + .where(COLUMNS.TABLE_SCHEMA.equal(getSchema().getName())) + .and(COLUMNS.TABLE_NAME.equal(getName())) + .and(!getDatabase().getIncludeInvisibleColumns() + ? db.is1_4_198() + ? COLUMNS.IS_VISIBLE.eq(inline("TRUE")) + : COLUMNS.COLUMN_TYPE.notLike(inline("%INVISIBLE%")) + : noCondition()) + .orderBy(COLUMNS.ORDINAL_POSITION) + ) { + + // [#5331] AUTO_INCREMENT (MySQL style) + // [#5331] DEFAULT nextval('sequence') (PostgreSQL style) + // [#6332] [#6339] system-generated defaults shouldn't produce a default clause + boolean isIdentity = + record.get("IS_IDENTITY", boolean.class) + || defaultString(record.get(COLUMNS.COLUMN_DEFAULT)).trim().toLowerCase().startsWith("nextval"); + + boolean isComputed = record.get(COLUMNS.IS_COMPUTED, boolean.class); + + // [#7644] H2 1.4.200 puts DATETIME_PRECISION in NUMERIC_SCALE column boolean isTimestamp = record.get(COLUMNS.TYPE_NAME).trim().toLowerCase().startsWith("timestamp"); // [#681] Domain name if available @@ -157,10 +267,10 @@ public class H2TableDefinition extends AbstractTableDefinition { record.get(COLUMNS.IS_NULLABLE, boolean.class), isIdentity || isComputed ? null : record.get(COLUMNS.COLUMN_DEFAULT), userType - ).generatedAlwaysAs(isComputed ? record.get(COLUMNS.COLUMN_DEFAULT) : null); + ).generatedAlwaysAs(isComputed ? record.get("GENERATION_EXPRESSION", String.class) : null); result.add(new DefaultColumnDefinition( - getDatabase().getTable(getSchema(), getName()), + getDatabase().getTable(getSchema(), getName()), record.get(COLUMNS.COLUMN_NAME), result.size() + 1, type, diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Columns.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Columns.java index 525e3d9076..9c74f1b4ab 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Columns.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Columns.java @@ -42,22 +42,22 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.TABLE_CATALOG. */ - public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA. */ - public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.TABLE_NAME. */ - public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME. */ - public final TableField COLUMN_NAME = createField(DSL.name("COLUMN_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_NAME = createField(DSL.name("COLUMN_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION. @@ -67,27 +67,27 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.DOMAIN_CATALOG. */ - public final TableField DOMAIN_CATALOG = createField(DSL.name("DOMAIN_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DOMAIN_CATALOG = createField(DSL.name("DOMAIN_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.DOMAIN_SCHEMA. */ - public final TableField DOMAIN_SCHEMA = createField(DSL.name("DOMAIN_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DOMAIN_SCHEMA = createField(DSL.name("DOMAIN_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.DOMAIN_NAME. */ - public final TableField DOMAIN_NAME = createField(DSL.name("DOMAIN_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DOMAIN_NAME = createField(DSL.name("DOMAIN_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT. */ - public final TableField COLUMN_DEFAULT = createField(DSL.name("COLUMN_DEFAULT"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_DEFAULT = createField(DSL.name("COLUMN_DEFAULT"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE. */ - public final TableField IS_NULLABLE = createField(DSL.name("IS_NULLABLE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField IS_NULLABLE = createField(DSL.name("IS_NULLABLE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.DATA_TYPE. @@ -97,7 +97,7 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH. */ - public final TableField CHARACTER_MAXIMUM_LENGTH = createField(DSL.name("CHARACTER_MAXIMUM_LENGTH"), SQLDataType.INTEGER, this, ""); + public final TableField CHARACTER_MAXIMUM_LENGTH = createField(DSL.name("CHARACTER_MAXIMUM_LENGTH"), SQLDataType.BIGINT, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.CHARACTER_OCTET_LENGTH. @@ -107,7 +107,7 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.NUMERIC_PRECISION. */ - public final TableField NUMERIC_PRECISION = createField(DSL.name("NUMERIC_PRECISION"), SQLDataType.INTEGER, this, ""); + public final TableField NUMERIC_PRECISION = createField(DSL.name("NUMERIC_PRECISION"), SQLDataType.BIGINT, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.NUMERIC_PRECISION_RADIX. @@ -117,7 +117,7 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.NUMERIC_SCALE. */ - public final TableField NUMERIC_SCALE = createField(DSL.name("NUMERIC_SCALE"), SQLDataType.INTEGER, this, ""); + public final TableField NUMERIC_SCALE = createField(DSL.name("NUMERIC_SCALE"), SQLDataType.BIGINT, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.DATETIME_PRECISION. @@ -127,7 +127,7 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.INTERVAL_TYPE. */ - public final TableField INTERVAL_TYPE = createField(DSL.name("INTERVAL_TYPE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField INTERVAL_TYPE = createField(DSL.name("INTERVAL_TYPE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.INTERVAL_PRECISION. @@ -137,17 +137,17 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.CHARACTER_SET_NAME. */ - public final TableField CHARACTER_SET_NAME = createField(DSL.name("CHARACTER_SET_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CHARACTER_SET_NAME = createField(DSL.name("CHARACTER_SET_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.COLLATION_NAME. */ - public final TableField COLLATION_NAME = createField(DSL.name("COLLATION_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLLATION_NAME = createField(DSL.name("COLLATION_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.TYPE_NAME. */ - public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.NULLABLE. @@ -167,17 +167,17 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.CHECK_CONSTRAINT. */ - public final TableField CHECK_CONSTRAINT = createField(DSL.name("CHECK_CONSTRAINT"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CHECK_CONSTRAINT = createField(DSL.name("CHECK_CONSTRAINT"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.SEQUENCE_NAME. */ - public final TableField SEQUENCE_NAME = createField(DSL.name("SEQUENCE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SEQUENCE_NAME = createField(DSL.name("SEQUENCE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.SOURCE_DATA_TYPE. @@ -187,17 +187,17 @@ public class Columns extends TableImpl { /** * The column INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE. */ - public final TableField COLUMN_TYPE = createField(DSL.name("COLUMN_TYPE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_TYPE = createField(DSL.name("COLUMN_TYPE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.COLUMN_ON_UPDATE. */ - public final TableField COLUMN_ON_UPDATE = createField(DSL.name("COLUMN_ON_UPDATE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_ON_UPDATE = createField(DSL.name("COLUMN_ON_UPDATE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.COLUMNS.IS_VISIBLE. */ - public final TableField IS_VISIBLE = createField(DSL.name("IS_VISIBLE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField IS_VISIBLE = createField(DSL.name("IS_VISIBLE"), SQLDataType.VARCHAR, this, ""); private Columns(Name alias, Table aliased) { this(alias, aliased, null); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Constraints.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Constraints.java index 6435675b30..8e8ba78375 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Constraints.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Constraints.java @@ -47,62 +47,62 @@ public class Constraints extends TableImpl { /** * The column INFORMATION_SCHEMA.CONSTRAINTS.CONSTRAINT_CATALOG. */ - public final TableField CONSTRAINT_CATALOG = createField(DSL.name("CONSTRAINT_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CONSTRAINT_CATALOG = createField(DSL.name("CONSTRAINT_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.CONSTRAINT_SCHEMA. */ - public final TableField CONSTRAINT_SCHEMA = createField(DSL.name("CONSTRAINT_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CONSTRAINT_SCHEMA = createField(DSL.name("CONSTRAINT_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.CONSTRAINT_NAME. */ - public final TableField CONSTRAINT_NAME = createField(DSL.name("CONSTRAINT_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CONSTRAINT_NAME = createField(DSL.name("CONSTRAINT_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.CONSTRAINT_TYPE. */ - public final TableField CONSTRAINT_TYPE = createField(DSL.name("CONSTRAINT_TYPE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CONSTRAINT_TYPE = createField(DSL.name("CONSTRAINT_TYPE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.TABLE_CATALOG. */ - public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.TABLE_SCHEMA. */ - public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.TABLE_NAME. */ - public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.UNIQUE_INDEX_NAME. */ - public final TableField UNIQUE_INDEX_NAME = createField(DSL.name("UNIQUE_INDEX_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField UNIQUE_INDEX_NAME = createField(DSL.name("UNIQUE_INDEX_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.CHECK_EXPRESSION. */ - public final TableField CHECK_EXPRESSION = createField(DSL.name("CHECK_EXPRESSION"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CHECK_EXPRESSION = createField(DSL.name("CHECK_EXPRESSION"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.COLUMN_LIST. */ - public final TableField COLUMN_LIST = createField(DSL.name("COLUMN_LIST"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_LIST = createField(DSL.name("COLUMN_LIST"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.SQL. */ - public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CONSTRAINTS.ID. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/CrossReferences.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/CrossReferences.java index d9c0f47062..84085b473f 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/CrossReferences.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/CrossReferences.java @@ -46,42 +46,42 @@ public class CrossReferences extends TableImpl { /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.PKTABLE_CATALOG. */ - public final TableField PKTABLE_CATALOG = createField(DSL.name("PKTABLE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField PKTABLE_CATALOG = createField(DSL.name("PKTABLE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.PKTABLE_SCHEMA. */ - public final TableField PKTABLE_SCHEMA = createField(DSL.name("PKTABLE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField PKTABLE_SCHEMA = createField(DSL.name("PKTABLE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.PKTABLE_NAME. */ - public final TableField PKTABLE_NAME = createField(DSL.name("PKTABLE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField PKTABLE_NAME = createField(DSL.name("PKTABLE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.PKCOLUMN_NAME. */ - public final TableField PKCOLUMN_NAME = createField(DSL.name("PKCOLUMN_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField PKCOLUMN_NAME = createField(DSL.name("PKCOLUMN_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.FKTABLE_CATALOG. */ - public final TableField FKTABLE_CATALOG = createField(DSL.name("FKTABLE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField FKTABLE_CATALOG = createField(DSL.name("FKTABLE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.FKTABLE_SCHEMA. */ - public final TableField FKTABLE_SCHEMA = createField(DSL.name("FKTABLE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField FKTABLE_SCHEMA = createField(DSL.name("FKTABLE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.FKTABLE_NAME. */ - public final TableField FKTABLE_NAME = createField(DSL.name("FKTABLE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField FKTABLE_NAME = createField(DSL.name("FKTABLE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.FKCOLUMN_NAME. */ - public final TableField FKCOLUMN_NAME = createField(DSL.name("FKCOLUMN_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField FKCOLUMN_NAME = createField(DSL.name("FKCOLUMN_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.ORDINAL_POSITION. @@ -101,12 +101,12 @@ public class CrossReferences extends TableImpl { /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.FK_NAME. */ - public final TableField FK_NAME = createField(DSL.name("FK_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField FK_NAME = createField(DSL.name("FK_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.PK_NAME. */ - public final TableField PK_NAME = createField(DSL.name("PK_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField PK_NAME = createField(DSL.name("PK_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.CROSS_REFERENCES.DEFERRABILITY. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Domains.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Domains.java index 7a3502707c..4182317dc4 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Domains.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Domains.java @@ -47,27 +47,27 @@ public class Domains extends TableImpl { /** * The column INFORMATION_SCHEMA.DOMAINS.DOMAIN_CATALOG. */ - public final TableField DOMAIN_CATALOG = createField(DSL.name("DOMAIN_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DOMAIN_CATALOG = createField(DSL.name("DOMAIN_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.DOMAIN_SCHEMA. */ - public final TableField DOMAIN_SCHEMA = createField(DSL.name("DOMAIN_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DOMAIN_SCHEMA = createField(DSL.name("DOMAIN_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.DOMAIN_NAME. */ - public final TableField DOMAIN_NAME = createField(DSL.name("DOMAIN_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DOMAIN_NAME = createField(DSL.name("DOMAIN_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.COLUMN_DEFAULT. */ - public final TableField COLUMN_DEFAULT = createField(DSL.name("COLUMN_DEFAULT"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_DEFAULT = createField(DSL.name("COLUMN_DEFAULT"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.IS_NULLABLE. */ - public final TableField IS_NULLABLE = createField(DSL.name("IS_NULLABLE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField IS_NULLABLE = createField(DSL.name("IS_NULLABLE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.DATA_TYPE. @@ -87,7 +87,7 @@ public class Domains extends TableImpl { /** * The column INFORMATION_SCHEMA.DOMAINS.TYPE_NAME. */ - public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.SELECTIVITY. @@ -97,17 +97,17 @@ public class Domains extends TableImpl { /** * The column INFORMATION_SCHEMA.DOMAINS.CHECK_CONSTRAINT. */ - public final TableField CHECK_CONSTRAINT = createField(DSL.name("CHECK_CONSTRAINT"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CHECK_CONSTRAINT = createField(DSL.name("CHECK_CONSTRAINT"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.SQL. */ - public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.DOMAINS.ID. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionAliases.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionAliases.java index 247fa28b22..c9bbe3abfe 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionAliases.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionAliases.java @@ -42,27 +42,27 @@ public class FunctionAliases extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.ALIAS_CATALOG. */ - public final TableField ALIAS_CATALOG = createField(DSL.name("ALIAS_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField ALIAS_CATALOG = createField(DSL.name("ALIAS_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.ALIAS_SCHEMA. */ - public final TableField ALIAS_SCHEMA = createField(DSL.name("ALIAS_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField ALIAS_SCHEMA = createField(DSL.name("ALIAS_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.ALIAS_NAME. */ - public final TableField ALIAS_NAME = createField(DSL.name("ALIAS_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField ALIAS_NAME = createField(DSL.name("ALIAS_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.JAVA_CLASS. */ - public final TableField JAVA_CLASS = createField(DSL.name("JAVA_CLASS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField JAVA_CLASS = createField(DSL.name("JAVA_CLASS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.JAVA_METHOD. */ - public final TableField JAVA_METHOD = createField(DSL.name("JAVA_METHOD"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField JAVA_METHOD = createField(DSL.name("JAVA_METHOD"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.DATA_TYPE. @@ -72,7 +72,7 @@ public class FunctionAliases extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.TYPE_NAME. */ - public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.COLUMN_COUNT. @@ -87,7 +87,7 @@ public class FunctionAliases extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.ID. @@ -97,7 +97,7 @@ public class FunctionAliases extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_ALIASES.SOURCE. */ - public final TableField SOURCE = createField(DSL.name("SOURCE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SOURCE = createField(DSL.name("SOURCE"), SQLDataType.VARCHAR, this, ""); private FunctionAliases(Name alias, Table aliased) { this(alias, aliased, null); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionColumns.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionColumns.java index b3c4b985b4..c410ffe1ab 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionColumns.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/FunctionColumns.java @@ -42,27 +42,27 @@ public class FunctionColumns extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.ALIAS_CATALOG. */ - public final TableField ALIAS_CATALOG = createField(DSL.name("ALIAS_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField ALIAS_CATALOG = createField(DSL.name("ALIAS_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.ALIAS_SCHEMA. */ - public final TableField ALIAS_SCHEMA = createField(DSL.name("ALIAS_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField ALIAS_SCHEMA = createField(DSL.name("ALIAS_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.ALIAS_NAME. */ - public final TableField ALIAS_NAME = createField(DSL.name("ALIAS_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField ALIAS_NAME = createField(DSL.name("ALIAS_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.JAVA_CLASS. */ - public final TableField JAVA_CLASS = createField(DSL.name("JAVA_CLASS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField JAVA_CLASS = createField(DSL.name("JAVA_CLASS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.JAVA_METHOD. */ - public final TableField JAVA_METHOD = createField(DSL.name("JAVA_METHOD"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField JAVA_METHOD = createField(DSL.name("JAVA_METHOD"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.COLUMN_COUNT. @@ -77,7 +77,7 @@ public class FunctionColumns extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.COLUMN_NAME. */ - public final TableField COLUMN_NAME = createField(DSL.name("COLUMN_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_NAME = createField(DSL.name("COLUMN_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.DATA_TYPE. @@ -87,7 +87,7 @@ public class FunctionColumns extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.TYPE_NAME. */ - public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.PRECISION. @@ -117,12 +117,12 @@ public class FunctionColumns extends TableImpl { /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.FUNCTION_COLUMNS.COLUMN_DEFAULT. */ - public final TableField COLUMN_DEFAULT = createField(DSL.name("COLUMN_DEFAULT"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_DEFAULT = createField(DSL.name("COLUMN_DEFAULT"), SQLDataType.VARCHAR, this, ""); private FunctionColumns(Name alias, Table aliased) { this(alias, aliased, null); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Indexes.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Indexes.java index eb21e88bf0..3bc9d19002 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Indexes.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Indexes.java @@ -42,17 +42,17 @@ public class Indexes extends TableImpl { /** * The column INFORMATION_SCHEMA.INDEXES.TABLE_CATALOG. */ - public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.TABLE_SCHEMA. */ - public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.TABLE_NAME. */ - public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.NON_UNIQUE. @@ -62,7 +62,7 @@ public class Indexes extends TableImpl { /** * The column INFORMATION_SCHEMA.INDEXES.INDEX_NAME. */ - public final TableField INDEX_NAME = createField(DSL.name("INDEX_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField INDEX_NAME = createField(DSL.name("INDEX_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.ORDINAL_POSITION. @@ -72,7 +72,7 @@ public class Indexes extends TableImpl { /** * The column INFORMATION_SCHEMA.INDEXES.COLUMN_NAME. */ - public final TableField COLUMN_NAME = createField(DSL.name("COLUMN_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField COLUMN_NAME = createField(DSL.name("COLUMN_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.CARDINALITY. @@ -87,7 +87,7 @@ public class Indexes extends TableImpl { /** * The column INFORMATION_SCHEMA.INDEXES.INDEX_TYPE_NAME. */ - public final TableField INDEX_TYPE_NAME = createField(DSL.name("INDEX_TYPE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField INDEX_TYPE_NAME = createField(DSL.name("INDEX_TYPE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.IS_GENERATED. @@ -102,7 +102,7 @@ public class Indexes extends TableImpl { /** * The column INFORMATION_SCHEMA.INDEXES.ASC_OR_DESC. */ - public final TableField ASC_OR_DESC = createField(DSL.name("ASC_OR_DESC"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField ASC_OR_DESC = createField(DSL.name("ASC_OR_DESC"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.PAGES. @@ -112,17 +112,17 @@ public class Indexes extends TableImpl { /** * The column INFORMATION_SCHEMA.INDEXES.FILTER_CONDITION. */ - public final TableField FILTER_CONDITION = createField(DSL.name("FILTER_CONDITION"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField FILTER_CONDITION = createField(DSL.name("FILTER_CONDITION"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.SQL. */ - public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.ID. @@ -137,12 +137,12 @@ public class Indexes extends TableImpl { /** * The column INFORMATION_SCHEMA.INDEXES.CONSTRAINT_NAME. */ - public final TableField CONSTRAINT_NAME = createField(DSL.name("CONSTRAINT_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CONSTRAINT_NAME = createField(DSL.name("CONSTRAINT_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.INDEX_CLASS. */ - public final TableField INDEX_CLASS = createField(DSL.name("INDEX_CLASS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField INDEX_CLASS = createField(DSL.name("INDEX_CLASS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.INDEXES.AFFINITY. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Schemata.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Schemata.java index 285c95893e..8b1af4ac58 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Schemata.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Schemata.java @@ -47,27 +47,27 @@ public class Schemata extends TableImpl { /** * The column INFORMATION_SCHEMA.SCHEMATA.CATALOG_NAME. */ - public final TableField CATALOG_NAME = createField(DSL.name("CATALOG_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CATALOG_NAME = createField(DSL.name("CATALOG_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME. */ - public final TableField SCHEMA_NAME = createField(DSL.name("SCHEMA_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SCHEMA_NAME = createField(DSL.name("SCHEMA_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SCHEMATA.SCHEMA_OWNER. */ - public final TableField SCHEMA_OWNER = createField(DSL.name("SCHEMA_OWNER"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SCHEMA_OWNER = createField(DSL.name("SCHEMA_OWNER"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SCHEMATA.DEFAULT_CHARACTER_SET_NAME. */ - public final TableField DEFAULT_CHARACTER_SET_NAME = createField(DSL.name("DEFAULT_CHARACTER_SET_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DEFAULT_CHARACTER_SET_NAME = createField(DSL.name("DEFAULT_CHARACTER_SET_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SCHEMATA.DEFAULT_COLLATION_NAME. */ - public final TableField DEFAULT_COLLATION_NAME = createField(DSL.name("DEFAULT_COLLATION_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField DEFAULT_COLLATION_NAME = createField(DSL.name("DEFAULT_COLLATION_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SCHEMATA.IS_DEFAULT. @@ -77,7 +77,7 @@ public class Schemata extends TableImpl { /** * The column INFORMATION_SCHEMA.SCHEMATA.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SCHEMATA.ID. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Sequences.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Sequences.java index e99abb78c2..9108a111c2 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Sequences.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Sequences.java @@ -47,17 +47,17 @@ public class Sequences extends TableImpl { /** * The column INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_CATALOG. */ - public final TableField SEQUENCE_CATALOG = createField(DSL.name("SEQUENCE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SEQUENCE_CATALOG = createField(DSL.name("SEQUENCE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA. */ - public final TableField SEQUENCE_SCHEMA = createField(DSL.name("SEQUENCE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SEQUENCE_SCHEMA = createField(DSL.name("SEQUENCE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME. */ - public final TableField SEQUENCE_NAME = createField(DSL.name("SEQUENCE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SEQUENCE_NAME = createField(DSL.name("SEQUENCE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SEQUENCES.CURRENT_VALUE. @@ -77,7 +77,7 @@ public class Sequences extends TableImpl { /** * The column INFORMATION_SCHEMA.SEQUENCES.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.SEQUENCES.CACHE. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Tables.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Tables.java index 580553d4eb..efd27b020a 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Tables.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Tables.java @@ -47,37 +47,37 @@ public class Tables extends TableImpl { /** * The column INFORMATION_SCHEMA.TABLES.TABLE_CATALOG. */ - public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA. */ - public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.TABLE_NAME. */ - public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.TABLE_TYPE. */ - public final TableField TABLE_TYPE = createField(DSL.name("TABLE_TYPE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_TYPE = createField(DSL.name("TABLE_TYPE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.STORAGE_TYPE. */ - public final TableField STORAGE_TYPE = createField(DSL.name("STORAGE_TYPE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField STORAGE_TYPE = createField(DSL.name("STORAGE_TYPE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.SQL. */ - public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SQL = createField(DSL.name("SQL"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.LAST_MODIFICATION. @@ -92,12 +92,12 @@ public class Tables extends TableImpl { /** * The column INFORMATION_SCHEMA.TABLES.TYPE_NAME. */ - public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.TABLE_CLASS. */ - public final TableField TABLE_CLASS = createField(DSL.name("TABLE_CLASS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_CLASS = createField(DSL.name("TABLE_CLASS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TABLES.ROW_COUNT_ESTIMATE. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/TypeInfo.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/TypeInfo.java index 537ffd777a..eee73f4416 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/TypeInfo.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/TypeInfo.java @@ -42,7 +42,7 @@ public class TypeInfo extends TableImpl { /** * The column INFORMATION_SCHEMA.TYPE_INFO.TYPE_NAME. */ - public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TYPE_NAME = createField(DSL.name("TYPE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TYPE_INFO.DATA_TYPE. @@ -57,17 +57,17 @@ public class TypeInfo extends TableImpl { /** * The column INFORMATION_SCHEMA.TYPE_INFO.PREFIX. */ - public final TableField PREFIX = createField(DSL.name("PREFIX"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField PREFIX = createField(DSL.name("PREFIX"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TYPE_INFO.SUFFIX. */ - public final TableField SUFFIX = createField(DSL.name("SUFFIX"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField SUFFIX = createField(DSL.name("SUFFIX"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TYPE_INFO.PARAMS. */ - public final TableField PARAMS = createField(DSL.name("PARAMS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField PARAMS = createField(DSL.name("PARAMS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.TYPE_INFO.AUTO_INCREMENT. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Views.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Views.java index b93f56adc9..b267bf15d5 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Views.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/information_schema/tables/Views.java @@ -42,42 +42,42 @@ public class Views extends TableImpl { /** * The column INFORMATION_SCHEMA.VIEWS.TABLE_CATALOG. */ - public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_CATALOG = createField(DSL.name("TABLE_CATALOG"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.TABLE_SCHEMA. */ - public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_SCHEMA = createField(DSL.name("TABLE_SCHEMA"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.TABLE_NAME. */ - public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField TABLE_NAME = createField(DSL.name("TABLE_NAME"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION. */ - public final TableField VIEW_DEFINITION = createField(DSL.name("VIEW_DEFINITION"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField VIEW_DEFINITION = createField(DSL.name("VIEW_DEFINITION"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.CHECK_OPTION. */ - public final TableField CHECK_OPTION = createField(DSL.name("CHECK_OPTION"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField CHECK_OPTION = createField(DSL.name("CHECK_OPTION"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.IS_UPDATABLE. */ - public final TableField IS_UPDATABLE = createField(DSL.name("IS_UPDATABLE"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField IS_UPDATABLE = createField(DSL.name("IS_UPDATABLE"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.STATUS. */ - public final TableField STATUS = createField(DSL.name("STATUS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField STATUS = createField(DSL.name("STATUS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.REMARKS. */ - public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR(2147483647), this, ""); + public final TableField REMARKS = createField(DSL.name("REMARKS"), SQLDataType.VARCHAR, this, ""); /** * The column INFORMATION_SCHEMA.VIEWS.ID. diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java index 21ca33af1f..3808cc4bc1 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java @@ -292,7 +292,7 @@ public class HSQLDBDatabase extends AbstractDatabase implements ResultQueryDatab .join(pkKcu) .on(pkKcu.CONSTRAINT_SCHEMA.eq(TABLE_CONSTRAINTS.CONSTRAINT_SCHEMA)) .and(pkKcu.CONSTRAINT_NAME.eq(TABLE_CONSTRAINTS.CONSTRAINT_NAME)) - .and(pkKcu.ORDINAL_POSITION.eq(fkKcu.ORDINAL_POSITION)) + .and(pkKcu.ORDINAL_POSITION.eq(fkKcu.POSITION_IN_UNIQUE_CONSTRAINT)) .where(fkKcu.TABLE_SCHEMA.in(getInputSchemata())) .orderBy( fkKcu.TABLE_SCHEMA.asc(), diff --git a/jOOQ/src/main/java/org/jooq/AlterTableDropStep.java b/jOOQ/src/main/java/org/jooq/AlterTableDropStep.java index c485bc4d4f..94ab815c2b 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableDropStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableDropStep.java @@ -80,7 +80,7 @@ public interface AlterTableDropStep extends AlterTableFinalStep { * ALTER TABLE .. DROP statement. */ @NotNull @CheckReturnValue - @Support({ DERBY, H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ DERBY, HSQLDB, POSTGRES, YUGABYTE }) AlterTableFinalStep cascade(); /** diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index 3383b1fcd0..cdc6dfb092 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -11610,7 +11610,6 @@ public interface DSLContext extends Scope { *
  • {@link SQLDialect#ACCESS}: Using @@identity
  • *
  • {@link SQLDialect#ASE}: Using @@identity
  • *
  • {@link SQLDialect#DERBY}: Using identity_val_local()
  • - *
  • {@link SQLDialect#H2}: Using identity()
  • *
  • {@link SQLDialect#HSQLDB}: Using identity()
  • *
  • {@link SQLDialect#INFORMIX}: Using * dbinfo('sqlca.sqlerrd1')
  • @@ -11629,7 +11628,7 @@ public interface DSLContext extends Scope { * @throws DataAccessException if something went wrong executing the query */ @NotNull - @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + @Support({ CUBRID, DERBY, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) BigInteger lastID() throws DataAccessException; /** diff --git a/jOOQ/src/main/java/org/jooq/SQLDialect.java b/jOOQ/src/main/java/org/jooq/SQLDialect.java index 8c3c570fd5..ea551d5a6a 100644 --- a/jOOQ/src/main/java/org/jooq/SQLDialect.java +++ b/jOOQ/src/main/java/org/jooq/SQLDialect.java @@ -156,6 +156,14 @@ public enum SQLDialect { + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 8736d96371..ab3a4ba27c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -50,6 +50,8 @@ import static org.jooq.SQLDialect.DERBY; import static org.jooq.SQLDialect.FIREBIRD; import static org.jooq.SQLDialect.H2; // ... +// ... +// ... import static org.jooq.SQLDialect.HSQLDB; import static org.jooq.SQLDialect.IGNITE; // ... @@ -178,13 +180,14 @@ import org.jooq.tools.jdbc.JDBCUtils; */ abstract class AbstractDMLQuery extends AbstractRowCountQuery implements DMLQuery { - private static final JooqLogger log = JooqLogger.getLogger(AbstractQuery.class); + private static final JooqLogger log = JooqLogger.getLogger(AbstractQuery.class); - private static final Set NO_SUPPORT_INSERT_ALIASED_TABLE = SQLDialect.supportedBy(DERBY, FIREBIRD, H2, MARIADB, MYSQL); - private static final Set NATIVE_SUPPORT_INSERT_RETURNING = SQLDialect.supportedBy(FIREBIRD, MARIADB, POSTGRES, YUGABYTE); - private static final Set NATIVE_SUPPORT_UPDATE_RETURNING = SQLDialect.supportedBy(FIREBIRD, POSTGRES, YUGABYTE); - private static final Set NATIVE_SUPPORT_DELETE_RETURNING = SQLDialect.supportedBy(FIREBIRD, MARIADB, POSTGRES, YUGABYTE); - private static final Set NO_SUPPORT_FETCHING_KEYS = SQLDialect.supportedBy(IGNITE); + private static final Set NO_SUPPORT_INSERT_ALIASED_TABLE = SQLDialect.supportedBy(DERBY, FIREBIRD, H2, MARIADB, MYSQL); + private static final Set NATIVE_SUPPORT_INSERT_RETURNING = SQLDialect.supportedBy(FIREBIRD, MARIADB, POSTGRES, YUGABYTE); + private static final Set NATIVE_SUPPORT_UPDATE_RETURNING = SQLDialect.supportedBy(FIREBIRD, POSTGRES, YUGABYTE); + private static final Set NATIVE_SUPPORT_DELETE_RETURNING = SQLDialect.supportedBy(FIREBIRD, MARIADB, POSTGRES, YUGABYTE); + private static final Set NATIVE_SUPPORT_DATA_CHANGE_DELTA_TABLE = SQLDialect.supportedBy(H2); + private static final Set NO_SUPPORT_FETCHING_KEYS = SQLDialect.supportedBy(IGNITE); @@ -847,6 +850,10 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery || this instanceof Delete && NATIVE_SUPPORT_DELETE_RETURNING.contains(ctx.dialect()); } + final boolean nativeSupportReturningOrDataChangeDeltaTable(Scope ctx) { + return NATIVE_SUPPORT_DATA_CHANGE_DELTA_TABLE.contains(ctx.dialect()) || nativeSupportReturning(ctx); + } + @Override protected final void prepare(ExecuteContext ctx) throws SQLException { prepare0(ctx); @@ -864,7 +871,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery else if (NO_SUPPORT_FETCHING_KEYS.contains(ctx.dialect())) super.prepare(ctx); - else if (nativeSupportReturning(ctx)) + else if (nativeSupportReturningOrDataChangeDeltaTable(ctx)) super.prepare(ctx); @@ -885,8 +892,6 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery - - // SQLite will select last_insert_rowid() after the INSER case SQLITE: case CUBRID: @@ -905,7 +910,6 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery case DERBY: - case H2: // [#9212] Older MariaDB versions that don't support RETURNING // yet, or UPDATE .. RETURNING @@ -1040,7 +1044,6 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery case DERBY: - case H2: case MYSQL: { return executeReturningGeneratedKeysFetchAdditionalRows(ctx, listener); } @@ -1053,6 +1056,15 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery break; } + // [#9676] H2 2.0.202 has introduced support for data change delta tables + case H2: + + + + + + rs = executeReturningQuery(ctx, listener); + break; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java b/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java index 0b5bac18d8..4cd9d79f7b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractInList.java @@ -55,6 +55,7 @@ import static org.jooq.SQLDialect.CUBRID; import static org.jooq.SQLDialect.DERBY; // ... import static org.jooq.SQLDialect.FIREBIRD; +import static org.jooq.SQLDialect.H2; // ... import static org.jooq.SQLDialect.HSQLDB; // ... @@ -108,7 +109,7 @@ abstract class AbstractInList extends AbstractCondition { static final int IN_LIMIT = 1000; static final Set REQUIRES_IN_LIMIT = SQLDialect.supportedBy(FIREBIRD); - static final Set NO_SUPPORT_EMPTY_LISTS = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTE); + static final Set NO_SUPPORT_EMPTY_LISTS = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, YUGABYTE); final Field field; final QueryPartList> values; diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index dcf9fa0bda..24b8b74155 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -63,6 +63,7 @@ import static org.jooq.SQLDialect.CUBRID; import static org.jooq.SQLDialect.DERBY; // ... import static org.jooq.SQLDialect.FIREBIRD; +import static org.jooq.SQLDialect.H2; // ... import static org.jooq.SQLDialect.HSQLDB; // ... @@ -1661,7 +1662,12 @@ implements private final void acceptCascade(Context ctx) { switch (ctx.family()) { case H2: - // H2 defaults to CASCADE but doesn't support the keywords + + + + + + acceptCascade(ctx, dropCascade); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java index 19a6786e95..634767939d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java @@ -43,6 +43,7 @@ import org.jooq.Configuration; import org.jooq.DataType; import org.jooq.Field; import org.jooq.Nullability; +import org.jooq.SQLDialect; import org.jooq.impl.QOM.GenerationOption; /** @@ -151,7 +152,12 @@ final class ArrayDataType extends DefaultDataType { return dataType + "[]"; case H2: - return "array"; + + + + + + return dataType + " array"; // Default implementation is needed for hash-codes and toString() default: diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayGet.java b/jOOQ/src/main/java/org/jooq/impl/ArrayGet.java index 75f04f37a9..3d29d7083c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayGet.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayGet.java @@ -103,9 +103,15 @@ implements - case H2: - ctx.visit(N_ARRAY_GET).sql('(').visit(array).sql(", ").visit(index).sql(')'); - break; + + + + + + + + + case HSQLDB: ctx.visit(when(cardinality(array).ge(index), new Standard())); diff --git a/jOOQ/src/main/java/org/jooq/impl/BitAndAgg.java b/jOOQ/src/main/java/org/jooq/impl/BitAndAgg.java index 5c374438dc..09492ba8da 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BitAndAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/BitAndAgg.java @@ -265,7 +265,6 @@ implements - case H2: case IGNITE: case MARIADB: case MYSQL: @@ -274,6 +273,15 @@ implements ctx.visit(N_BIT_AND); break; + case H2: + + + + + + ctx.visit(N_BIT_AND_AGG); + break; + default: super.acceptFunctionName(ctx); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/BitOrAgg.java b/jOOQ/src/main/java/org/jooq/impl/BitOrAgg.java index 2d182c8b84..7e7ccf17a2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BitOrAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/BitOrAgg.java @@ -265,7 +265,6 @@ implements - case H2: case IGNITE: case MARIADB: case MYSQL: @@ -274,6 +273,15 @@ implements ctx.visit(N_BIT_OR); break; + case H2: + + + + + + ctx.visit(N_BIT_OR_AGG); + break; + default: super.acceptFunctionName(ctx); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java b/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java index 7b0923abcd..b48bf7d26a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java @@ -271,7 +271,6 @@ implements - case H2: case IGNITE: case MARIADB: case MYSQL: @@ -279,6 +278,15 @@ implements ctx.visit(N_BIT_XOR); break; + case H2: + + + + + + ctx.visit(N_BIT_XOR_AGG); + break; + default: super.acceptFunctionName(ctx); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java index 3d41eb0a58..fb3ddaa180 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java +++ b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java index ca8cc3f5d6..918a34ee97 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java +++ b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 4c05aa0b9d..c9653390df 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -98,20 +98,15 @@ import static org.jooq.SQLDialect.SQLITE; // ... import static org.jooq.SQLDialect.YUGABYTE; import static org.jooq.conf.ParamType.INLINED; -import static org.jooq.impl.Keywords.K_GROUPING_SETS; -import static org.jooq.impl.Names.N_AVG; import static org.jooq.impl.Names.N_COUNT; import static org.jooq.impl.Names.N_CUME_DIST; import static org.jooq.impl.Names.N_DENSE_RANK; import static org.jooq.impl.Names.N_IF; import static org.jooq.impl.Names.N_IIF; -import static org.jooq.impl.Names.N_MAX; -import static org.jooq.impl.Names.N_MIN; import static org.jooq.impl.Names.N_PERCENTILE_CONT; import static org.jooq.impl.Names.N_PERCENTILE_DISC; import static org.jooq.impl.Names.N_PERCENT_RANK; import static org.jooq.impl.Names.N_RANK; -import static org.jooq.impl.Names.N_SUM; import static org.jooq.impl.Names.N_SYSTEM_TIME; import static org.jooq.impl.Names.N_VALUE; import static org.jooq.impl.SQLDataType.DATE; @@ -421,8 +416,8 @@ import org.jooq.XMLTablePassingStep; import org.jooq.conf.NestedCollectionEmulation; import org.jooq.conf.Settings; import org.jooq.exception.SQLDialectNotSupportedException; -import org.jooq.impl.QOM.ResultOption; import org.jooq.impl.QOM.DocumentOrContent; +import org.jooq.impl.QOM.ResultOption; import org.jooq.tools.StringUtils; import org.jooq.tools.jdbc.JDBCUtils; import org.jooq.types.DayToSecond; @@ -18339,7 +18334,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toDate(@Stringly.Param String value, @Stringly.Param String formatMask) { return new ToDate(Tools.field(value), Tools.field(formatMask)); } @@ -18353,7 +18348,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toDate(@Stringly.Param String value, Field formatMask) { return new ToDate(Tools.field(value), formatMask); } @@ -18367,7 +18362,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toDate(Field value, @Stringly.Param String formatMask) { return new ToDate(value, Tools.field(formatMask)); } @@ -18381,7 +18376,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toDate(Field value, Field formatMask) { return new ToDate(value, formatMask); } @@ -18419,7 +18414,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toTimestamp(@Stringly.Param String value, @Stringly.Param String formatMask) { return new ToTimestamp(Tools.field(value), Tools.field(formatMask)); } @@ -18433,7 +18428,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toTimestamp(@Stringly.Param String value, Field formatMask) { return new ToTimestamp(Tools.field(value), formatMask); } @@ -18447,7 +18442,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toTimestamp(Field value, @Stringly.Param String formatMask) { return new ToTimestamp(value, Tools.field(formatMask)); } @@ -18461,7 +18456,7 @@ public class DSL { * @param formatMask The vendor-specific formatting string. */ @NotNull - @Support({ H2, HSQLDB, POSTGRES, YUGABYTE }) + @Support({ HSQLDB, POSTGRES, YUGABYTE }) public static Field toTimestamp(Field value, Field formatMask) { return new ToTimestamp(value, formatMask); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index b0d8c9ea3b..c0439acb44 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -61,6 +61,8 @@ import static org.jooq.SQLDialect.FIREBIRD; // ... import static org.jooq.SQLDialect.H2; // ... +// ... +// ... import static org.jooq.SQLDialect.HSQLDB; // ... // ... @@ -634,7 +636,7 @@ public class DefaultBinding implements Binding { // ----------------------------------------------------------------------------------------------------------------- abstract static class AbstractBinding implements org.jooq.Binding { - static final Set NEEDS_PRECISION_SCALE_ON_BIGDECIMAL = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, HSQLDB); + static final Set NEEDS_PRECISION_SCALE_ON_BIGDECIMAL = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB); static final Set REQUIRES_JSON_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTE); static final Set NO_SUPPORT_ENUM_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTE); static final Set NO_SUPPORT_NVARCHAR = SQLDialect.supportedBy(DERBY, FIREBIRD, POSTGRES, SQLITE, YUGABYTE); @@ -1100,6 +1102,11 @@ public class DefaultBinding implements Binding { static final class DefaultArrayBinding extends AbstractBinding { private static final Set REQUIRES_ARRAY_CAST = SQLDialect.supportedBy(POSTGRES, YUGABYTE); + + + + + DefaultArrayBinding(DataType dataType, Converter converter) { super(dataType, converter); } @@ -1109,20 +1116,7 @@ public class DefaultBinding implements Binding { final void sqlInline0(BindingSQLContext ctx, Object[] value) throws SQLException { String separator = ""; - // H2 renders arrays as rows - if (ctx.family() == H2) { - ctx.render().sql('('); - - for (Object o : value) { - ctx.render().sql(separator); - binding((DataType) dataType.getArrayComponentDataType()).sql(new DefaultBindingSQLContext<>(ctx.configuration(), ctx.data(), ctx.render(), o)); - separator = ", "; - } - - ctx.render().sql(')'); - } - - else if (REQUIRES_ARRAY_CAST.contains(ctx.dialect())) { + if (REQUIRES_ARRAY_CAST.contains(ctx.dialect())) { // [#8933] In some cases, we cannot derive the cast type from // array type directly @@ -1134,6 +1128,22 @@ public class DefaultBinding implements Binding { ctx.render().visit(cast(inline(PostgresUtils.toPGArrayString(value)), arrayType)); } + + + + + + + + + + + + + + + + // By default, render HSQLDB syntax else { boolean squareBrackets = true; diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java index 5b215e338b..23fbabf099 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java @@ -39,7 +39,9 @@ package org.jooq.impl; import static java.util.Collections.unmodifiableCollection; // ... +// ... import static org.jooq.SQLDialect.FIREBIRD; +import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.HSQLDB; // ... import static org.jooq.SQLDialect.MARIADB; @@ -131,6 +133,7 @@ public class DefaultDataType extends AbstractDataTypeX { private static final Set ENCODED_TIMESTAMP_PRECISION = SQLDialect.supportedBy(HSQLDB, MARIADB); private static final Set NO_SUPPORT_TIMESTAMP_PRECISION = SQLDialect.supportedBy(FIREBIRD, MYSQL, SQLITE); private static final Set SUPPORT_POSTGRES_ARRAY_NOTATION = SQLDialect.supportedBy(POSTGRES, YUGABYTE); + private static final Set SUPPORT_HSQLDB_ARRAY_NOTATION = SQLDialect.supportedBy(H2, HSQLDB); /** * A pattern for data type name normalisation. @@ -644,10 +647,14 @@ public class DefaultDataType extends AbstractDataTypeX { else if (result == null && SUPPORT_POSTGRES_ARRAY_NOTATION.contains(dialect) && normalised.charAt(0) == '_') result = getDataType(dialect, normalised.substring(1)).getArrayDataType(); - // [#6466] HSQLDB reports array types as XYZARRAY - else if (result == null && family == HSQLDB && upper.endsWith(" ARRAY")) + // [#6466] HSQLDB reports array types as XYZARRAY. H2 should, too + else if (result == null && SUPPORT_HSQLDB_ARRAY_NOTATION.contains(dialect) && upper.endsWith(" ARRAY")) result = getDataType(dialect, typeName.substring(0, typeName.length() - 6)).getArrayDataType(); + // [#9609] H2 might still report an untyped array, too + else if (result == null && SUPPORT_HSQLDB_ARRAY_NOTATION.contains(dialect) && upper.equals("ARRAY")) + result = SQLDataType.OTHER.getArrayDataType(); + diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index fe9fee6051..c8974617c6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -588,6 +588,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl + case H2: diff --git a/jOOQ/src/main/java/org/jooq/impl/Limit.java b/jOOQ/src/main/java/org/jooq/impl/Limit.java index 75744fd1d1..7c3bc161c3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Limit.java +++ b/jOOQ/src/main/java/org/jooq/impl/Limit.java @@ -166,6 +166,7 @@ final class Limit extends AbstractQueryPart implements UTransient { + case DERBY: diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index 58e870e13b..fa244247b8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -40,6 +40,7 @@ package org.jooq.impl; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; // ... // ... // ... @@ -75,6 +76,7 @@ import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.impl.Tools.EMPTY_OBJECT; import static org.jooq.impl.Tools.EMPTY_SORTFIELD; import static org.jooq.impl.Tools.flatMap; +import static org.jooq.impl.Tools.ignoreNPE; import static org.jooq.impl.Tools.map; import static org.jooq.tools.StringUtils.defaultIfEmpty; import static org.jooq.tools.StringUtils.defaultString; @@ -85,6 +87,7 @@ import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -125,6 +128,7 @@ import org.jooq.exception.SQLDialectNotSupportedException; import org.jooq.impl.ThreadGuard.Guard; import org.jooq.tools.JooqLogger; import org.jooq.tools.StringUtils; +import org.jooq.tools.jdbc.MockResultSet; /** * An implementation of the public {@link Meta} type. @@ -688,30 +692,36 @@ final class MetaImpl extends AbstractMeta { @Override public final List getIndexes() { - Result result = removeSystemIndexes(meta(meta -> { - try (ResultSet rs = catalogSchema(getCatalog(), getSchema(), (c, s) -> meta.getIndexInfo(c, s, getName(), false, true))) { - return dsl().fetch( - rs, - String.class, // TABLE_CAT - String.class, // TABLE_SCHEM - String.class, // TABLE_NAME - boolean.class, // NON_UNIQUE - String.class, // INDEX_QUALIFIER - String.class, // INDEX_NAME - int.class, // TYPE - int.class, // ORDINAL_POSITION - String.class, // COLUMN_NAME - String.class, // ASC_OR_DESC - long.class, // CARDINALITY - long.class, // PAGES - String.class // FILTER_CONDITION - ); - } - })); + // See https://github.com/h2database/h2database/issues/3236 + return ignoreNPE( + () -> { + Result result = removeSystemIndexes(meta(meta -> { + try (ResultSet rs = catalogSchema(getCatalog(), getSchema(), (c, s) -> meta.getIndexInfo(c, s, getName(), false, true))) { + return dsl().fetch( + rs, + String.class, // TABLE_CAT + String.class, // TABLE_SCHEM + String.class, // TABLE_NAME + boolean.class, // NON_UNIQUE + String.class, // INDEX_QUALIFIER + String.class, // INDEX_NAME + int.class, // TYPE + int.class, // ORDINAL_POSITION + String.class, // COLUMN_NAME + String.class, // ASC_OR_DESC + long.class, // CARDINALITY + long.class, // PAGES + String.class // FILTER_CONDITION + ); + } + })); - // Sort by INDEX_NAME (5), ORDINAL_POSITION (7) - result.sortAsc(7).sortAsc(5); - return createIndexes(result); + // Sort by INDEX_NAME (5), ORDINAL_POSITION (7) + result.sortAsc(7).sortAsc(5); + return createIndexes(result); + }, + () -> emptyList() + ); } private final Result removeSystemIndexes(Result result) { diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java index f49a49dc6d..29a39be3d5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java @@ -30,7 +30,7 @@ final class MetaSQL { static { M_UNIQUE_KEYS.put(FIREBIRD, "select null catalog, null schema, trim(RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME) RDB$RELATION_NAME, trim(RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME) RDB$CONSTRAINT_NAME, trim(RDB$INDEX_SEGMENTS.RDB$FIELD_NAME) RDB$FIELD_NAME, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION from RDB$RELATION_CONSTRAINTS join RDB$INDEX_SEGMENTS on RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME where RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'UNIQUE' order by RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME asc, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION asc"); - M_UNIQUE_KEYS.put(H2, "select INFORMATION_SCHEMA.CONSTRAINTS.TABLE_CATALOG, INFORMATION_SCHEMA.CONSTRAINTS.TABLE_SCHEMA, INFORMATION_SCHEMA.CONSTRAINTS.TABLE_NAME, INFORMATION_SCHEMA.CONSTRAINTS.CONSTRAINT_NAME, INFORMATION_SCHEMA.INDEXES.COLUMN_NAME, INFORMATION_SCHEMA.INDEXES.ORDINAL_POSITION from INFORMATION_SCHEMA.CONSTRAINTS join INFORMATION_SCHEMA.INDEXES on (INFORMATION_SCHEMA.CONSTRAINTS.TABLE_SCHEMA = INFORMATION_SCHEMA.INDEXES.TABLE_SCHEMA and INFORMATION_SCHEMA.CONSTRAINTS.TABLE_NAME = INFORMATION_SCHEMA.INDEXES.TABLE_NAME and INFORMATION_SCHEMA.CONSTRAINTS.UNIQUE_INDEX_NAME = INFORMATION_SCHEMA.INDEXES.INDEX_NAME) where (INFORMATION_SCHEMA.CONSTRAINTS.TABLE_SCHEMA in (cast(? as varchar(2147483647))) and INFORMATION_SCHEMA.CONSTRAINTS.CONSTRAINT_TYPE in ('UNIQUE')) order by INFORMATION_SCHEMA.CONSTRAINTS.TABLE_SCHEMA, INFORMATION_SCHEMA.CONSTRAINTS.CONSTRAINT_NAME, INFORMATION_SCHEMA.INDEXES.ORDINAL_POSITION"); + M_UNIQUE_KEYS.put(H2, "select INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_CATALOG, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_SCHEMA, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.ORDINAL_POSITION from (INFORMATION_SCHEMA.KEY_COLUMN_USAGE left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS alias_10316587 on (INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_CATALOG = alias_10316587.CONSTRAINT_CATALOG and INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_SCHEMA = alias_10316587.CONSTRAINT_SCHEMA and INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME = alias_10316587.CONSTRAINT_NAME)) where (alias_10316587.CONSTRAINT_TYPE in ('UNIQUE') and alias_10316587.TABLE_SCHEMA in (cast(? as varchar(128)))) order by INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_SCHEMA asc, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME asc, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME asc, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.ORDINAL_POSITION asc"); M_UNIQUE_KEYS.put(HSQLDB, "select INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_CATALOG, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_SCHEMA, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.ORDINAL_POSITION from (INFORMATION_SCHEMA.KEY_COLUMN_USAGE left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS as alias_10316587 on (INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_CATALOG = alias_10316587.CONSTRAINT_CATALOG and INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_SCHEMA = alias_10316587.CONSTRAINT_SCHEMA and INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME = alias_10316587.CONSTRAINT_NAME)) where (alias_10316587.CONSTRAINT_TYPE = 'UNIQUE' and alias_10316587.TABLE_SCHEMA in (cast(? as varchar(128)))) order by INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_SCHEMA asc, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME asc, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME asc, INFORMATION_SCHEMA.KEY_COLUMN_USAGE.ORDINAL_POSITION asc"); M_UNIQUE_KEYS.put(MARIADB, "select distinct null as TABLE_CATALOG, information_schema.STATISTICS.TABLE_SCHEMA, information_schema.STATISTICS.TABLE_NAME, information_schema.STATISTICS.INDEX_NAME, information_schema.STATISTICS.COLUMN_NAME, information_schema.STATISTICS.SEQ_IN_INDEX from information_schema.STATISTICS where (information_schema.STATISTICS.TABLE_SCHEMA in (?, 'ee7f6174-34f2-484b-8d81-20a4d9fc866d') and information_schema.STATISTICS.INDEX_NAME <> 'PRIMARY' and information_schema.STATISTICS.NON_UNIQUE = 0) order by information_schema.STATISTICS.TABLE_SCHEMA, information_schema.STATISTICS.TABLE_NAME, information_schema.STATISTICS.INDEX_NAME, information_schema.STATISTICS.SEQ_IN_INDEX"); M_UNIQUE_KEYS.put(MYSQL, "select distinct null as TABLE_CATALOG, information_schema.STATISTICS.TABLE_SCHEMA, information_schema.STATISTICS.TABLE_NAME, information_schema.STATISTICS.INDEX_NAME, information_schema.STATISTICS.COLUMN_NAME, information_schema.STATISTICS.SEQ_IN_INDEX from information_schema.STATISTICS where (information_schema.STATISTICS.TABLE_SCHEMA in (?, 'ee7f6174-34f2-484b-8d81-20a4d9fc866d') and information_schema.STATISTICS.INDEX_NAME <> 'PRIMARY' and information_schema.STATISTICS.NON_UNIQUE = 0) order by information_schema.STATISTICS.TABLE_SCHEMA, information_schema.STATISTICS.TABLE_NAME, information_schema.STATISTICS.INDEX_NAME, information_schema.STATISTICS.SEQ_IN_INDEX"); @@ -86,11 +86,12 @@ final class MetaSQL { + M_SEQUENCES.put(DERBY, "select cast(null as varchar(32672)) as catalog, alias_8805161.SCHEMANAME, SYS.SYSSEQUENCES.SEQUENCENAME, SYS.SYSSEQUENCES.SEQUENCEDATATYPE, cast(null as int) as numeric_precision, cast(null as int) as numeric_scale, nullif(SYS.SYSSEQUENCES.STARTVALUE, 1) as STARTVALUE, nullif(SYS.SYSSEQUENCES.INCREMENT, 1) as INCREMENT, nullif(SYS.SYSSEQUENCES.MINIMUMVALUE, case when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'SMALLINT' then -32768 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'INTEGER' then -2147483648 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'BIGINT' then -9223372036854775808 end) as MINIMUMVALUE, nullif(SYS.SYSSEQUENCES.MAXIMUMVALUE, case when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'SMALLINT' then 32767 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'INTEGER' then 2147483647 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'BIGINT' then 9223372036854775807 end) as MAXIMUMVALUE, (SYS.SYSSEQUENCES.CYCLEOPTION = 'Y') as CYCLEOPTION, cast(null as bigint) as cache from (SYS.SYSSEQUENCES join SYS.SYSSCHEMAS as alias_8805161 on SYS.SYSSEQUENCES.SCHEMAID = alias_8805161.SCHEMAID) where cast(alias_8805161.SCHEMANAME as varchar(32672)) in (cast(? as varchar(32672))) order by alias_8805161.SCHEMANAME, SYS.SYSSEQUENCES.SEQUENCENAME"); M_SEQUENCES.put(FIREBIRD, "select null catalog, null schema, trim(RDB$GENERATORS.RDB$GENERATOR_NAME) RDB$GENERATOR_NAME, 'BIGINT' type_name, null numeric_precision, null numeric_scale, nullif(RDB$GENERATORS.RDB$INITIAL_VALUE, 0) RDB$INITIAL_VALUE, nullif(RDB$GENERATORS.RDB$GENERATOR_INCREMENT, 1) RDB$GENERATOR_INCREMENT, null min_value, null max_value, null cycle, null cache from RDB$GENERATORS where RDB$GENERATORS.RDB$GENERATOR_NAME not in (select RDB$RELATION_FIELDS.RDB$GENERATOR_NAME from RDB$RELATION_FIELDS where (RDB$RELATION_FIELDS.RDB$GENERATOR_NAME is not null and RDB$RELATION_FIELDS.RDB$IDENTITY_TYPE = 1)) order by RDB$GENERATORS.RDB$GENERATOR_NAME"); - M_SEQUENCES.put(H2, "select null catalog, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME, 'BIGINT' type_name, null precision, null scale, null start_value, nullif(INFORMATION_SCHEMA.SEQUENCES.INCREMENT, 1) INCREMENT, nullif(INFORMATION_SCHEMA.SEQUENCES.MIN_VALUE, 1) MIN_VALUE, nullif(INFORMATION_SCHEMA.SEQUENCES.MAX_VALUE, 9223372036854775807) MAX_VALUE, INFORMATION_SCHEMA.SEQUENCES.IS_CYCLE, nullif(INFORMATION_SCHEMA.SEQUENCES.CACHE, 32) CACHE from INFORMATION_SCHEMA.SEQUENCES where (INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA in (cast(? as varchar(2147483647))) and upper(INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME) not like 'SYSTEM!_SEQUENCE!_%' escape '!') order by INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME"); + M_SEQUENCES.put(H2, "select null catalog, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME, 'BIGINT' type_name, null precision, null scale, null start_value, nullif(INFORMATION_SCHEMA.SEQUENCES.INCREMENT, 1) INCREMENT, nullif(SEQUENCES.MINIMUM_VALUE, 1) MIN_VALUE, nullif(SEQUENCES.MAXIMUM_VALUE, 9223372036854775807) MAX_VALUE, (SEQUENCES.CYCLE_OPTION = 'YES') IS_CYCLE, nullif(INFORMATION_SCHEMA.SEQUENCES.CACHE, 32) CACHE from INFORMATION_SCHEMA.SEQUENCES where (INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA in (cast(? as varchar)) and upper(INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME) not like 'SYSTEM!_SEQUENCE!_%' escape '!') order by INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME"); M_SEQUENCES.put(HSQLDB, "select null as catalog, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME, INFORMATION_SCHEMA.SEQUENCES.DATA_TYPE, INFORMATION_SCHEMA.SEQUENCES.NUMERIC_PRECISION, INFORMATION_SCHEMA.SEQUENCES.NUMERIC_SCALE, INFORMATION_SCHEMA.SEQUENCES.START_WITH, INFORMATION_SCHEMA.SEQUENCES.INCREMENT, INFORMATION_SCHEMA.SEQUENCES.MINIMUM_VALUE, INFORMATION_SCHEMA.SEQUENCES.MAXIMUM_VALUE, case when INFORMATION_SCHEMA.SEQUENCES.CYCLE_OPTION is not distinct from 'YES' then true else false end as CYCLE_OPTION, null as cache from INFORMATION_SCHEMA.SEQUENCES where INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA in (cast(? as varchar(128))) order by INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME"); M_SEQUENCES.put(POSTGRES, "with schemas(schema) as (select v.c1 from (values (?)) as v (c1)) (select null as catalog, information_schema.sequences.sequence_schema, information_schema.sequences.sequence_name, information_schema.sequences.data_type, information_schema.sequences.numeric_precision, information_schema.sequences.numeric_scale, nullif(cast(information_schema.sequences.start_value as bigint), 1) as start_value, nullif(cast(information_schema.sequences.increment as bigint), 1) as increment, nullif(cast(information_schema.sequences.minimum_value as bigint), 1) as minimum_value, nullif(cast(information_schema.sequences.maximum_value as decimal), (power(cast(2 as decimal), cast((information_schema.sequences.numeric_precision - 1) as decimal)) - 1)) as maximum_value, cast(information_schema.sequences.cycle_option as boolean) as cycle_option, null as cache from information_schema.sequences where (information_schema.sequences.sequence_schema in (select schemas.schema from schemas) and (information_schema.sequences.sequence_schema, information_schema.sequences.sequence_name) not in (select information_schema.columns.table_schema, (((information_schema.columns.table_name || '_') || information_schema.columns.column_name) || '_seq') from information_schema.columns where (information_schema.columns.column_default = (('nextval(''' || ((information_schema.columns.table_name || '_') || information_schema.columns.column_name)) || '_seq''::regclass)') or information_schema.columns.column_default = (('nextval(''' || ((((information_schema.columns.table_schema || '.') || information_schema.columns.table_name) || '_') || information_schema.columns.column_name)) || '_seq''::regclass)'))))) union all (select '', '', '', '', 0, 0, 0, 0, 0, 0, false, 0 where false) order by 2, 3"); M_SEQUENCES.put(YUGABYTE, "with schemas(schema) as (select v.c1 from (values (?)) as v (c1)) (select null as catalog, information_schema.sequences.sequence_schema, information_schema.sequences.sequence_name, information_schema.sequences.data_type, information_schema.sequences.numeric_precision, information_schema.sequences.numeric_scale, nullif(cast(information_schema.sequences.start_value as bigint), 1) as start_value, nullif(cast(information_schema.sequences.increment as bigint), 1) as increment, nullif(cast(information_schema.sequences.minimum_value as bigint), 1) as minimum_value, nullif(cast(information_schema.sequences.maximum_value as decimal), (power(cast(2 as decimal), cast((information_schema.sequences.numeric_precision - 1) as decimal)) - 1)) as maximum_value, cast(information_schema.sequences.cycle_option as boolean) as cycle_option, null as cache from information_schema.sequences where (information_schema.sequences.sequence_schema in (select schemas.schema from schemas) and (information_schema.sequences.sequence_schema, information_schema.sequences.sequence_name) not in (select information_schema.columns.table_schema, (((information_schema.columns.table_name || '_') || information_schema.columns.column_name) || '_seq') from information_schema.columns where (information_schema.columns.column_default = (('nextval(''' || ((information_schema.columns.table_name || '_') || information_schema.columns.column_name)) || '_seq''::regclass)') or information_schema.columns.column_default = (('nextval(''' || ((((information_schema.columns.table_schema || '.') || information_schema.columns.table_name) || '_') || information_schema.columns.column_name)) || '_seq''::regclass)'))))) union all (select '', '', '', '', 0, 0, 0, 0, 0, 0, false, 0 where false) order by 2, 3"); @@ -131,11 +132,12 @@ final class MetaSQL { + M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.put(DERBY, "select cast(null as varchar(32672)) as catalog, alias_8805161.SCHEMANAME, SYS.SYSSEQUENCES.SEQUENCENAME, SYS.SYSSEQUENCES.SEQUENCEDATATYPE, cast(null as int) as numeric_precision, cast(null as int) as numeric_scale, nullif(SYS.SYSSEQUENCES.STARTVALUE, 1) as STARTVALUE, nullif(SYS.SYSSEQUENCES.INCREMENT, 1) as INCREMENT, nullif(SYS.SYSSEQUENCES.MINIMUMVALUE, case when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'SMALLINT' then -32768 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'INTEGER' then -2147483648 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'BIGINT' then -9223372036854775808 end) as MINIMUMVALUE, nullif(SYS.SYSSEQUENCES.MAXIMUMVALUE, case when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'SMALLINT' then 32767 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'INTEGER' then 2147483647 when cast(SYS.SYSSEQUENCES.SEQUENCEDATATYPE as varchar(32672)) = 'BIGINT' then 9223372036854775807 end) as MAXIMUMVALUE, (SYS.SYSSEQUENCES.CYCLEOPTION = 'Y') as CYCLEOPTION, cast(null as bigint) as cache from (SYS.SYSSEQUENCES join SYS.SYSSCHEMAS as alias_8805161 on SYS.SYSSEQUENCES.SCHEMAID = alias_8805161.SCHEMAID) where cast(alias_8805161.SCHEMANAME as varchar(32672)) in (cast(? as varchar(32672))) order by alias_8805161.SCHEMANAME, SYS.SYSSEQUENCES.SEQUENCENAME"); M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.put(FIREBIRD, "select null catalog, null schema, trim(RDB$GENERATORS.RDB$GENERATOR_NAME) RDB$GENERATOR_NAME, 'BIGINT' type_name, null numeric_precision, null numeric_scale, nullif(RDB$GENERATORS.RDB$INITIAL_VALUE, 0) RDB$INITIAL_VALUE, nullif(RDB$GENERATORS.RDB$GENERATOR_INCREMENT, 1) RDB$GENERATOR_INCREMENT, null min_value, null max_value, null cycle, null cache from RDB$GENERATORS order by RDB$GENERATORS.RDB$GENERATOR_NAME"); - M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.put(H2, "select null catalog, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME, 'BIGINT' type_name, null precision, null scale, null start_value, nullif(INFORMATION_SCHEMA.SEQUENCES.INCREMENT, 1) INCREMENT, nullif(INFORMATION_SCHEMA.SEQUENCES.MIN_VALUE, 1) MIN_VALUE, nullif(INFORMATION_SCHEMA.SEQUENCES.MAX_VALUE, 9223372036854775807) MAX_VALUE, INFORMATION_SCHEMA.SEQUENCES.IS_CYCLE, nullif(INFORMATION_SCHEMA.SEQUENCES.CACHE, 32) CACHE from INFORMATION_SCHEMA.SEQUENCES where INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA in (cast(? as varchar(2147483647))) order by INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME"); + M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.put(H2, "select null catalog, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME, 'BIGINT' type_name, null precision, null scale, null start_value, nullif(INFORMATION_SCHEMA.SEQUENCES.INCREMENT, 1) INCREMENT, nullif(SEQUENCES.MINIMUM_VALUE, 1) MIN_VALUE, nullif(SEQUENCES.MAXIMUM_VALUE, 9223372036854775807) MAX_VALUE, (SEQUENCES.CYCLE_OPTION = 'YES') IS_CYCLE, nullif(INFORMATION_SCHEMA.SEQUENCES.CACHE, 32) CACHE from INFORMATION_SCHEMA.SEQUENCES where INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA in (cast(? as varchar)) order by INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME"); M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.put(HSQLDB, "select null as catalog, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME, INFORMATION_SCHEMA.SEQUENCES.DATA_TYPE, INFORMATION_SCHEMA.SEQUENCES.NUMERIC_PRECISION, INFORMATION_SCHEMA.SEQUENCES.NUMERIC_SCALE, INFORMATION_SCHEMA.SEQUENCES.START_WITH, INFORMATION_SCHEMA.SEQUENCES.INCREMENT, INFORMATION_SCHEMA.SEQUENCES.MINIMUM_VALUE, INFORMATION_SCHEMA.SEQUENCES.MAXIMUM_VALUE, case when INFORMATION_SCHEMA.SEQUENCES.CYCLE_OPTION is not distinct from 'YES' then true else false end as CYCLE_OPTION, null as cache from INFORMATION_SCHEMA.SEQUENCES where INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA in (cast(? as varchar(128))) order by INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_SCHEMA, INFORMATION_SCHEMA.SEQUENCES.SEQUENCE_NAME"); M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.put(POSTGRES, "with schemas(schema) as (select v.c1 from (values (?)) as v (c1)) (select null as catalog, information_schema.sequences.sequence_schema, information_schema.sequences.sequence_name, information_schema.sequences.data_type, information_schema.sequences.numeric_precision, information_schema.sequences.numeric_scale, nullif(cast(information_schema.sequences.start_value as bigint), 1) as start_value, nullif(cast(information_schema.sequences.increment as bigint), 1) as increment, nullif(cast(information_schema.sequences.minimum_value as bigint), 1) as minimum_value, nullif(cast(information_schema.sequences.maximum_value as decimal), (power(cast(2 as decimal), cast((information_schema.sequences.numeric_precision - 1) as decimal)) - 1)) as maximum_value, cast(information_schema.sequences.cycle_option as boolean) as cycle_option, null as cache from information_schema.sequences where information_schema.sequences.sequence_schema in (select schemas.schema from schemas)) union all (select null, alias_14763223.nspname, alias_75351712.relname, alias_109453426.typname, information_schema._pg_numeric_precision(alias_109453426.typbasetype, alias_109453426.typtypmod), 0, pg_catalog.pg_sequence.seqstart, pg_catalog.pg_sequence.seqincrement, pg_catalog.pg_sequence.seqmin, pg_catalog.pg_sequence.seqmax, pg_catalog.pg_sequence.seqcycle, null as cache from (pg_catalog.pg_sequence join (pg_catalog.pg_class as alias_75351712 join pg_catalog.pg_namespace as alias_14763223 on alias_75351712.relnamespace = alias_14763223.oid) on pg_catalog.pg_sequence.seqrelid = alias_75351712.oid join pg_catalog.pg_type as alias_109453426 on pg_catalog.pg_sequence.seqtypid = alias_109453426.oid) where (alias_14763223.nspname in (select schemas.schema from schemas) and alias_75351712.oid in (select pg_catalog.pg_depend.objid from pg_catalog.pg_depend where (pg_catalog.pg_depend.deptype = 'i' and pg_catalog.pg_depend.classid = 'pg_class'::regclass)))) order by 2, 3"); M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.put(YUGABYTE, "with schemas(schema) as (select v.c1 from (values (?)) as v (c1)) (select null as catalog, information_schema.sequences.sequence_schema, information_schema.sequences.sequence_name, information_schema.sequences.data_type, information_schema.sequences.numeric_precision, information_schema.sequences.numeric_scale, nullif(cast(information_schema.sequences.start_value as bigint), 1) as start_value, nullif(cast(information_schema.sequences.increment as bigint), 1) as increment, nullif(cast(information_schema.sequences.minimum_value as bigint), 1) as minimum_value, nullif(cast(information_schema.sequences.maximum_value as decimal), (power(cast(2 as decimal), cast((information_schema.sequences.numeric_precision - 1) as decimal)) - 1)) as maximum_value, cast(information_schema.sequences.cycle_option as boolean) as cycle_option, null as cache from information_schema.sequences where information_schema.sequences.sequence_schema in (select schemas.schema from schemas)) union all (select '', '', '', '', 0, 0, 0, 0, 0, 0, false, 0 where false) order by 2, 3"); @@ -175,6 +177,7 @@ final class MetaSQL { + } diff --git a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java index cd61f3d41e..b597c7b9d4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java +++ b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java @@ -418,7 +418,7 @@ final class R2DBC { - && !q2.nativeSupportReturning(configuration.dsl())) + && !q2.nativeSupportReturningOrDataChangeDeltaTable(configuration.dsl())) stmt.returnGeneratedValues(Tools.map(q2.returningResolvedAsterisks, Field::getName, String[]::new)); stmt.execute().subscribe(resultSubscriber.apply(query, downstream)); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java index 58bf78606a..f2f73f8048 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgX.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java index 6a0989dba7..60b18dd19d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgY.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java index 50fbe78b55..c7d37a4aac 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java index e78e3e4305..2320b034bc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java index 99b41d7921..c37513cbb0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java index 6067c16204..97cd7db78c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java index 19fa004a90..7126fc021d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java index 2b20226869..58bddec55d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java index d8b698e731..700d2dbc3c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java @@ -92,7 +92,7 @@ implements - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); diff --git a/jOOQ/src/main/java/org/jooq/impl/SequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/SequenceImpl.java index bb4e1bc222..80d5f7e15f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SequenceImpl.java @@ -42,6 +42,7 @@ import static org.jooq.Clause.SEQUENCE_REFERENCE; import static org.jooq.SQLDialect.CUBRID; import static org.jooq.SQLDialect.FIREBIRD; import static org.jooq.SQLDialect.H2; +// ... import static org.jooq.SQLDialect.HSQLDB; // ... import static org.jooq.SQLDialect.MARIADB; @@ -265,9 +266,11 @@ implements case MARIADB: if (method == SequenceMethod.NEXTVAL) ctx.visit(K_NEXT_VALUE_FOR).sql(' ').visit(sequence); - else if (family == H2) - ctx.visit(sequence).sql('.').visit(method.keyword); - else if (family == HSQLDB) + + + + + else if (family == HSQLDB || family == H2) ctx.visit(K_CURRENT_VALUE_FOR).sql(' ').visit(sequence); else if (family == MARIADB) ctx.visit(K_PREVIOUS_VALUE_FOR).sql(' ').visit(sequence); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 9aab244f0d..25417117e2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -316,6 +316,7 @@ import org.jooq.conf.ThrowExceptions; import org.jooq.exception.DataAccessException; import org.jooq.exception.DataTypeException; import org.jooq.exception.DetachedException; +import org.jooq.exception.ExceptionTools; import org.jooq.exception.MappingException; import org.jooq.exception.NoDataFoundException; import org.jooq.exception.TemplatingException; @@ -5261,6 +5262,9 @@ final class Tools { + + + @@ -6659,4 +6663,23 @@ final class Tools { else return (int) value; } + + /** + * Used to work around bugs in JDBC drivers, e.g. + * https://github.com/h2database/h2database/issues/3236 + */ + static final T ignoreNPE(ThrowingSupplier supplier, Supplier ifNPE) throws E { + try { + return supplier.get(); + } + catch (NullPointerException e) { + return ifNPE.get(); + } + catch (Exception e) { + if (ExceptionTools.getCause(e, NullPointerException.class) != null) + return ifNPE.get(); + else + throw e; + } + } } diff --git a/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java b/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java index f304d03502..1e31ca2f8a 100644 --- a/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java +++ b/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java @@ -396,6 +396,8 @@ public class JDBCUtils { + + return H2; } diff --git a/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java b/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java index 64551bc331..54ab165b4f 100644 --- a/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java +++ b/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java @@ -102,6 +102,7 @@ public class H2DataType { public static final DataType NUMBER = new DefaultDataType<>(FAMILY, SQLDataType.NUMERIC, "number(p, s)"); public static final DataType NUMERIC = new DefaultDataType<>(FAMILY, SQLDataType.NUMERIC, "numeric(p, s)"); public static final DataType DOUBLE = new DefaultDataType<>(FAMILY, SQLDataType.DOUBLE, "double"); + public static final DataType DOUBLEPRECISION = new DefaultDataType<>(FAMILY, SQLDataType.DOUBLE, "double precision"); public static final DataType FLOAT = new DefaultDataType<>(FAMILY, SQLDataType.FLOAT, "float"); public static final DataType FLOAT4 = new DefaultDataType<>(FAMILY, SQLDataType.FLOAT, "float4"); public static final DataType FLOAT8 = new DefaultDataType<>(FAMILY, SQLDataType.FLOAT, "float8"); @@ -116,13 +117,17 @@ public class H2DataType { public static final DataType VARBINARY = new DefaultDataType<>(FAMILY, SQLDataType.VARBINARY, "varbinary(l)"); public static final DataType LONGVARBINARY = new DefaultDataType<>(FAMILY, SQLDataType.LONGVARBINARY, "longvarbinary(l)"); public static final DataType BLOB = new DefaultDataType<>(FAMILY, SQLDataType.BLOB, "blob"); + public static final DataType BINARYLARGEOBJECT = new DefaultDataType<>(FAMILY, SQLDataType.BLOB, "binary large object"); public static final DataType OTHER = new DefaultDataType<>(FAMILY, SQLDataType.OTHER, "other"); + public static final DataType JAVAOBJECT = new DefaultDataType<>(FAMILY, SQLDataType.OTHER, "java_object"); public static final DataType VARCHAR = new DefaultDataType<>(FAMILY, SQLDataType.VARCHAR, "varchar(l)"); public static final DataType VARCHAR2 = new DefaultDataType<>(FAMILY, SQLDataType.VARCHAR, "varchar2(l)"); + public static final DataType CHARACTERVARYING = new DefaultDataType<>(FAMILY, SQLDataType.VARCHAR, "character varying(l)"); public static final DataType CHAR = new DefaultDataType<>(FAMILY, SQLDataType.CHAR, "char(l)"); public static final DataType CHARACTER = new DefaultDataType<>(FAMILY, SQLDataType.CHAR, "character(l)"); public static final DataType LONGVARCHAR = new DefaultDataType<>(FAMILY, SQLDataType.LONGVARCHAR, "longvarchar(l)"); public static final DataType CLOB = new DefaultDataType<>(FAMILY, SQLDataType.CLOB, "clob"); + public static final DataType CHARACTERLARGEOBJECT = new DefaultDataType<>(FAMILY, SQLDataType.CLOB, "character large object"); public static final DataType NVARCHAR = new DefaultDataType<>(FAMILY, SQLDataType.NVARCHAR, "nvarchar(l)"); public static final DataType NVARCHAR2 = new DefaultDataType<>(FAMILY, SQLDataType.NVARCHAR, "nvarchar2(l)"); public static final DataType NCHAR = new DefaultDataType<>(FAMILY, SQLDataType.NCHAR, "nchar(l)"); @@ -162,7 +167,6 @@ public class H2DataType { public static final DataType MEDIUMBLOB = new DefaultDataType<>(FAMILY, SQLDataType.BLOB, "mediumblob"); public static final DataType LONGBLOB = new DefaultDataType<>(FAMILY, SQLDataType.BLOB, "longblob"); public static final DataType IMAGE = new DefaultDataType<>(FAMILY, SQLDataType.BLOB, "image"); - public static final DataType OID = new DefaultDataType<>(FAMILY, SQLDataType.BLOB, "oid"); public static final DataType VARCHAR_CASESENSITIVE = new DefaultDataType<>(FAMILY, SQLDataType.VARCHAR, "varchar_casesensitive(l)"); public static final DataType VARCHAR_IGNORECASE = new DefaultDataType<>(FAMILY, SQLDataType.VARCHAR, "varchar_ignorecase(l)"); public static final DataType UUID = new DefaultDataType<>(FAMILY, SQLDataType.UUID, "uuid"); diff --git a/pom.xml b/pom.xml index c52d1fc17f..c3184158f3 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ - 1.4.200 + 2.0.202 3.32.3.2 10.14.2.0 2.5.1