/**
   * Implementation delegates logic to the {@link
   * liquibase.sqlgenerator.SqlGenerator#warn(liquibase.statement.SqlStatement,
   * liquibase.database.Database, liquibase.sqlgenerator.SqlGeneratorChain)} method on the {@link
   * SqlStatement} objects returned by {@link #generateStatements }. If a generated statement is not
   * supported for the given database, no warning will be added since that is a validation error. If
   * no or null SqlStatements are returned by generateStatements then this method returns no
   * warnings.
   */
  @Override
  public Warnings warn(Database database) {
    Warnings warnings = new Warnings();
    if (generateStatementsVolatile(database)) {
      return warnings;
    }

    SqlStatement[] statements = generateStatements(database);
    if (statements == null) {
      return warnings;
    }
    for (SqlStatement statement : statements) {
      if (SqlGeneratorFactory.getInstance().supports(statement, database)) {
        warnings.addAll(SqlGeneratorFactory.getInstance().warn(statement, database));
      } else if (statement.skipOnUnsupported()) {
        warnings.addWarning(
            statement.getClass().getName()
                + " is not supported on "
                + database.getShortName()
                + ", but "
                + ChangeFactory.getInstance().getChangeMetaData(this).getName()
                + " will still execute");
      }
    }

    return warnings;
  }
  private void outputStatement(SqlStatement sql, List<SqlVisitor> sqlVisitors)
      throws DatabaseException {
    try {
      if (SqlGeneratorFactory.getInstance().generateStatementsVolatile(sql, database)) {
        throw new DatabaseException(
            sql.getClass().getSimpleName()
                + " requires access to up to date database metadata which is not available in SQL output mode");
      }
      for (String statement : applyVisitors(sql, sqlVisitors)) {
        if (statement == null) {
          continue;
        }
        output.write(statement);

        if (database instanceof MSSQLDatabase
            || database instanceof SybaseDatabase
            || database instanceof SybaseASADatabase) {
          output.write(StreamUtil.getLineSeparator());
          output.write("GO");
          //            } else if (database instanceof OracleDatabase) {
          //                output.write(StreamUtil.getLineSeparator());
          //                output.write("/");
        } else {
          String endDelimiter = ";";
          if (sql instanceof RawSqlStatement) {
            endDelimiter = ((RawSqlStatement) sql).getEndDelimiter();
          }
          if (!statement.endsWith(endDelimiter)) {
            output.write(endDelimiter);
          }
        }
        output.write(StreamUtil.getLineSeparator());
        output.write(StreamUtil.getLineSeparator());
      }
    } catch (IOException e) {
      throw new DatabaseException(e);
    }
  }