in adb3client/src/main/java/com/alibaba/cloud/analyticdb/adb3client/impl/handler/MetaActionHandler.java [48:124]
private TableSchema getTableSchema(final Connection conn, final TableName tableName) throws SQLException {
String[] columns = null;
int[] types = null;
String[] typeNames = null;
List<String> primaryKeyList = new ArrayList<>();
try (ResultSet rs = conn.getMetaData().getPrimaryKeys(tableName.getSchemaName(), null, tableName.getTableName())) {
while (rs.next()) {
primaryKeyList.add(rs.getString(4));
}
}
List<Column> columnList = new ArrayList<>();
try (ResultSet rs = conn.getMetaData().getColumns(tableName.getSchemaName(), null, tableName.getTableName(), "%")) {
while (rs.next()) {
Column column = new Column();
column.setName(rs.getString(4));
column.setType(rs.getInt(5));
column.setTypeName(rs.getString(6));
column.setPrecision(rs.getInt(7));
column.setScale(rs.getInt(9));
column.setAllowNull(rs.getInt(11) == 1);
column.setComment(rs.getString(12));
column.setDefaultValue(rs.getObject(13));
column.setArrayType(column.getTypeName().startsWith("_"));
column.setPrimaryKey(primaryKeyList.contains(column.getName()));
columnList.add(column);
}
}
String distributeColumns = "";
String physicalSchema = "";
int shardCount = 1;
String schema = tableName.getSchemaName();
if (schema == null || schema.isEmpty()) {
schema = conn.getCatalog();
}
String sql = String.format("select * from information_schema.kepler_meta_tables where table_name = '%s' and table_schema = '%s'",
tableName.getTableName(), schema);
try (Statement st = conn.createStatement()) {
try (ResultSet rs = st.executeQuery(sql)) {
if (rs.next()) {
String distributeType = rs.getString("distribute_type");
if (distributeType.equalsIgnoreCase("hash")) {
distributeColumns = rs.getString("distribute_column");
if (distributeColumns.equalsIgnoreCase("__adb_auto_id__")) {
distributeColumns = "";
}
}
physicalSchema = rs.getString("physical_table_schema");
}
}
if (!physicalSchema.isEmpty()) {
sql = String.format("select count(*) from information_schema.kepler_meta_shards where shard_name like '%s__%%'", physicalSchema);
try (ResultSet rs = st.executeQuery(sql)) {
if (rs.next()) {
shardCount = rs.getInt(1);
}
}
}
}
TableSchema.Builder builder = new TableSchema.Builder();
builder.setColumns(columnList);
builder.setTableName(tableName);
if (!distributeColumns.isEmpty()) {
builder.setDistributionKeys(distributeColumns.split(","));
builder.setShardCount(shardCount);
}
builder.setNotExist(false);
TableSchema tableSchema = builder.build();
tableSchema.calculateProperties();
return tableSchema;
}