in src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaData.java [3686:3858]
void forEach(String dbPattern) throws SQLException {
boolean operatingOnSystemDB = "information_schema".equalsIgnoreCase(dbPattern) || "mysql".equalsIgnoreCase(dbPattern)
|| "performance_schema".equalsIgnoreCase(dbPattern);
ResultSet results = null;
try {
try {
StringBuilder sqlBuf = new StringBuilder("SHOW FULL TABLES FROM ");
sqlBuf.append(StringUtils.quoteIdentifier(dbPattern, DatabaseMetaData.this.quotedId, DatabaseMetaData.this.pedantic));
if (tableNamePat != null) {
sqlBuf.append(" LIKE ");
sqlBuf.append(StringUtils.quoteIdentifier(tableNamePat, "'", true));
}
results = stmt.executeQuery(sqlBuf.toString());
} catch (SQLException sqlEx) {
if (MysqlErrorNumbers.SQL_STATE_COMMUNICATION_LINK_FAILURE.equals(sqlEx.getSQLState())) {
throw sqlEx;
}
return;
}
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 (int i = 0; i < types.length; i++) {
if (TableType.TABLE.equalsTo(types[i])) {
shouldReportTables = true;
} else if (TableType.VIEW.equalsTo(types[i])) {
shouldReportViews = true;
} else if (TableType.SYSTEM_TABLE.equalsTo(types[i])) {
shouldReportSystemTables = true;
} else if (TableType.SYSTEM_VIEW.equalsTo(types[i])) {
shouldReportSystemViews = true;
} else if (TableType.LOCAL_TEMPORARY.equalsTo(types[i])) {
shouldReportLocalTemporaries = true;
}
}
}
int typeColumnIndex = 0;
boolean hasTableTypes = false;
try {
// Both column names have been in use in the source tree so far....
typeColumnIndex = results.findColumn("table_type");
hasTableTypes = true;
} catch (SQLException sqlEx) {
// We should probably check SQLState here, but that can change depending on the server version and user properties, however,
// we'll get a 'true' SQLException when we actually try to find the 'Type' column
//
try {
typeColumnIndex = results.findColumn("Type");
hasTableTypes = true;
} catch (SQLException sqlEx2) {
hasTableTypes = false;
}
}
while (results.next()) {
byte[][] row = new byte[10][];
row[0] = dbMapsToSchema ? s2b("def") : s2b(dbPattern);// TABLE_CAT
row[1] = dbMapsToSchema ? s2b(dbPattern) : null; // TABLE_SCHEM
row[2] = results.getBytes(1);
row[4] = new byte[0];
row[5] = null;
row[6] = null;
row[7] = null;
row[8] = null;
row[9] = null;
if (hasTableTypes) {
String tableType = results.getString(typeColumnIndex);
switch (TableType.getTableTypeCompliantWith(tableType)) {
case TABLE:
boolean reportTable = false;
TableMetaDataKey tablesKey = null;
if (operatingOnSystemDB && shouldReportSystemTables) {
row[3] = TableType.SYSTEM_TABLE.asBytes();
tablesKey = new TableMetaDataKey(TableType.SYSTEM_TABLE.getName(), dbPattern, null, results.getString(1));
reportTable = true;
} else if (!operatingOnSystemDB && shouldReportTables) {
row[3] = TableType.TABLE.asBytes();
tablesKey = new TableMetaDataKey(TableType.TABLE.getName(), dbPattern, null, results.getString(1));
reportTable = true;
}
if (reportTable) {
sortedRows.put(tablesKey, new ByteArrayRow(row, getExceptionInterceptor()));
}
break;
case VIEW:
if (shouldReportViews) {
row[3] = TableType.VIEW.asBytes();
sortedRows.put(new TableMetaDataKey(TableType.VIEW.getName(), dbPattern, null, results.getString(1)),
new ByteArrayRow(row, getExceptionInterceptor()));
}
break;
case SYSTEM_TABLE:
if (shouldReportSystemTables) {
row[3] = TableType.SYSTEM_TABLE.asBytes();
sortedRows.put(new TableMetaDataKey(TableType.SYSTEM_TABLE.getName(), dbPattern, null, results.getString(1)),
new ByteArrayRow(row, getExceptionInterceptor()));
}
break;
case SYSTEM_VIEW:
if (shouldReportSystemViews) {
row[3] = TableType.SYSTEM_VIEW.asBytes();
sortedRows.put(new TableMetaDataKey(TableType.SYSTEM_VIEW.getName(), dbPattern, null, results.getString(1)),
new ByteArrayRow(row, getExceptionInterceptor()));
}
break;
case LOCAL_TEMPORARY:
if (shouldReportLocalTemporaries) {
row[3] = TableType.LOCAL_TEMPORARY.asBytes();
sortedRows.put(new TableMetaDataKey(TableType.LOCAL_TEMPORARY.getName(), dbPattern, null, results.getString(1)),
new ByteArrayRow(row, getExceptionInterceptor()));
}
break;
default:
row[3] = TableType.TABLE.asBytes();
sortedRows.put(new TableMetaDataKey(TableType.TABLE.getName(), dbPattern, null, results.getString(1)),
new ByteArrayRow(row, getExceptionInterceptor()));
break;
}
} else {
// TODO: Check if this branch is needed for 5.7 server (maybe refactor hasTableTypes)
if (shouldReportTables) {
// Pre-MySQL-5.0.1, tables only
row[3] = TableType.TABLE.asBytes();
sortedRows.put(new TableMetaDataKey(TableType.TABLE.getName(), dbPattern, null, results.getString(1)),
new ByteArrayRow(row, getExceptionInterceptor()));
}
}
}
} finally {
if (results != null) {
try {
results.close();
} catch (Exception ex) {
}
results = null;
}
}
}