From d1306e24978d8baa1fdad10ccf27eadeb9a72902 Mon Sep 17 00:00:00 2001 From: mkern Date: Tue, 5 Apr 2022 12:59:10 +0200 Subject: [PATCH] Fix for bug 2711: Error when calling a procedure with parameters on DB2Z --- .../java/liquibase/change/AbstractSQLChange.java | 9 +++++++-- .../java/liquibase/executor/jvm/JdbcExecutor.java | 10 ++++++++-- .../statement/core/RawCompoundStatement.java | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 liquibase-core/src/main/java/liquibase/statement/core/RawCompoundStatement.java diff --git a/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java b/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java index fbcde81be77..108d9a8a96d 100644 --- a/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java +++ b/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java @@ -4,13 +4,14 @@ import liquibase.Scope; import liquibase.GlobalConfiguration; import liquibase.database.Database; +import liquibase.database.core.Db2zDatabase; import liquibase.database.core.MSSQLDatabase; -import liquibase.database.core.PostgresDatabase; import liquibase.exception.DatabaseException; import liquibase.exception.UnexpectedLiquibaseException; import liquibase.exception.ValidationErrors; import liquibase.exception.Warnings; import liquibase.statement.SqlStatement; +import liquibase.statement.core.RawCompoundStatement; import liquibase.statement.core.RawSqlStatement; import liquibase.util.StringUtil; @@ -249,7 +250,11 @@ public SqlStatement[] generateStatements(Database database) { escapedStatement = statement; } - returnStatements.add(new RawSqlStatement(escapedStatement, getEndDelimiter())); + if (database instanceof Db2zDatabase && escapedStatement.toUpperCase().startsWith("CALL")) { + returnStatements.add(new RawCompoundStatement(escapedStatement, getEndDelimiter())); + } else { + returnStatements.add(new RawSqlStatement(escapedStatement, getEndDelimiter())); + } } return returnStatements.toArray(new SqlStatement[returnStatements.size()]); diff --git a/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java b/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java index c280821918e..04190f4a0a1 100644 --- a/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java +++ b/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java @@ -25,6 +25,7 @@ import liquibase.util.StringUtil; import java.sql.CallableStatement; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -322,8 +323,13 @@ private void executeDb2ZosComplexStatement(SqlStatement sqlStatement) throws Dat } else { Statement stmt = null; try { - stmt = ((JdbcConnection) con).getUnderlyingConnection().createStatement(); - stmt.execute(sql.toSql()); + if (sqlStatement instanceof CompoundStatement) { + stmt = ((JdbcConnection) con).getUnderlyingConnection().prepareStatement(sql.toSql()); + ((PreparedStatement)stmt).execute(); + } else { + stmt = ((JdbcConnection) con).getUnderlyingConnection().createStatement(); + stmt.execute(sql.toSql()); + } con.commit(); } finally { JdbcUtil.closeStatement(stmt); diff --git a/liquibase-core/src/main/java/liquibase/statement/core/RawCompoundStatement.java b/liquibase-core/src/main/java/liquibase/statement/core/RawCompoundStatement.java new file mode 100644 index 00000000000..e839a099b6c --- /dev/null +++ b/liquibase-core/src/main/java/liquibase/statement/core/RawCompoundStatement.java @@ -0,0 +1,14 @@ +package liquibase.statement.core; + +import liquibase.statement.CompoundStatement; + +public class RawCompoundStatement extends RawSqlStatement implements CompoundStatement { + + public RawCompoundStatement(String sql) { + super(sql); + } + + public RawCompoundStatement(String sql, String endDelimiter) { + super(sql, endDelimiter); + } +}