/**
   * @param excludeIndirectColumns
   * @param excludeColumns
   * @throws SQLException
   */
  private void initColumns(Pattern excludeIndirectColumns, Pattern excludeColumns)
      throws SQLException {
    ResultSet rs = null;

    synchronized (Table.class) {
      try {
        rs = db.getMetaData().getColumns(null, getSchema(), getName(), "%");

        while (rs.next()) addColumn(rs, excludeIndirectColumns, excludeColumns);
      } catch (SQLException exc) {
        class ColumnInitializationFailure extends SQLException {
          private static final long serialVersionUID = 1L;

          public ColumnInitializationFailure(SQLException failure) {
            super(
                "Failed to collect column details for "
                    + (isView() ? "view" : "table")
                    + " '"
                    + getName()
                    + "' in schema '"
                    + getSchema()
                    + "'");
            initCause(failure);
          }
        }

        throw new ColumnInitializationFailure(exc);
      } finally {
        if (rs != null) rs.close();
      }
    }

    if (!isView() && !isRemote()) initColumnAutoUpdate(false);
  }