type) {
if (getParent() != null) {
return getParent().getSingleton(type);
}
diff --git a/liquibase-core/src/main/java/liquibase/ThreadLocalScopeManager.java b/liquibase-core/src/main/java/liquibase/ThreadLocalScopeManager.java
new file mode 100644
index 00000000000..fbaeff75c3f
--- /dev/null
+++ b/liquibase-core/src/main/java/liquibase/ThreadLocalScopeManager.java
@@ -0,0 +1,42 @@
+package liquibase;
+
+/**
+ * An alternative to {@link SingletonScopeManager} which manages a separate Scope per thread.
+ * Integrations that would prefer to use this scope manager can call Scope.setScopeManager(new ThreadLocalScopeManager())
.
+ *
+ * The value of Scope.getCurrentScope() at the time of the ThreadLocalScopeManger's creation will be the basis of all scopes created after setScopeManager() is changed,
+ * so you will generally want to setScopeManager as soon as possible.
+ */
+@SuppressWarnings("java:S5164")
+public class ThreadLocalScopeManager extends ScopeManager {
+
+ private final Scope rootScope;
+ private final ThreadLocal threadLocalScopes = new ThreadLocal<>();
+
+ public ThreadLocalScopeManager() {
+ this.rootScope = Scope.getCurrentScope();
+ }
+
+ @Override
+ public synchronized Scope getCurrentScope() {
+ Scope current = threadLocalScopes.get();
+
+ if (current == null) {
+ threadLocalScopes.set(rootScope);
+ current = rootScope;
+ }
+
+ return current;
+ }
+
+ @Override
+ protected synchronized void setCurrentScope(Scope scope) {
+ this.threadLocalScopes.set(scope);
+ }
+ @Override
+ protected Scope init(Scope scope) throws Exception {
+ return rootScope;
+ }
+
+
+}
\ No newline at end of file
diff --git a/liquibase-core/src/main/java/liquibase/change/core/AddColumnChange.java b/liquibase-core/src/main/java/liquibase/change/core/AddColumnChange.java
index f49bc9d4f81..99b61c3d07a 100644
--- a/liquibase-core/src/main/java/liquibase/change/core/AddColumnChange.java
+++ b/liquibase-core/src/main/java/liquibase/change/core/AddColumnChange.java
@@ -214,6 +214,7 @@ protected Change[] createInverses() {
List inverses = new ArrayList<>();
DropColumnChange inverse = new DropColumnChange();
+ inverse.setCatalogName(getCatalogName());
inverse.setSchemaName(getSchemaName());
inverse.setTableName(getTableName());
diff --git a/liquibase-core/src/main/java/liquibase/change/core/AlterSequenceChange.java b/liquibase-core/src/main/java/liquibase/change/core/AlterSequenceChange.java
index 36ec3f6fcb8..185fc9075c6 100644
--- a/liquibase-core/src/main/java/liquibase/change/core/AlterSequenceChange.java
+++ b/liquibase-core/src/main/java/liquibase/change/core/AlterSequenceChange.java
@@ -81,7 +81,7 @@ public void setMinValue(BigInteger minValue) {
this.minValue = minValue;
}
- @DatabaseChangeProperty(description = "Does the sequence need to be guaranteed to be genererated inm the order of request?")
+ @DatabaseChangeProperty(description = "Does the sequence need to be guaranteed to be generated in the order of request?")
public Boolean isOrdered() {
return ordered;
}
diff --git a/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java b/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java
index 52ca869dc46..dc29087f150 100644
--- a/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java
+++ b/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java
@@ -616,7 +616,7 @@ public ExecType execute(DatabaseChangeLog databaseChangeLog, ChangeExecListener
execType = ExecType.MARK_RAN;
skipChange = true;
- log.info("Marking ChangeSet: " + toString() + " ran despite precondition failure due to onFail='MARK_RAN': " + message);
+ log.info("Marking ChangeSet: \"" + toString() + "\" as ran despite precondition failure due to onFail='MARK_RAN': " + message);
} else if (preconditions.getOnFail().equals(PreconditionContainer.FailOption.WARN)) {
execType = null; //already warned
} else {
diff --git a/liquibase-core/src/main/java/liquibase/database/core/DatabaseUtils.java b/liquibase-core/src/main/java/liquibase/database/core/DatabaseUtils.java
index 0009d65f0f8..b6862196772 100644
--- a/liquibase-core/src/main/java/liquibase/database/core/DatabaseUtils.java
+++ b/liquibase-core/src/main/java/liquibase/database/core/DatabaseUtils.java
@@ -10,6 +10,7 @@
import liquibase.statement.core.RawSqlStatement;
import liquibase.structure.core.Schema;
import liquibase.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
public class DatabaseUtils {
/**
@@ -48,13 +49,15 @@ public static void initializeDatabase(String defaultCatalogName, String defaultS
finalSearchPath = defaultSchemaName;
}
- //If existing search path entries are not quoted, quote them. Some databases do not show them as quoted even though they need to be (like $user or case sensitive schemas)
- finalSearchPath += ", " + StringUtil.join(StringUtil.splitAndTrim(searchPath, ","), ",", (StringUtil.StringUtilFormatter) obj -> {
- if (obj.startsWith("\"")) {
- return obj;
- }
- return ((PostgresDatabase) database).quoteObject(obj, Schema.class);
- });
+ if (StringUtils.isNotBlank(searchPath)) {
+ //If existing search path entries are not quoted, quote them. Some databases do not show them as quoted even though they need to be (like $user or case sensitive schemas)
+ finalSearchPath += ", " + StringUtil.join(StringUtil.splitAndTrim(searchPath, ","), ",", (StringUtil.StringUtilFormatter) obj -> {
+ if (obj.startsWith("\"")) {
+ return obj;
+ }
+ return ((PostgresDatabase) database).quoteObject(obj, Schema.class);
+ });
+ }
executor.execute(new RawSqlStatement("SET SEARCH_PATH TO " + finalSearchPath));
}
diff --git a/liquibase-core/src/main/java/liquibase/database/jvm/JdbcConnection.java b/liquibase-core/src/main/java/liquibase/database/jvm/JdbcConnection.java
index 6ecb608b16a..001f886155b 100644
--- a/liquibase-core/src/main/java/liquibase/database/jvm/JdbcConnection.java
+++ b/liquibase-core/src/main/java/liquibase/database/jvm/JdbcConnection.java
@@ -482,7 +482,7 @@ public void releaseSavepoint(Savepoint savepoint) throws DatabaseException {
@Override
public void rollback() throws DatabaseException {
try {
- if (!con.getAutoCommit() && !con.isClosed()) {
+ if (!con.isClosed() && !con.getAutoCommit()) {
con.rollback();
}
} catch (SQLException e) {
diff --git a/liquibase-core/src/main/java/liquibase/datatype/core/SmallIntType.java b/liquibase-core/src/main/java/liquibase/datatype/core/SmallIntType.java
index f50bf6473c4..945b1ba3365 100644
--- a/liquibase-core/src/main/java/liquibase/datatype/core/SmallIntType.java
+++ b/liquibase-core/src/main/java/liquibase/datatype/core/SmallIntType.java
@@ -1,17 +1,17 @@
package liquibase.datatype.core;
+import liquibase.GlobalConfiguration;
import liquibase.change.core.LoadDataChange;
import liquibase.database.Database;
import liquibase.database.core.*;
import liquibase.datatype.DataTypeInfo;
import liquibase.datatype.DatabaseDataType;
import liquibase.datatype.LiquibaseDataType;
-import liquibase.exception.DatabaseException;
import liquibase.statement.DatabaseFunction;
import java.util.Locale;
-@DataTypeInfo(name="smallint", aliases = {"java.sql.Types.SMALLINT", "int2"}, minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT)
+@DataTypeInfo(name="smallint", aliases = {"java.sql.Types.SMALLINT", "int2", "smallserial"}, minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT)
public class SmallIntType extends LiquibaseDataType {
private boolean autoIncrement;
@@ -52,6 +52,12 @@ public DatabaseDataType toDatabaseDataType(Database database) {
if (((PostgresDatabase) database).useSerialDatatypes()) {
return new DatabaseDataType("SMALLSERIAL");
}
+ } else {
+ if (GlobalConfiguration.CONVERT_DATA_TYPES.getCurrentValue() || this.getRawDefinition() == null) {
+ return new DatabaseDataType("SMALLINT");
+ } else {
+ return new DatabaseDataType(this.getRawDefinition());
+ }
}
return new DatabaseDataType("SMALLINT"); //always smallint regardless of parameters passed
}
@@ -79,4 +85,13 @@ public String objectToSql(Object value, Database database) {
public LoadDataChange.LOAD_DATA_TYPE getLoadTypeName() {
return LoadDataChange.LOAD_DATA_TYPE.NUMERIC;
}
+
+ @Override
+ public void finishInitialization(String originalDefinition) {
+ super.finishInitialization(originalDefinition);
+
+ if (originalDefinition.toLowerCase(Locale.US).contains("serial")) {
+ autoIncrement = true;
+ }
+ }
}
diff --git a/liquibase-core/src/main/java/liquibase/executor/jvm/ColumnMapRowMapper.java b/liquibase-core/src/main/java/liquibase/executor/jvm/ColumnMapRowMapper.java
index 65e5565f6f2..79fa6d1d722 100644
--- a/liquibase-core/src/main/java/liquibase/executor/jvm/ColumnMapRowMapper.java
+++ b/liquibase-core/src/main/java/liquibase/executor/jvm/ColumnMapRowMapper.java
@@ -24,6 +24,12 @@
@SuppressWarnings({"unchecked"})
public class ColumnMapRowMapper implements RowMapper {
+ private final boolean caseSensitiveDatabase;
+
+ public ColumnMapRowMapper(boolean caseSensitiveDatabase) {
+ this.caseSensitiveDatabase = caseSensitiveDatabase;
+ }
+
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
@@ -55,6 +61,9 @@ protected Map createColumnMap(int columnCount) {
* @see java.sql.ResultSetMetaData#getColumnName
*/
protected String getColumnKey(String columnName) {
+ if (this.caseSensitiveDatabase) {
+ return columnName;
+ }
return columnName.toUpperCase(Locale.US);
}
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 3a0e69ffebd..553c530e021 100644
--- a/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java
+++ b/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java
@@ -153,7 +153,7 @@ public void execute(final SqlStatement sql, final List sqlVisitors)
}
if (sql instanceof CompoundStatement) {
if (database instanceof Db2zDatabase) {
- executeDb2ZosComplexStatement(sql);
+ executeDb2ZosComplexStatement(sql, sqlVisitors);
return;
}
}
@@ -319,7 +319,7 @@ public SqlStatement getStatement() {
* @see ColumnMapRowMapper
*/
protected RowMapper getColumnMapRowMapper() {
- return new ColumnMapRowMapper();
+ return new ColumnMapRowMapper(database.isCaseSensitive());
}
/**
@@ -338,7 +338,7 @@ public void comment(String message) throws DatabaseException {
Scope.getCurrentScope().getLog(getClass()).fine(message);
}
- private void executeDb2ZosComplexStatement(SqlStatement sqlStatement) throws DatabaseException {
+ private void executeDb2ZosComplexStatement(final SqlStatement sqlStatement, final List sqlVisitors) throws DatabaseException {
DatabaseConnection con = database.getConnection();
if (con instanceof OfflineConnection) {
@@ -346,12 +346,19 @@ private void executeDb2ZosComplexStatement(SqlStatement sqlStatement) throws Dat
}
Sql[] sqls = SqlGeneratorFactory.getInstance().generateSql(sqlStatement, database);
for (Sql sql : sqls) {
+ String stmtText = sql.toSql();
+ if (sqlVisitors != null) {
+ for (SqlVisitor visitor : sqlVisitors) {
+ stmtText = visitor.modifySql(stmtText, database);
+ }
+ }
+
try {
if (sql instanceof CallableSql) {
CallableStatement call = null;
ResultSet resultSet = null;
try {
- call = ((JdbcConnection) con).getUnderlyingConnection().prepareCall(sql.toSql());
+ call = ((JdbcConnection) con).getUnderlyingConnection().prepareCall(stmtText);
resultSet = call.executeQuery();
checkCallStatus(resultSet, ((CallableSql) sql).getExpectedStatus());
} finally {
@@ -361,11 +368,11 @@ private void executeDb2ZosComplexStatement(SqlStatement sqlStatement) throws Dat
Statement stmt = null;
try {
if (sqlStatement instanceof CompoundStatement) {
- stmt = ((JdbcConnection) con).getUnderlyingConnection().prepareStatement(sql.toSql());
+ stmt = ((JdbcConnection) con).getUnderlyingConnection().prepareStatement(stmtText);
((PreparedStatement)stmt).execute();
} else {
stmt = ((JdbcConnection) con).getUnderlyingConnection().createStatement();
- stmt.execute(sql.toSql());
+ stmt.execute(stmtText);
}
con.commit();
} finally {
diff --git a/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java b/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java
index 848233b5e19..ab52633a391 100644
--- a/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java
+++ b/liquibase-core/src/main/java/liquibase/snapshot/JdbcDatabaseSnapshot.java
@@ -1035,7 +1035,7 @@ protected List extract(ResultSet resultSet, boolean informixIndexTrim
List