From 4941d75b59bb3328b2dd0cdf2a9a7e0c22c37db9 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 28 Feb 2023 16:30:04 +0100 Subject: [PATCH] [jOOQ/jOOQ#9818] Get view source code from org.jooq.Meta views --- .../java/org/jooq/meta/AbstractDatabase.java | 21 ++++- .../org/jooq/meta/ResultQueryDatabase.java | 28 ++++++ .../org/jooq/meta/derby/DerbyDatabase.java | 19 ++++ .../jooq/meta/firebird/FirebirdDatabase.java | 12 +++ .../java/org/jooq/meta/h2/H2Database.java | 20 +++- .../org/jooq/meta/hsqldb/HSQLDBDatabase.java | 17 ++++ .../org/jooq/meta/mysql/MySQLDatabase.java | 17 ++++ .../jooq/meta/postgres/PostgresDatabase.java | 17 ++++ .../org/jooq/meta/sqlite/SQLiteDatabase.java | 36 +++++++- .../src/main/java/org/jooq/impl/MetaImpl.java | 58 ++++++++++-- jOOQ/src/main/java/org/jooq/impl/MetaSQL.java | 91 +++++++++++++++++++ 11 files changed, 319 insertions(+), 17 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 508d3ad159..b178f9bcfd 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -75,6 +75,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Properties; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -91,7 +92,6 @@ import org.jooq.ExecuteContext; import org.jooq.ExecuteListener; import org.jooq.Field; import org.jooq.Log; -import org.jooq.Log.Level; import org.jooq.Meta; import org.jooq.MetaProvider; import org.jooq.Name; @@ -3631,7 +3631,24 @@ public abstract class AbstractDatabase implements Database { * Retrieve ALL source code from the database. */ protected Map getSources0() throws SQLException { - return new LinkedHashMap<>(); + Map result = new LinkedHashMap<>(); + + if (this instanceof ResultQueryDatabase d) { + Optional + .ofNullable(d.sources(getInputSchemata())) + .ifPresent(q -> q.forEach(r -> { + SchemaDefinition schema = getSchema(r.value2()); + + if (schema != null) { + Definition view = getTable(schema, r.value3()); + + if (view != null) + result.put(view, r.value4()); + } + })); + } + + return result; } /** 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 ca0851303b..a2f3df3a30 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/ResultQueryDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/ResultQueryDatabase.java @@ -42,9 +42,11 @@ import java.util.List; import org.jooq.Meta; import org.jooq.Record12; +import org.jooq.Record4; import org.jooq.Record6; import org.jooq.ResultQuery; +import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.ApiStatus.Internal; /** @@ -72,8 +74,11 @@ public interface ResultQueryDatabase extends Database { *
  • Column name
  • *
  • Column sequence
  • * + * + * @return The query or null if this implementation doesn't support the query. */ @Internal + @Nullable ResultQuery> primaryKeys(List schemas); /** @@ -89,8 +94,11 @@ public interface ResultQueryDatabase extends Database { *
  • Column name
  • *
  • Column sequence
  • * + * + * @return The query or null if this implementation doesn't support the query. */ @Internal + @Nullable ResultQuery> uniqueKeys(List schemas); /** @@ -111,7 +119,27 @@ public interface ResultQueryDatabase extends Database { *
  • Cycle
  • *
  • Cache
  • * + * + * @return The query or null if this implementation doesn't support the query. */ @Internal + @Nullable ResultQuery> sequences(List schemas); + + /** + * A query that produces source code 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. Source
    8. + *
    + * + * @return The query or null if this implementation doesn't support the query. + */ + @Internal + @Nullable + ResultQuery> sources(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 eefed0510f..f47a84e4ef 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 @@ -75,6 +75,7 @@ import org.jooq.DSLContext; 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; @@ -352,6 +353,24 @@ public class DerbyDatabase extends AbstractDatabase implements ResultQueryDataba .collect(mapping(r -> new SchemaDefinition(this, r.value1(), ""), toList())); } + @Override + public ResultQuery> sources(List schemas) { + return create() + .select( + inline(null, VARCHAR).cast(VARCHAR).as("catalog"), + SYSTABLES.sysschemas().SCHEMANAME, + SYSTABLES.TABLENAME, + SYSVIEWS.VIEWDEFINITION) + .from(SYSTABLES) + .leftJoin(SYSVIEWS) + .on(SYSTABLES.TABLEID.eq(SYSVIEWS.TABLEID)) + // [#6797] The cast is necessary if a non-standard collation is used + .where(SYSTABLES.sysschemas().SCHEMANAME.cast(VARCHAR(32672)).in(schemas)) + .orderBy( + SYSTABLES.sysschemas().SCHEMANAME, + SYSTABLES.TABLENAME); + } + @Override public ResultQuery> sequences(List schemas) { return create().select( 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 f9870b77ee..c406f13067 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 @@ -385,6 +385,18 @@ public class FirebirdDatabase extends AbstractDatabase implements ResultQueryDat return result; } + @Override + public ResultQuery> sources(List schemas) { + return create() + .select( + inline(null, VARCHAR).as("catalog"), + inline(null, VARCHAR).as("schema"), + RDB$RELATIONS.RDB$RELATION_NAME.trim(), + RDB$RELATIONS.RDB$VIEW_SOURCE.trim()) + .from(RDB$RELATIONS) + .orderBy(RDB$RELATIONS.RDB$RELATION_NAME.trim()); + } + @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 f3b0eef5dd..5bc1a84279 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 @@ -46,7 +46,6 @@ 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.exists; import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; @@ -54,7 +53,6 @@ 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.row; import static org.jooq.impl.DSL.select; @@ -88,7 +86,6 @@ import java.math.BigDecimal; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -140,7 +137,6 @@ 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.ElementTypes; 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; @@ -639,6 +635,22 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase .fetch(mapping((s, r) -> new SchemaDefinition(this, s, r))); } + @Override + public ResultQuery> sources(List schemas) { + return create() + .select( + VIEWS.TABLE_CATALOG, + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME, + VIEWS.VIEW_DEFINITION) + .from(VIEWS) + .where(VIEWS.TABLE_SCHEMA.in(schemas)) + .orderBy( + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME) + ; + } + @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 c6448b8c68..7b0be21232 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 @@ -77,6 +77,7 @@ import org.jooq.DSLContext; import org.jooq.Field; import org.jooq.Record; import org.jooq.Record12; +import org.jooq.Record4; import org.jooq.Record6; import org.jooq.Result; import org.jooq.ResultQuery; @@ -390,6 +391,22 @@ public class HSQLDBDatabase extends AbstractDatabase implements ResultQueryDatab .fetch(mapping(s -> new SchemaDefinition(this, s, ""))); } + @Override + public ResultQuery> sources(List schemas) { + return create() + .select( + VIEWS.TABLE_CATALOG, + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME, + VIEWS.VIEW_DEFINITION) + .from(VIEWS) + .where(VIEWS.TABLE_SCHEMA.in(schemas)) + .orderBy( + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME) + ; + } + @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 d79e871296..bc20d8f47d 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 @@ -78,6 +78,7 @@ import org.jooq.Field; // ... import org.jooq.Record; import org.jooq.Record12; +import org.jooq.Record4; import org.jooq.Record6; import org.jooq.Result; import org.jooq.ResultQuery; @@ -424,6 +425,22 @@ public class MySQLDatabase extends AbstractDatabase implements ResultQueryDataba .collect(mapping(r -> new SchemaDefinition(this, r.value1(), ""), toList())); } + @Override + public ResultQuery> sources(List schemas) { + return create() + .select( + VIEWS.TABLE_CATALOG, + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME, + VIEWS.VIEW_DEFINITION) + .from(VIEWS) + .where(VIEWS.TABLE_SCHEMA.in(schemas)) + .orderBy( + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME) + ; + } + @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 36dface874..529491f215 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 @@ -124,6 +124,7 @@ import org.jooq.Name; 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.Record8; @@ -652,6 +653,22 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat .collect(mapping(r -> new SchemaDefinition(this, r.value1(), ""), toList())); } + @Override + public ResultQuery> sources(List schemas) { + return create() + .select( + VIEWS.TABLE_CATALOG, + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME, + VIEWS.VIEW_DEFINITION) + .from(VIEWS) + .where(VIEWS.TABLE_SCHEMA.in(schemas)) + .orderBy( + VIEWS.TABLE_SCHEMA, + VIEWS.TABLE_NAME) + ; + } + @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 df831d9cf5..4d7dc53c43 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 @@ -56,6 +56,7 @@ import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.meta.sqlite.sqlite_master.SQLiteMaster.SQLITE_MASTER; import static org.jooq.tools.StringUtils.isBlank; +import java.math.BigDecimal; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; @@ -72,7 +73,11 @@ import org.jooq.Meta; import org.jooq.Query; import org.jooq.Record; import org.jooq.Record1; +import org.jooq.Record12; +import org.jooq.Record4; +import org.jooq.Record6; import org.jooq.Result; +import org.jooq.ResultQuery; import org.jooq.SQLDialect; import org.jooq.Select; import org.jooq.SelectConditionStep; @@ -98,6 +103,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; @@ -110,13 +116,14 @@ import org.jooq.tools.JooqLogger; import org.jooq.tools.StringUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * SQLite implementation of {@link AbstractDatabase} * * @author Lukas Eder */ -public class SQLiteDatabase extends AbstractDatabase { +public class SQLiteDatabase extends AbstractDatabase implements ResultQueryDatabase { private static final JooqLogger log = JooqLogger.getLogger(SQLiteDatabase.class); @@ -374,6 +381,33 @@ public class SQLiteDatabase extends AbstractDatabase { return result; } + @Override + public ResultQuery> sources(List schemas) { + return create() + .select( + inline(null, VARCHAR).as("catalog"), + inline(null, VARCHAR).as("schema"), + SQLiteMaster.NAME, + SQLiteMaster.SQL) + .from(SQLITE_MASTER) + .orderBy(SQLiteMaster.NAME); + } + + @Override + public ResultQuery> sequences(List schemas) { + return null; + } + + @Override + public ResultQuery> primaryKeys(List schemas) { + return null; + } + + @Override + public ResultQuery> uniqueKeys(List schemas) { + return null; + } + @Override protected List getTables0() throws SQLException { List result = new ArrayList<>(); diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index 28bba6e298..d309cb0e02 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -65,18 +65,16 @@ import static org.jooq.impl.AbstractNamed.findIgnoreCase; import static org.jooq.impl.DSL.comment; 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.unquotedName; import static org.jooq.impl.MetaSQL.M_SEQUENCES; import static org.jooq.impl.MetaSQL.M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES; +import static org.jooq.impl.MetaSQL.M_SOURCES; import static org.jooq.impl.MetaSQL.M_UNIQUE_KEYS; import static org.jooq.impl.SQLDataType.INTEGER; 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; @@ -87,7 +85,6 @@ 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; @@ -101,6 +98,7 @@ import org.jooq.Catalog; import org.jooq.Condition; import org.jooq.Configuration; import org.jooq.ConstraintEnforcementStep; +import org.jooq.DSLContext; import org.jooq.DataType; import org.jooq.Field; import org.jooq.ForeignKey; @@ -125,10 +123,8 @@ import org.jooq.exception.DataAccessException; import org.jooq.exception.DataDefinitionException; import org.jooq.exception.DataTypeException; 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. @@ -342,6 +338,7 @@ final class MetaImpl extends AbstractMeta { private transient volatile Map> columnCache; private transient volatile Map> ukCache; private transient volatile Map> sequenceCache; + private transient volatile Map sourceCache; MetaSchema(String name, Catalog catalog) { super(name, catalog); @@ -497,7 +494,7 @@ final class MetaImpl extends AbstractMeta { } } - private void initUksSQLite(String catalog, String schema) { + private final void initUksSQLite(String catalog, String schema) { ukCache = new LinkedHashMap<>(); dsl().resultQuery( @@ -628,7 +625,9 @@ final class MetaImpl extends AbstractMeta { Map> groups = result.intoGroups(new Field[] { result.field(0), result.field(1) }); sequenceCache = new LinkedHashMap<>(); - groups.forEach((k, v) -> sequenceCache.put(name(k.get(0, String.class), k.get(1, String.class)), v)); + groups.forEach((k, v) -> sequenceCache.put( + name(k.get(0, String.class), k.get(1, String.class)), v + )); } } @@ -637,6 +636,34 @@ final class MetaImpl extends AbstractMeta { else return null; } + + final String source(String tableName) { + if (sourceCache == null) { + String sql = M_SOURCES(family()); + + if (sql != null) { + Result result = meta(meta -> DSL.using(meta.getConnection(), family()).resultQuery(sql, MetaSchema.this.getName()).fetch()); + + // TODO Support catalogs as well + Map> groups = result.intoGroups(new Field[] { result.field(0), result.field(1), result.field(2) }); + sourceCache = new LinkedHashMap<>(); + + groups.forEach((k, v) -> sourceCache.put( + name(k.get(1, String.class), k.get(2, String.class)), + Tools.apply(v.get(0).get(3, String.class), s -> + s.toLowerCase().startsWith("create") + ? s + : "create view " + dsl().render(name(k.get(2, String.class))) + " as " + s + ) + )); + } + } + + if (sourceCache != null) + return sourceCache.get(name(MetaSchema.this.getName(), tableName)); + else + return null; + } } // Columns available from JDBC 3.0+ @@ -689,11 +716,22 @@ final class MetaImpl extends AbstractMeta { String.class // IS_AUTOINCREMENT }; + private static final TableOptions tableOption(DSLContext ctx, MetaSchema schema, String tableName, TableType tableType) { + if (tableType == TableType.VIEW) { + String sql = M_SOURCES(ctx.dialect()); + + if (sql != null) + return TableOptions.view(schema.source(tableName)); + } + + return TableOptions.of(tableType); + } + private final class MetaTable extends TableImpl { private final Result uks; - MetaTable(String name, Schema schema, Result columns, Result uks, String remarks, TableType tableType) { - super(name(name), schema, null, null, null, null, comment(remarks), TableOptions.of(tableType)); + MetaTable(String name, MetaSchema schema, Result columns, Result uks, String remarks, TableType tableType) { + super(name(name), schema, null, null, null, null, comment(remarks), tableOption(dsl(), schema, name, tableType)); // Possible scenarios for columns being null: // - The "table" is in fact a SYNONYM diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java index eba3311e43..ad34a1bce4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaSQL.java @@ -11,6 +11,7 @@ final class MetaSQL { private static final EnumMap M_UNIQUE_KEYS = new EnumMap<>(SQLDialect.class); 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); static final String M_UNIQUE_KEYS(SQLDialect dialect) { String result = M_UNIQUE_KEYS.get(dialect); @@ -27,6 +28,11 @@ final class MetaSQL { return result != null ? result : M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES.get(dialect.family()); } + static final String M_SOURCES(SQLDialect dialect) { + String result = M_SOURCES.get(dialect); + return result != null ? result : M_SOURCES.get(dialect.family()); + } + 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"); @@ -90,6 +96,10 @@ final class MetaSQL { + + + + @@ -173,6 +183,87 @@ final class MetaSQL { + + + + + + + + + + + + + + + + + + + + + + + M_SOURCES.put(DERBY, "select cast(null as varchar(32672)) as catalog, alias_57844683.SCHEMANAME, SYS.SYSTABLES.TABLENAME, SYS.SYSVIEWS.VIEWDEFINITION from (SYS.SYSTABLES join SYS.SYSSCHEMAS as alias_57844683 on SYS.SYSTABLES.SCHEMAID = alias_57844683.SCHEMAID) left outer join SYS.SYSVIEWS on SYS.SYSTABLES.TABLEID = SYS.SYSVIEWS.TABLEID where cast(alias_57844683.SCHEMANAME as varchar(32672)) in (cast(? as varchar(32672))) order by alias_57844683.SCHEMANAME, SYS.SYSTABLES.TABLENAME"); + M_SOURCES.put(FIREBIRD, "select null catalog, null schema, trim(RDB$RELATIONS.RDB$RELATION_NAME), trim(RDB$RELATIONS.RDB$VIEW_SOURCE) from RDB$RELATIONS order by trim(RDB$RELATIONS.RDB$RELATION_NAME)"); + M_SOURCES.put(H2, "select INFORMATION_SCHEMA.VIEWS.TABLE_CATALOG, INFORMATION_SCHEMA.VIEWS.TABLE_SCHEMA, INFORMATION_SCHEMA.VIEWS.TABLE_NAME, INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION from INFORMATION_SCHEMA.VIEWS where INFORMATION_SCHEMA.VIEWS.TABLE_SCHEMA in (cast(? as varchar)) order by INFORMATION_SCHEMA.VIEWS.TABLE_SCHEMA, INFORMATION_SCHEMA.VIEWS.TABLE_NAME"); + M_SOURCES.put(HSQLDB, "select INFORMATION_SCHEMA.VIEWS.TABLE_CATALOG, INFORMATION_SCHEMA.VIEWS.TABLE_SCHEMA, INFORMATION_SCHEMA.VIEWS.TABLE_NAME, INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION from INFORMATION_SCHEMA.VIEWS where INFORMATION_SCHEMA.VIEWS.TABLE_SCHEMA in (cast(? as varchar(128))) order by INFORMATION_SCHEMA.VIEWS.TABLE_SCHEMA, INFORMATION_SCHEMA.VIEWS.TABLE_NAME"); + M_SOURCES.put(MARIADB, "select information_schema.VIEWS.TABLE_CATALOG, information_schema.VIEWS.TABLE_SCHEMA, information_schema.VIEWS.TABLE_NAME, information_schema.VIEWS.VIEW_DEFINITION from information_schema.VIEWS where information_schema.VIEWS.TABLE_SCHEMA in (?) order by information_schema.VIEWS.TABLE_SCHEMA, information_schema.VIEWS.TABLE_NAME"); + M_SOURCES.put(MYSQL, "select information_schema.VIEWS.TABLE_CATALOG, information_schema.VIEWS.TABLE_SCHEMA, information_schema.VIEWS.TABLE_NAME, information_schema.VIEWS.VIEW_DEFINITION from information_schema.VIEWS where information_schema.VIEWS.TABLE_SCHEMA in (?) order by information_schema.VIEWS.TABLE_SCHEMA, information_schema.VIEWS.TABLE_NAME"); + M_SOURCES.put(POSTGRES, "select information_schema.views.table_catalog, information_schema.views.table_schema, information_schema.views.table_name, information_schema.views.view_definition from information_schema.views where information_schema.views.table_schema in (?) order by information_schema.views.table_schema, information_schema.views.table_name"); + M_SOURCES.put(SQLITE, "select null as catalog, null as schema, sqlite_master.name, sqlite_master.sql from sqlite_master order by sqlite_master.name"); + M_SOURCES.put(YUGABYTEDB, "select information_schema.views.table_catalog, information_schema.views.table_schema, information_schema.views.table_name, information_schema.views.view_definition from information_schema.views where information_schema.views.table_schema in (?) order by information_schema.views.table_schema, information_schema.views.table_name"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +