public ResultSet getTables()

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()));
    }