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 63d20f80f6..d9e98a58a2 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 @@ -46,6 +46,7 @@ import static org.jooq.impl.DSL.noCondition; import static org.jooq.impl.DSL.nvl; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.when; +import static org.jooq.impl.SQLDataType.INTEGER; import static org.jooq.meta.hsqldb.information_schema.Tables.CHECK_CONSTRAINTS; import static org.jooq.meta.hsqldb.information_schema.Tables.COLUMNS; import static org.jooq.meta.hsqldb.information_schema.Tables.DOMAIN_CONSTRAINTS; @@ -69,12 +70,14 @@ import java.util.Map.Entry; import org.jooq.DSLContext; import org.jooq.Field; import org.jooq.Record; -import org.jooq.Record4; +import org.jooq.Record6; import org.jooq.Result; +import org.jooq.ResultQuery; import org.jooq.SQLDialect; import org.jooq.SortOrder; 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; @@ -91,6 +94,7 @@ import org.jooq.meta.EnumDefinition; import org.jooq.meta.IndexColumnDefinition; import org.jooq.meta.IndexDefinition; import org.jooq.meta.PackageDefinition; +import org.jooq.meta.ResultQueryDatabase; import org.jooq.meta.RoutineDefinition; import org.jooq.meta.SchemaDefinition; import org.jooq.meta.SequenceDefinition; @@ -108,7 +112,7 @@ import org.jooq.tools.StringUtils; * * @author Lukas Eder */ -public class HSQLDBDatabase extends AbstractDatabase { +public class HSQLDBDatabase extends AbstractDatabase implements ResultQueryDatabase { @Override protected DSLContext create0() { @@ -200,7 +204,7 @@ public class HSQLDBDatabase extends AbstractDatabase { @Override protected void loadPrimaryKeys(DefaultRelations relations) throws SQLException { - for (Record record : fetchKeys("PRIMARY KEY")) { + for (Record record : primaryKeys(getInputSchemata())) { SchemaDefinition schema = getSchema(record.get(KEY_COLUMN_USAGE.TABLE_SCHEMA)); String key = record.get(KEY_COLUMN_USAGE.CONSTRAINT_NAME); String tableName = record.get(KEY_COLUMN_USAGE.TABLE_NAME); @@ -214,7 +218,7 @@ public class HSQLDBDatabase extends AbstractDatabase { @Override protected void loadUniqueKeys(DefaultRelations relations) throws SQLException { - for (Record record : fetchKeys("UNIQUE")) { + for (Record record : uniqueKeys(getInputSchemata())) { SchemaDefinition schema = getSchema(record.get(KEY_COLUMN_USAGE.TABLE_SCHEMA)); String key = record.get(KEY_COLUMN_USAGE.CONSTRAINT_NAME); String tableName = record.get(KEY_COLUMN_USAGE.TABLE_NAME); @@ -226,22 +230,33 @@ public class HSQLDBDatabase extends AbstractDatabase { } } - private Result> fetchKeys(String constraintType) { + @Override + public ResultQuery> primaryKeys(List schemas) { + return keys(schemas, "PRIMARY KEY"); + } + + @Override + public ResultQuery> uniqueKeys(List schemas) { + return keys(schemas, "UNIQUE"); + } + + private ResultQuery> keys(List schemas, String constraintType) { return create() .select( + KEY_COLUMN_USAGE.TABLE_CATALOG, KEY_COLUMN_USAGE.TABLE_SCHEMA, - KEY_COLUMN_USAGE.CONSTRAINT_NAME, KEY_COLUMN_USAGE.TABLE_NAME, - KEY_COLUMN_USAGE.COLUMN_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.equal(constraintType)) - .and(KEY_COLUMN_USAGE.tableConstraints().TABLE_SCHEMA.in(getInputSchemata())) + .where(KEY_COLUMN_USAGE.tableConstraints().CONSTRAINT_TYPE.eq(inline(constraintType))) + .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()) - .fetch(); + KEY_COLUMN_USAGE.ORDINAL_POSITION.asc()); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index a6ea4edf74..fdb10a7126 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -133,6 +133,7 @@ final class MetaImpl extends AbstractMeta { private static final Pattern P_SYSINDEX_DERBY = Pattern.compile("^(?:SQL\\d{14,}).*$"); private static final Pattern P_SYSINDEX_H2 = Pattern.compile("^(?:PRIMARY_KEY_|UK_INDEX_|FK_INDEX_).*$"); + private static final Pattern P_SYSINDEX_HSQLDB = Pattern.compile("^(?:SYS_IDX_(?:PK|UK|FK)_).*$"); private final DatabaseMetaData databaseMetaData; private final boolean inverseSchemaCatalog; @@ -698,6 +699,9 @@ final class MetaImpl extends AbstractMeta { case H2: if (P_SYSINDEX_H2.matcher(indexName).matches()) it.remove(); break; + case HSQLDB: + if (P_SYSINDEX_HSQLDB.matcher(indexName).matches()) it.remove(); + break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java index d3b009a554..49b7253fab 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java @@ -12,6 +12,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(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"); M_UNIQUE_KEYS.put(POSTGRES, "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_99043051 on (information_schema.key_column_usage.constraint_catalog = alias_99043051.constraint_catalog and information_schema.key_column_usage.constraint_schema = alias_99043051.constraint_schema and information_schema.key_column_usage.constraint_name = alias_99043051.constraint_name)) where (alias_99043051.constraint_type = 'UNIQUE' and alias_99043051.table_schema in (?)) 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");