in connectors/rocketmq-connect-jdbc/src/main/java/org/apache/rocketmq/connect/jdbc/dialect/GenericDatabaseDialect.java [422:519]
public Map<ColumnId, ColumnDefinition> describeColumns(
Connection connection,
String catalogPattern,
String schemaPattern,
String tablePattern,
String columnPattern
) throws SQLException {
log.debug(
"Querying {} dialect column metadata for catalog:{} schema:{} table:{}",
this,
catalogPattern,
schemaPattern,
tablePattern);
// Get the primary keys of the table(s) ...
final Set<ColumnId> pkColumns = primaryKeyColumns(
connection,
catalogPattern,
schemaPattern,
tablePattern
);
Map<ColumnId, ColumnDefinition> results = new HashMap<>();
try (ResultSet rs = connection.getMetaData().getColumns(
catalogPattern,
schemaPattern,
tablePattern,
columnPattern
)) {
final int rsColumnCount = rs.getMetaData().getColumnCount();
while (rs.next()) {
final String catalogName = rs.getString(1);
final String schemaName = rs.getString(2);
final String tableName = rs.getString(3);
final TableId tableId = new TableId(catalogName, schemaName, tableName);
final String columnName = rs.getString(4);
final ColumnId columnId = new ColumnId(tableId, columnName, null);
final int jdbcType = rs.getInt(5);
final String typeName = rs.getString(6);
final int precision = rs.getInt(7);
final int scale = rs.getInt(9);
final String typeClassName = null;
ColumnDefinition.Nullability nullability;
final int nullableValue = rs.getInt(11);
switch (nullableValue) {
case DatabaseMetaData.columnNoNulls:
nullability = ColumnDefinition.Nullability.NOT_NULL;
break;
case DatabaseMetaData.columnNullable:
nullability = ColumnDefinition.Nullability.NULL;
break;
case DatabaseMetaData.columnNullableUnknown:
default:
nullability = ColumnDefinition.Nullability.UNKNOWN;
break;
}
Boolean autoIncremented = null;
if (rsColumnCount >= 23) {
// Not all drivers include all columns ...
String isAutoIncremented = rs.getString(23);
if ("yes".equalsIgnoreCase(isAutoIncremented)) {
autoIncremented = Boolean.TRUE;
} else if ("no".equalsIgnoreCase(isAutoIncremented)) {
autoIncremented = Boolean.FALSE;
}
}
Boolean signed = null;
Boolean caseSensitive = null;
Boolean searchable = null;
Boolean currency = null;
Integer displaySize = null;
boolean isPrimaryKey = pkColumns.contains(columnId);
if (isPrimaryKey) {
// Some DBMSes report pks as null
nullability = ColumnDefinition.Nullability.NOT_NULL;
}
ColumnDefinition defn = columnDefinition(
rs,
columnId,
jdbcType,
typeName,
typeClassName,
nullability,
ColumnDefinition.Mutability.UNKNOWN,
precision,
scale,
signed,
displaySize,
autoIncremented,
caseSensitive,
searchable,
currency,
isPrimaryKey
);
results.put(columnId, defn);
}
return results;
}
}