package liquibase.sqlgenerator.core; import liquibase.database.Database; import liquibase.database.core.PostgresDatabase; import liquibase.exception.LiquibaseException; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGeneratorChain; import liquibase.statement.core.InsertOrUpdateStatement; public class InsertOrUpdateGeneratorPostgres extends InsertOrUpdateGenerator { @Override public boolean supports(InsertOrUpdateStatement statement, Database database) { return database instanceof PostgresDatabase; } @Override public Sql[] generateSql(InsertOrUpdateStatement insertOrUpdateStatement, Database database, SqlGeneratorChain sqlGeneratorChain) { StringBuilder generatedSql = new StringBuilder(); generatedSql.append("DO\n"); generatedSql.append("$$\n"); generatedSql.append("BEGIN\n"); try { generatedSql.append(getUpdateStatement(insertOrUpdateStatement, database, getWhereClause(insertOrUpdateStatement, database), sqlGeneratorChain)); } catch (LiquibaseException e) { // do a select statement instead generatedSql.append("select * from " + database.escapeTableName(insertOrUpdateStatement.getSchemaName(), insertOrUpdateStatement.getTableName()) + " WHERE " + getWhereClause(insertOrUpdateStatement, database) + "\n"); } generatedSql.append("IF not found THEN\n"); generatedSql.append(getInsertStatement(insertOrUpdateStatement, database, sqlGeneratorChain)); generatedSql.append("END IF;\n"); generatedSql.append("END;\n"); generatedSql.append("$$\n"); generatedSql.append("LANGUAGE plpgsql;\n"); return new Sql[] { new UnparsedSql(generatedSql.toString()) }; } @Override protected String getElse(Database arg0) { throw new UnsupportedOperationException(); } @Override protected String getRecordCheck(InsertOrUpdateStatement arg0, Database arg1, String arg2) { throw new UnsupportedOperationException(); } }