From c5b498817bb84f6fd06c024a1cbba921abb78ccb Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 5 Sep 2023 09:25:53 +0200 Subject: [PATCH] [jOOQ/jOOQ#15546] Add Database.getComments(): Map Added API and implementations for: - Db2 - Firebird - H2 - HSQLDB - Oracle More will follow --- .../java/org/jooq/meta/AbstractDatabase.java | 47 +++++++++++++++- .../org/jooq/meta/AbstractDefinition.java | 5 ++ .../src/main/java/org/jooq/meta/Database.java | 5 ++ .../org/jooq/meta/ResultQueryDatabase.java | 21 +++++++- .../org/jooq/meta/derby/DerbyDatabase.java | 17 +++--- .../org/jooq/meta/duckdb/DuckDBDatabase.java | 6 +++ .../jooq/meta/firebird/FirebirdDatabase.java | 35 ++++++++++++ .../java/org/jooq/meta/h2/H2Database.java | 35 ++++++++++++ .../org/jooq/meta/hsqldb/HSQLDBDatabase.java | 53 ++++++++++++++++--- .../org/jooq/meta/mysql/MySQLDatabase.java | 7 ++- .../jooq/meta/postgres/PostgresDatabase.java | 5 ++ .../org/jooq/meta/sqlite/SQLiteDatabase.java | 6 +++ .../org/jooq/meta/trino/TrinoDatabase.java | 9 ++-- jOOQ/src/main/java/org/jooq/impl/MetaSQL.java | 32 +++++++++++ 14 files changed, 263 insertions(+), 20 deletions(-) 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 0632776268..9e422a459d 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -64,6 +64,7 @@ import static org.jooq.tools.StringUtils.defaultIfBlank; import static org.jooq.tools.StringUtils.defaultIfEmpty; import static org.jooq.tools.StringUtils.defaultIfNull; import static org.jooq.tools.StringUtils.isBlank; +import static org.jooq.tools.StringUtils.isEmpty; import java.io.File; import java.io.IOException; @@ -274,6 +275,7 @@ public abstract class AbstractDatabase implements Database { // ------------------------------------------------------------------------- private Map sources; + private Map comments; private List inputCatalogs; private List inputSchemata; private Map> inputSchemataPerCatalog; @@ -712,7 +714,20 @@ public abstract class AbstractDatabase implements Database { sources = new LinkedHashMap<>(); onError(ERROR, "Could not load sources", () -> { sources = getSources0(); - log.info("Sequences fetched", fetchedSize(sources.values(), sources.values())); + log.info("Sources fetched", fetchedSize(sources.values(), sources.values())); + }); + } + + return sources; + } + + @Override + public final Map getComments() { + if (comments == null) { + comments = new LinkedHashMap<>(); + onError(ERROR, "Could not load comments", () -> { + comments = getComments0(); + log.info("Comments fetched", fetchedSize(comments.values(), comments.values())); }); } @@ -3952,6 +3967,36 @@ public abstract class AbstractDatabase implements Database { return result; } + /** + * Retrieve ALL comments from the database. + */ + protected Map getComments0() throws SQLException { + Map result = new LinkedHashMap<>(); + + if (this instanceof ResultQueryDatabase d) { + Optional + .ofNullable(d.comments(getInputSchemata())) + .ifPresent(q -> q.forEach(r -> { + SchemaDefinition schema = getSchema(r.value2()); + + if (schema != null) { + String name = r.value3(); + Definition o = getTable(schema, name); + + if (o != null) { + if (!isEmpty(r.value4())) + if (o instanceof TableDefinition t) + o = t.getColumn(r.value4()); + + result.put(o, r.value5()); + } + } + })); + } + + return result; + } + /** * Retrieve ALL indexes from the database */ diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java index 1a87035a69..efb0957ff3 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java @@ -161,6 +161,11 @@ public abstract class AbstractDefinition implements Definition { @Override public final String getComment() { + String c = getComment0(); + return c != null ? c : getDatabase().getComments().get(this); + } + + private final String getComment0() { diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java index 2c6e1d2970..f824eba08e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java @@ -84,6 +84,11 @@ public interface Database extends AutoCloseable { */ Map getSources(); + /** + * Get the comments for all objects that offer comments. + */ + Map getComments(); + /** * The catalogs generated from this database. */ diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/ResultQueryDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/ResultQueryDatabase.java index a2f3df3a30..0ce0795378 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/ResultQueryDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/ResultQueryDatabase.java @@ -43,11 +43,12 @@ import java.util.List; import org.jooq.Meta; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.ResultQuery; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.ApiStatus.Internal; +import org.jetbrains.annotations.Nullable; /** * An interface for all {@link AbstractDatabase} implementations that can @@ -142,4 +143,22 @@ public interface ResultQueryDatabase extends Database { @Internal @Nullable ResultQuery> sources(List schemas); + + /** + * A query that produces comments for a set of input schemas. + *

+ * The resulting columns are: + *

    + *
  1. Catalog name
  2. + *
  3. Schema name
  4. + *
  5. Object name (e.g. table, view, function, package)
  6. + *
  7. Object sub name (e.g. column, package routine)
  8. + *
  9. Comment
  10. + *
+ * + * @return The query or null if this implementation doesn't support the query. + */ + @Internal + @Nullable + ResultQuery> comments(List schemas); } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/derby/DerbyDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/derby/DerbyDatabase.java index 3b8ae4fcf4..b424f64b99 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/derby/DerbyDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/derby/DerbyDatabase.java @@ -49,20 +49,19 @@ import static org.jooq.impl.DSL.inline; 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.one; import static org.jooq.impl.DSL.when; import static org.jooq.impl.SQLDataType.BIGINT; -import static org.jooq.impl.SQLDataType.BOOLEAN; import static org.jooq.impl.SQLDataType.INTEGER; import static org.jooq.impl.SQLDataType.NUMERIC; import static org.jooq.impl.SQLDataType.VARCHAR; -import static org.jooq.meta.derby.sys.Tables.*; +import static org.jooq.meta.derby.sys.Tables.SYSCHECKS; import static org.jooq.meta.derby.sys.Tables.SYSCONGLOMERATES; import static org.jooq.meta.derby.sys.Tables.SYSCONSTRAINTS; import static org.jooq.meta.derby.sys.Tables.SYSKEYS; import static org.jooq.meta.derby.sys.Tables.SYSSCHEMAS; import static org.jooq.meta.derby.sys.Tables.SYSSEQUENCES; import static org.jooq.meta.derby.sys.Tables.SYSTABLES; +import static org.jooq.meta.derby.sys.Tables.SYSTRIGGERS; import static org.jooq.meta.derby.sys.Tables.SYSVIEWS; import java.math.BigDecimal; @@ -84,12 +83,11 @@ 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; @@ -380,6 +378,11 @@ public class DerbyDatabase extends AbstractDatabase implements ResultQueryDataba SYSTABLES.TABLENAME); } + @Override + public ResultQuery> comments(List schemas) { + return null; + } + @Override public ResultQuery> sequences(List schemas) { return create().select( diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/duckdb/DuckDBDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/duckdb/DuckDBDatabase.java index f5ad4d6151..658ca3f2ff 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/duckdb/DuckDBDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/duckdb/DuckDBDatabase.java @@ -64,6 +64,7 @@ import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.ResultQuery; import org.jooq.SQLDialect; @@ -213,6 +214,11 @@ public class DuckDBDatabase extends AbstractDatabase implements ResultQueryDatab .where(DUCKDB_VIEWS.SCHEMA_NAME.in(schemas)); } + @Override + public ResultQuery> comments(List schemas) { + return null; + } + @Override public ResultQuery> sequences(List schemas) { return create() diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java index 607723f035..ee400dd20b 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java @@ -94,11 +94,13 @@ import org.jooq.Field; import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.Result; import org.jooq.ResultQuery; import org.jooq.SQLDialect; import org.jooq.SortOrder; +import org.jooq.Table; import org.jooq.TableOptions.TableType; // ... // ... @@ -407,6 +409,39 @@ public class FirebirdDatabase extends AbstractDatabase implements ResultQueryDat .orderBy(trim(RDB$RELATIONS.RDB$RELATION_NAME)); } + @Override + public ResultQuery> comments(List schemas) { + Table c = + select( + inline(null, VARCHAR).as("catalog"), + inline(null, VARCHAR).as("schema"), + trim(RDB$RELATIONS.RDB$RELATION_NAME).as(RDB$RELATIONS.RDB$RELATION_NAME), + inline(null, VARCHAR).as(RDB$RELATION_FIELDS.RDB$FIELD_NAME), + trim(RDB$RELATIONS.RDB$DESCRIPTION).as(RDB$RELATIONS.RDB$DESCRIPTION)) + .from(RDB$RELATIONS) + .where(RDB$RELATIONS.RDB$DESCRIPTION.isNotNull()) + .unionAll( + select( + inline(null, VARCHAR), + inline(null, VARCHAR), + RDB$RELATION_FIELDS.RDB$RELATION_NAME, + RDB$RELATION_FIELDS.RDB$FIELD_NAME, + RDB$RELATION_FIELDS.RDB$DESCRIPTION) + .from(RDB$RELATION_FIELDS) + .where(RDB$RELATION_FIELDS.RDB$DESCRIPTION.isNotNull())) + .asTable("c"); + + return create() + .select( + c.field("catalog", VARCHAR), + c.field("schema", VARCHAR), + c.field(RDB$RELATIONS.RDB$RELATION_NAME), + c.field(RDB$RELATION_FIELDS.RDB$FIELD_NAME), + c.field(RDB$RELATIONS.RDB$DESCRIPTION)) + .from(c) + .orderBy(1, 2, 3); + } + @Override public ResultQuery> sequences(List schemas) { return create() 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 01d6e10ac3..cc026c7e20 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 @@ -96,6 +96,7 @@ import org.jooq.Field; import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.Result; import org.jooq.ResultQuery; @@ -652,6 +653,40 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase ; } + @Override + public ResultQuery> comments(List schemas) { + Table c = + select( + TABLES.TABLE_CATALOG, + TABLES.TABLE_SCHEMA, + TABLES.TABLE_NAME, + inline(null, VARCHAR).as(COLUMNS.COLUMN_NAME), + TABLES.REMARKS) + .from(TABLES) + .where(TABLES.REMARKS.isNotNull()) + .unionAll( + select( + COLUMNS.TABLE_CATALOG, + COLUMNS.TABLE_SCHEMA, + COLUMNS.TABLE_NAME, + COLUMNS.COLUMN_NAME, + COLUMNS.REMARKS) + .from(COLUMNS) + .where(COLUMNS.REMARKS.isNotNull())) + .asTable("c"); + + return create() + .select( + c.field(TABLES.TABLE_CATALOG), + c.field(TABLES.TABLE_SCHEMA), + c.field(TABLES.TABLE_NAME), + c.field(COLUMNS.COLUMN_NAME), + c.field(TABLES.REMARKS)) + .from(c) + .where(c.field(TABLES.TABLE_SCHEMA).in(schemas)) + .orderBy(1, 2, 3, 4); + } + @Override public ResultQuery> sequences(List schemas) { Field minValue = is2_0_202() 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 0ba7506a85..26cb2b2d54 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 @@ -62,39 +62,39 @@ import static org.jooq.meta.hsqldb.information_schema.Tables.REFERENTIAL_CONSTRA import static org.jooq.meta.hsqldb.information_schema.Tables.ROUTINES; import static org.jooq.meta.hsqldb.information_schema.Tables.SCHEMATA; import static org.jooq.meta.hsqldb.information_schema.Tables.SEQUENCES; +import static org.jooq.meta.hsqldb.information_schema.Tables.SYSTEM_COLUMNS; import static org.jooq.meta.hsqldb.information_schema.Tables.SYSTEM_INDEXINFO; import static org.jooq.meta.hsqldb.information_schema.Tables.SYSTEM_TABLES; import static org.jooq.meta.hsqldb.information_schema.Tables.TABLE_CONSTRAINTS; -import static org.jooq.meta.hsqldb.information_schema.Tables.VIEWS; import static org.jooq.meta.hsqldb.information_schema.Tables.TRIGGERS; +import static org.jooq.meta.hsqldb.information_schema.Tables.VIEWS; import static org.jooq.tools.StringUtils.defaultIfNull; import java.math.BigDecimal; import java.sql.SQLException; import java.util.ArrayList; import java.util.EnumSet; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.jooq.DSLContext; import org.jooq.Field; -import org.jooq.Name; import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.Result; import org.jooq.ResultQuery; import org.jooq.SQLDialect; import org.jooq.SortOrder; -// ... -// ... -// ... +import org.jooq.Table; 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; @@ -419,6 +419,45 @@ public class HSQLDBDatabase extends AbstractDatabase implements ResultQueryDatab ; } + @Override + public ResultQuery> comments(List schemas) { + Table c = + select( + SYSTEM_TABLES.TABLE_CAT, + SYSTEM_TABLES.TABLE_SCHEM, + SYSTEM_TABLES.TABLE_NAME, + inline(null, VARCHAR).as(COLUMNS.COLUMN_NAME), + SYSTEM_TABLES.REMARKS) + .from(SYSTEM_TABLES) + .where(SYSTEM_TABLES.REMARKS.isNotNull()) + .unionAll( + select( + COLUMNS.TABLE_CATALOG, + COLUMNS.TABLE_SCHEMA, + COLUMNS.TABLE_NAME, + COLUMNS.COLUMN_NAME, + SYSTEM_COLUMNS.REMARKS) + .from(COLUMNS) + .join(SYSTEM_COLUMNS) + .on(COLUMNS.TABLE_CATALOG.eq(SYSTEM_COLUMNS.TABLE_CAT)) + .and(COLUMNS.TABLE_SCHEMA.eq(SYSTEM_COLUMNS.TABLE_SCHEM)) + .and(COLUMNS.TABLE_NAME.eq(SYSTEM_COLUMNS.TABLE_NAME)) + .and(COLUMNS.COLUMN_NAME.eq(SYSTEM_COLUMNS.COLUMN_NAME)) + .where(SYSTEM_COLUMNS.REMARKS.isNotNull())) + .asTable("c"); + + return create() + .select( + c.field(SYSTEM_TABLES.TABLE_CAT), + c.field(SYSTEM_TABLES.TABLE_SCHEM), + c.field(SYSTEM_TABLES.TABLE_NAME), + c.field(COLUMNS.COLUMN_NAME), + c.field(SYSTEM_TABLES.REMARKS)) + .from(c) + .where(c.field(SYSTEM_TABLES.TABLE_SCHEM).in(schemas)) + .orderBy(1, 2, 3, 4); + } + @Override public ResultQuery> sequences(List schemas) { return create() diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java index 9f9435902d..0c9cc634e0 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java @@ -84,6 +84,7 @@ import org.jooq.Field; import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.Result; import org.jooq.ResultQuery; @@ -96,7 +97,6 @@ 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; @@ -453,6 +453,11 @@ public class MySQLDatabase extends AbstractDatabase implements ResultQueryDataba ; } + @Override + public ResultQuery> comments(List schemas) { + return null; + } + @Override public ResultQuery> sequences(List schemas) { return null; diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java index 2253378159..37ae242f59 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java @@ -676,6 +676,11 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat ; } + @Override + public ResultQuery> comments(List schemas) { + return null; + } + @Override public ResultQuery> sequences(List schemas) { CommonTableExpression> s = name("schemas").fields("schema").as(selectFrom(values(schemas.stream().collect(toRowArray(DSL::val))))); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java index 6f253d7235..b99f276973 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteDatabase.java @@ -74,6 +74,7 @@ import org.jooq.Record; import org.jooq.Record1; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.Result; import org.jooq.ResultQuery; @@ -391,6 +392,11 @@ public class SQLiteDatabase extends AbstractDatabase implements ResultQueryDatab .orderBy(SQLiteMaster.NAME); } + @Override + public ResultQuery> comments(List schemas) { + return null; + } + @Override public ResultQuery> sequences(List schemas) { return null; diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/trino/TrinoDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/trino/TrinoDatabase.java index 7d34bfd78f..b96ce428b8 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/trino/TrinoDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/trino/TrinoDatabase.java @@ -54,6 +54,7 @@ import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record4; +import org.jooq.Record5; import org.jooq.Record6; import org.jooq.ResultQuery; import org.jooq.SQLDialect; @@ -74,9 +75,6 @@ import org.jooq.meta.TableDefinition; // ... import org.jooq.meta.UDTDefinition; import org.jooq.meta.XMLSchemaCollectionDefinition; -import org.jooq.meta.hsqldb.HSQLDBDatabase; - -import org.jetbrains.annotations.Nullable; /** * The Trino database @@ -166,6 +164,11 @@ public class TrinoDatabase extends AbstractDatabase implements ResultQueryDataba VIEWS.TABLE_NAME); } + @Override + public ResultQuery> comments(List schemas) { + return null; + } + @Override protected List getDomains0() throws SQLException { return new ArrayList<>(); diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java index 34baf53790..d9af15eede 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 { private static final EnumMap M_SEQUENCES = new EnumMap<>(SQLDialect.class); private static final EnumMap M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES = new EnumMap<>(SQLDialect.class); private static final EnumMap M_SOURCES = new EnumMap<>(SQLDialect.class); + private static final EnumMap M_COMMENTS = new EnumMap<>(SQLDialect.class); static final String M_UNIQUE_KEYS(SQLDialect dialect) { String result = M_UNIQUE_KEYS.get(dialect); @@ -33,6 +34,11 @@ final class MetaSQL { return result != null ? result : M_SOURCES.get(dialect.family()); } + static final String M_COMMENTS(SQLDialect dialect) { + String result = M_COMMENTS.get(dialect); + return result != null ? result : M_COMMENTS.get(dialect.family()); + } + static { M_UNIQUE_KEYS.put(DUCKDB, "select duckdb_constraints.database_name, duckdb_constraints.schema_name, duckdb_constraints.table_name, ((((((duckdb_constraints.database_name || '__') || duckdb_constraints.schema_name) || '__') || duckdb_constraints.table_name) || '__') || duckdb_constraints.constraint_text) constraint_text, unnest(duckdb_constraints.constraint_column_names) constraint_column_names, unnest(duckdb_constraints.constraint_column_indexes) constraint_column_indexes from duckdb_constraints() where (duckdb_constraints.constraint_type = 'UNIQUE' and duckdb_constraints.schema_name in (cast(? as varchar)))"); @@ -282,6 +288,32 @@ final class MetaSQL { + + + + + + + + + + + + + + + + + + + + + + + M_COMMENTS.put(FIREBIRD, "select c.catalog, c.schema, c.RDB$RELATION_NAME, c.RDB$FIELD_NAME, c.RDB$DESCRIPTION from (select null catalog, null schema, trim(RDB$RELATIONS.RDB$RELATION_NAME) RDB$RELATION_NAME, null RDB$FIELD_NAME, trim(RDB$RELATIONS.RDB$DESCRIPTION) RDB$DESCRIPTION from RDB$RELATIONS where RDB$RELATIONS.RDB$DESCRIPTION is not null union all select null, null, RDB$RELATION_FIELDS.RDB$RELATION_NAME, RDB$RELATION_FIELDS.RDB$FIELD_NAME, RDB$RELATION_FIELDS.RDB$DESCRIPTION from RDB$RELATION_FIELDS where RDB$RELATION_FIELDS.RDB$DESCRIPTION is not null) c order by 1, 2, 3"); + M_COMMENTS.put(H2, "select c.TABLE_CATALOG, c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.REMARKS from (select INFORMATION_SCHEMA.TABLES.TABLE_CATALOG, INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA, INFORMATION_SCHEMA.TABLES.TABLE_NAME, null COLUMN_NAME, INFORMATION_SCHEMA.TABLES.REMARKS from INFORMATION_SCHEMA.TABLES where INFORMATION_SCHEMA.TABLES.REMARKS is not null union all select INFORMATION_SCHEMA.COLUMNS.TABLE_CATALOG, INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA, INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, INFORMATION_SCHEMA.COLUMNS.REMARKS from INFORMATION_SCHEMA.COLUMNS where INFORMATION_SCHEMA.COLUMNS.REMARKS is not null) c where c.TABLE_SCHEMA in (cast(? as varchar)) order by 1, 2, 3, 4"); + M_COMMENTS.put(HSQLDB, "select c.TABLE_CAT, c.TABLE_SCHEM, c.TABLE_NAME, c.COLUMN_NAME, c.REMARKS from (select INFORMATION_SCHEMA.SYSTEM_TABLES.TABLE_CAT, INFORMATION_SCHEMA.SYSTEM_TABLES.TABLE_SCHEM, INFORMATION_SCHEMA.SYSTEM_TABLES.TABLE_NAME, null as COLUMN_NAME, INFORMATION_SCHEMA.SYSTEM_TABLES.REMARKS from INFORMATION_SCHEMA.SYSTEM_TABLES where INFORMATION_SCHEMA.SYSTEM_TABLES.REMARKS is not null union all select INFORMATION_SCHEMA.COLUMNS.TABLE_CATALOG, INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA, INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, INFORMATION_SCHEMA.SYSTEM_COLUMNS.REMARKS from INFORMATION_SCHEMA.COLUMNS join INFORMATION_SCHEMA.SYSTEM_COLUMNS on (INFORMATION_SCHEMA.COLUMNS.TABLE_CATALOG = INFORMATION_SCHEMA.SYSTEM_COLUMNS.TABLE_CAT and INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = INFORMATION_SCHEMA.SYSTEM_COLUMNS.TABLE_SCHEM and INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = INFORMATION_SCHEMA.SYSTEM_COLUMNS.TABLE_NAME and INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = INFORMATION_SCHEMA.SYSTEM_COLUMNS.COLUMN_NAME) where INFORMATION_SCHEMA.SYSTEM_COLUMNS.REMARKS is not null) as c where c.TABLE_SCHEM in (cast(? as varchar(128))) order by 1, 2, 3, 4"); +