[jOOQ/jOOQ#15546] Add Database.getComments(): Map<Definition, String>

Added API and implementations for:

- Db2
- Firebird
- H2
- HSQLDB
- Oracle

More will follow
This commit is contained in:
Lukas Eder 2023-09-05 09:25:53 +02:00
parent 9f588ae05f
commit c5b498817b
14 changed files with 263 additions and 20 deletions

View File

@ -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<Definition, String> sources;
private Map<Definition, String> comments;
private List<String> inputCatalogs;
private List<String> inputSchemata;
private Map<String, List<String>> 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<Definition, String> 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<Definition, String> getComments0() throws SQLException {
Map<Definition, String> 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
*/

View File

@ -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() {

View File

@ -84,6 +84,11 @@ public interface Database extends AutoCloseable {
*/
Map<Definition, String> getSources();
/**
* Get the comments for all objects that offer comments.
*/
Map<Definition, String> getComments();
/**
* The catalogs generated from this database.
*/

View File

@ -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<Record4<String, String, String, String>> sources(List<String> schemas);
/**
* A query that produces comments for a set of input schemas.
* <p>
* The resulting columns are:
* <ol>
* <li>Catalog name</li>
* <li>Schema name</li>
* <li>Object name (e.g. table, view, function, package)</li>
* <li>Object sub name (e.g. column, package routine)</li>
* <li>Comment</li>
* </ol>
*
* @return The query or <code>null</code> if this implementation doesn't support the query.
*/
@Internal
@Nullable
ResultQuery<Record5<String, String, String, String, String>> comments(List<String> schemas);
}

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> schemas) {
return null;
}
@Override
public ResultQuery<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
return create().select(

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> schemas) {
return null;
}
@Override
public ResultQuery<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
return create()

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> 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<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
return create()

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> 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<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
Field<Long> minValue = is2_0_202()

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> 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<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
return create()

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> schemas) {
return null;
}
@Override
public ResultQuery<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
return null;

View File

@ -676,6 +676,11 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat
;
}
@Override
public ResultQuery<Record5<String, String, String, String, String>> comments(List<String> schemas) {
return null;
}
@Override
public ResultQuery<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
CommonTableExpression<Record1<String>> s = name("schemas").fields("schema").as(selectFrom(values(schemas.stream().collect(toRowArray(DSL::val)))));

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> schemas) {
return null;
}
@Override
public ResultQuery<Record12<String, String, String, String, Integer, Integer, Long, Long, BigDecimal, BigDecimal, Boolean, Long>> sequences(List<String> schemas) {
return null;

View File

@ -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<Record5<String, String, String, String, String>> comments(List<String> schemas) {
return null;
}
@Override
protected List<DomainDefinition> getDomains0() throws SQLException {
return new ArrayList<>();

View File

@ -12,6 +12,7 @@ final class MetaSQL {
private static final EnumMap<SQLDialect, String> M_SEQUENCES = new EnumMap<>(SQLDialect.class);
private static final EnumMap<SQLDialect, String> M_SEQUENCES_INCLUDING_SYSTEM_SEQUENCES = new EnumMap<>(SQLDialect.class);
private static final EnumMap<SQLDialect, String> M_SOURCES = new EnumMap<>(SQLDialect.class);
private static final EnumMap<SQLDialect, String> 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");