in src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaDataMysqlSchema.java [2016:2152]
public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException {
final String dbFilter = chooseDatabaseTerm(catalog, schemaPattern);
final String tableNameFilter = normalizeIdentifierQuoting(tableNamePattern);
final SortedMap<MultiComparable, Row> sortedRows = new TreeMap<>();
try (Statement stmt = getJdbcConnection().getMetaDataSafeStatement()) {
List<String> dbList = chooseBasedOnDatabaseTerm(() -> getDatabasesByLiteral(dbFilter), () -> getDatabasesByPattern(dbFilter));
for (String db : dbList) {
boolean operatingOnSystemDB = "information_schema".equalsIgnoreCase(db) || "mysql".equalsIgnoreCase(db)
|| "performance_schema".equalsIgnoreCase(db) || "sys".equalsIgnoreCase(db);
ResultSet rs = null;
try {
StringBuilder query = new StringBuilder("SHOW FULL TABLES FROM ");
query.append(StringUtils.quoteIdentifier(db, getQuoteId(), true));
if (tableNameFilter != null) {
query.append(" LIKE ");
query.append(StringUtils.quoteIdentifier(tableNameFilter, "'", true));
}
rs = stmt.executeQuery(query.toString());
boolean shouldReportTables = false;
boolean shouldReportViews = false;
boolean shouldReportSystemTables = false;
boolean shouldReportSystemViews = false;
boolean shouldReportLocalTemporaries = false;
if (types == null || types.length == 0) {
shouldReportTables = true;
shouldReportViews = true;
shouldReportSystemTables = true;
shouldReportSystemViews = true;
shouldReportLocalTemporaries = true;
} else {
for (String type : types) {
if (TableType.TABLE.equalsTo(type)) {
shouldReportTables = true;
} else if (TableType.VIEW.equalsTo(type)) {
shouldReportViews = true;
} else if (TableType.SYSTEM_TABLE.equalsTo(type)) {
shouldReportSystemTables = true;
} else if (TableType.SYSTEM_VIEW.equalsTo(type)) {
shouldReportSystemViews = true;
} else if (TableType.LOCAL_TEMPORARY.equalsTo(type)) {
shouldReportLocalTemporaries = true;
}
}
}
while (rs.next()) {
boolean toAdd = false;
MultiComparable tableKey = null;
byte[][] row = new byte[10][];
row[0] = chooseBasedOnDatabaseTerm(() -> s2b(db), () -> s2b("def")); // TABLE_CAT
row[1] = chooseBasedOnDatabaseTerm(() -> null, () -> s2b(db)); // TABLE_SCHEM
row[2] = rs.getBytes(1); // TABLE_NAME
String tableType = rs.getString(2);
switch (TableType.getTableTypeCompliantWith(tableType)) {
case TABLE:
if (operatingOnSystemDB && shouldReportSystemTables) {
row[3] = TableType.SYSTEM_TABLE.asBytes(); // TABLE_TYPE
tableKey = new MultiComparable(TableType.SYSTEM_TABLE.getName(), db, null, rs.getString(1));
toAdd = true;
} else if (!operatingOnSystemDB && shouldReportTables) {
row[3] = TableType.TABLE.asBytes(); // TABLE_TYPE
tableKey = new MultiComparable(TableType.TABLE.getName(), db, null, rs.getString(1));
toAdd = true;
}
break;
case VIEW:
if (shouldReportViews) {
row[3] = TableType.VIEW.asBytes(); // TABLE_TYPE
tableKey = new MultiComparable(TableType.VIEW.getName(), db, null, rs.getString(1));
toAdd = true;
}
break;
case SYSTEM_TABLE:
if (shouldReportSystemTables) {
row[3] = TableType.SYSTEM_TABLE.asBytes(); // TABLE_TYPE
tableKey = new MultiComparable(TableType.SYSTEM_TABLE.getName(), db, null, rs.getString(1));
toAdd = true;
}
break;
case SYSTEM_VIEW:
if (shouldReportSystemViews) {
row[3] = TableType.SYSTEM_VIEW.asBytes(); // TABLE_TYPE
tableKey = new MultiComparable(TableType.SYSTEM_VIEW.getName(), db, null, rs.getString(1));
toAdd = true;
}
break;
case LOCAL_TEMPORARY:
if (shouldReportLocalTemporaries) {
row[3] = TableType.LOCAL_TEMPORARY.asBytes(); // TABLE_TYPE
tableKey = new MultiComparable(TableType.LOCAL_TEMPORARY.getName(), db, null, rs.getString(1));
toAdd = true;
}
break;
default:
row[3] = TableType.TABLE.asBytes(); // TABLE_TYPE
tableKey = new MultiComparable(TableType.TABLE.getName(), db, null, rs.getString(1));
toAdd = true;
break;
}
row[4] = new byte[0]; // REMARKS
row[5] = null; // TYPE_CAT
row[6] = null; // TYPE_SCHEM
row[7] = null; // TYPE_NAME
row[8] = null; // SELF_REFERENCING_COL_NAME
row[9] = null; // REF_GENERATION
if (toAdd) {
sortedRows.put(tableKey, new ByteArrayRow(row, getExceptionInterceptor()));
}
}
} catch (SQLException e) {
if (MysqlErrorNumbers.SQLSTATE_MYSQL_COMMUNICATION_LINK_FAILURE.equals(e.getSQLState())) {
throw e;
}
break;
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
AssertionFailedException.shouldNotHappen(e);
}
rs = null;
}
}
}
}
final ArrayList<Row> rows = new ArrayList<>(sortedRows.values());
return getResultSetFactory().createFromResultsetRows(ResultSet.CONCUR_READ_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE,
new ResultsetRowsStatic(rows, createTablesFields()));
}