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 4875aeb8b75..0009d65f0f8 100644 --- a/liquibase-core/src/main/java/liquibase/database/core/DatabaseUtils.java +++ b/liquibase-core/src/main/java/liquibase/database/core/DatabaseUtils.java @@ -1,5 +1,6 @@ package liquibase.database.core; +import liquibase.GlobalConfiguration; import liquibase.Scope; import liquibase.database.Database; import liquibase.database.OfflineConnection; @@ -8,6 +9,7 @@ import liquibase.executor.ExecutorService; import liquibase.statement.core.RawSqlStatement; import liquibase.structure.core.Schema; +import liquibase.util.StringUtil; public class DatabaseUtils { /** @@ -39,11 +41,22 @@ public static void initializeDatabase(String defaultCatalogName, String defaultS String searchPath = executor.queryForObject(new RawSqlStatement("SHOW SEARCH_PATH"), String.class); if (!searchPath.equals(defaultCatalogName) && !searchPath.startsWith(defaultSchemaName + ",") && !searchPath.startsWith("\"" + defaultSchemaName + "\",")) { - if (database instanceof CockroachDatabase) { - // CockroachDB doesn't support unquoted `$user` type values - searchPath = searchPath.replaceAll("(\\$\\w+)", "'$1'"); + String finalSearchPath; + if (GlobalConfiguration.PRESERVE_SCHEMA_CASE.getCurrentValue()) { + finalSearchPath = ((PostgresDatabase) database).quoteObject(defaultSchemaName, Schema.class); + } else { + finalSearchPath = defaultSchemaName; } - executor.execute(new RawSqlStatement("SET SEARCH_PATH TO " + database.escapeObjectName(defaultSchemaName, Schema.class) + ", " + 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)); } } else if (database instanceof AbstractDb2Database) {