From 95a039952ed30802d124c53c8bfdeb06a54bd0e9 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 14 Feb 2024 11:52:56 +0100 Subject: [PATCH] [jOOQ/jOOQ#16289] Fetch comments using jOOQ-meta query The meta data isn't available from the JDBC driver yet, see: https://github.com/duckdb/duckdb/issues/10655 --- .../org/jooq/meta/duckdb/DuckDBDatabase.java | 42 ++++++++++++++++--- jOOQ/src/main/java/org/jooq/impl/MetaSQL.java | 1 + 2 files changed, 38 insertions(+), 5 deletions(-) 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 788cecdd65..077fa45600 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 @@ -42,7 +42,6 @@ import static java.util.Arrays.asList; import static java.util.stream.Collectors.toList; import static org.jooq.Records.mapping; import static org.jooq.SQLDialect.DUCKDB; -// ... import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.row; @@ -52,13 +51,13 @@ 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.duckdb.system.main.Tables.DUCKDB_COLUMNS; import static org.jooq.meta.duckdb.system.main.Tables.DUCKDB_CONSTRAINTS; import static org.jooq.meta.duckdb.system.main.Tables.DUCKDB_DATABASES; import static org.jooq.meta.duckdb.system.main.Tables.DUCKDB_SCHEMAS; import static org.jooq.meta.duckdb.system.main.Tables.DUCKDB_TABLES; import static org.jooq.meta.duckdb.system.main.Tables.DUCKDB_TYPES; import static org.jooq.meta.duckdb.system.main.Tables.DUCKDB_VIEWS; -// ... import java.math.BigDecimal; import java.sql.SQLException; @@ -74,9 +73,8 @@ import org.jooq.Record5; import org.jooq.Record6; import org.jooq.ResultQuery; import org.jooq.SQLDialect; +import org.jooq.Table; import org.jooq.TableOptions.TableType; -// ... -// ... import org.jooq.impl.DSL; import org.jooq.meta.AbstractDatabase; import org.jooq.meta.ArrayDefinition; @@ -235,7 +233,41 @@ public class DuckDBDatabase extends AbstractDatabase implements ResultQueryDatab @Override public ResultQuery> comments(List schemas) { - return null; + Table t = + select( + DUCKDB_TABLES.DATABASE_NAME, + DUCKDB_TABLES.SCHEMA_NAME, + DUCKDB_TABLES.TABLE_NAME, + inline(null, VARCHAR).as(DUCKDB_COLUMNS.COLUMN_NAME), + DUCKDB_TABLES.COMMENT) + .from("{0}()", DUCKDB_TABLES) + .unionAll( + select( + DUCKDB_VIEWS.DATABASE_NAME, + DUCKDB_VIEWS.SCHEMA_NAME, + DUCKDB_VIEWS.VIEW_NAME, + inline(null, VARCHAR).as(DUCKDB_COLUMNS.COLUMN_NAME), + DUCKDB_VIEWS.COMMENT) + .from("{0}()", DUCKDB_VIEWS)) + .unionAll( + select( + DUCKDB_COLUMNS.DATABASE_NAME, + DUCKDB_COLUMNS.SCHEMA_NAME, + DUCKDB_COLUMNS.TABLE_NAME, + DUCKDB_COLUMNS.COLUMN_NAME, + DUCKDB_COLUMNS.COMMENT) + .from("{0}()", DUCKDB_COLUMNS)) + .asTable(DUCKDB_TABLES); + + return create() + .select( + t.field(DUCKDB_TABLES.DATABASE_NAME), + t.field(DUCKDB_TABLES.SCHEMA_NAME), + t.field(DUCKDB_TABLES.TABLE_NAME), + t.field(DUCKDB_COLUMNS.COLUMN_NAME), + t.field(DUCKDB_TABLES.COMMENT)) + .from(t) + .where(t.field(DUCKDB_TABLES.SCHEMA_NAME).in(schemas)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java index 2bbdbde35d..2ccda8fa8a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java @@ -346,6 +346,7 @@ final class MetaSQL { + M_COMMENTS.put(DUCKDB, "select duckdb_tables.database_name, duckdb_tables.schema_name, duckdb_tables.table_name, duckdb_tables.column_name, duckdb_tables.comment from (select duckdb_tables.database_name, duckdb_tables.schema_name, duckdb_tables.table_name, null column_name, duckdb_tables.comment from duckdb_tables() union all select duckdb_views.database_name, duckdb_views.schema_name, duckdb_views.view_name, null column_name, duckdb_views.comment from duckdb_views() union all select duckdb_columns.database_name, duckdb_columns.schema_name, duckdb_columns.table_name, duckdb_columns.column_name, duckdb_columns.comment from duckdb_columns()) duckdb_tables where duckdb_tables.schema_name in (cast(? as varchar))"); 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");