diff --git a/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java b/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java index aa9fffb3246..2341dd9353e 100644 --- a/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java +++ b/liquibase-core/src/main/java/liquibase/changelog/ChangeSet.java @@ -227,13 +227,7 @@ public ChangeSet(String id, String author, boolean alwaysRun, boolean runOnChang } protected void setDbms(String dbmsList) { - if (StringUtils.trimToNull(dbmsList) != null) { - String[] strings = dbmsList.toLowerCase().split(","); - dbmsSet = new HashSet(); - for (String string : strings) { - dbmsSet.add(string.trim().toLowerCase()); - } - } + this.dbmsSet = DatabaseList.toDbmsSet(dbmsList); } public String getFilePath() { diff --git a/liquibase-core/src/main/java/liquibase/changelog/DatabaseChangeLog.java b/liquibase-core/src/main/java/liquibase/changelog/DatabaseChangeLog.java index 2ca432a7625..9c172298f13 100644 --- a/liquibase-core/src/main/java/liquibase/changelog/DatabaseChangeLog.java +++ b/liquibase-core/src/main/java/liquibase/changelog/DatabaseChangeLog.java @@ -9,6 +9,7 @@ import liquibase.changelog.filter.LabelChangeSetFilter; import liquibase.changelog.visitor.ValidatingVisitor; import liquibase.database.Database; +import liquibase.database.DatabaseList; import liquibase.database.ObjectQuotingStrategy; import liquibase.exception.LiquibaseException; import liquibase.exception.SetupException; @@ -172,11 +173,7 @@ public ChangeSet getChangeSet(String path, String author, String id) { if (normalizePath(changeSet.getFilePath()).equalsIgnoreCase(normalizePath(path)) && changeSet.getAuthor().equalsIgnoreCase(author) && changeSet.getId().equalsIgnoreCase(id) - && (changeSet.getDbmsSet() == null - || changeLogParameters == null - || changeLogParameters.getValue("database.typeName", this) == null - || changeSet.getDbmsSet().isEmpty() - || changeSet.getDbmsSet().contains(changeLogParameters.getValue("database.typeName", this).toString()))) { + && isDbmsMatch(changeSet.getDbmsSet())) { return changeSet; } } @@ -308,7 +305,9 @@ protected void handleChildNode(ParsedNode node, ResourceAccessor resourceAccesso expandExpressions(node); String nodeName = node.getName(); if (nodeName.equals("changeSet")) { - this.addChangeSet(createChangeSet(node, resourceAccessor)); + if (isDbmsMatch(node.getChildValue(null, "dbms", String.class))) { + this.addChangeSet(createChangeSet(node, resourceAccessor)); + } } else if (nodeName.equals("include")) { String path = node.getChildValue(null, "file", String.class); if (path == null) { @@ -399,6 +398,18 @@ protected void handleChildNode(ParsedNode node, ResourceAccessor resourceAccesso } } + public boolean isDbmsMatch(String dbmsList) { + return isDbmsMatch(DatabaseList.toDbmsSet(dbmsList)); + } + + public boolean isDbmsMatch(Set dbmsSet) { + return dbmsSet == null + || changeLogParameters == null + || changeLogParameters.getValue("database.typeName", this) == null + || dbmsSet.isEmpty() + || dbmsSet.contains(changeLogParameters.getValue("database.typeName", this).toString()); + } + public void includeAll(String pathName, boolean isRelativeToChangelogFile, IncludeAllFilter resourceFilter, boolean errorIfMissingOrEmpty, Comparator resourceComparator, ResourceAccessor resourceAccessor, ContextExpression includeContexts) throws SetupException { diff --git a/liquibase-core/src/main/java/liquibase/database/DatabaseList.java b/liquibase-core/src/main/java/liquibase/database/DatabaseList.java index bb7baed6364..bc86c2eb79e 100644 --- a/liquibase-core/src/main/java/liquibase/database/DatabaseList.java +++ b/liquibase-core/src/main/java/liquibase/database/DatabaseList.java @@ -70,4 +70,15 @@ public static boolean definitionMatches(Collection definition, Database } return definitionMatches(definition, shortName, returnValueIfEmptyList); } + + public static Set toDbmsSet(String dbmsList) { + Set dbmsSet = null; + if (StringUtils.trimToNull(dbmsList) != null) { + dbmsSet = new HashSet(); + for (String string : dbmsList.toLowerCase().split(",")) { + dbmsSet.add(string.trim()); + } + } + return dbmsSet; + } } diff --git a/liquibase-core/src/test/groovy/liquibase/parser/core/xml/XMLChangeLogSAXParser_RealFile_Test.groovy b/liquibase-core/src/test/groovy/liquibase/parser/core/xml/XMLChangeLogSAXParser_RealFile_Test.groovy index da259caa2dc..33f84fe29ab 100644 --- a/liquibase-core/src/test/groovy/liquibase/parser/core/xml/XMLChangeLogSAXParser_RealFile_Test.groovy +++ b/liquibase-core/src/test/groovy/liquibase/parser/core/xml/XMLChangeLogSAXParser_RealFile_Test.groovy @@ -21,6 +21,8 @@ import liquibase.changelog.ChangeSet import liquibase.changelog.DatabaseChangeLog import liquibase.configuration.LiquibaseConfiguration import liquibase.database.ObjectQuotingStrategy +import liquibase.database.core.H2Database +import liquibase.database.core.MSSQLDatabase import liquibase.sdk.database.MockDatabase import liquibase.exception.ChangeLogParseException import liquibase.precondition.CustomPreconditionWrapper @@ -693,4 +695,24 @@ public class XMLChangeLogSAXParser_RealFile_Test extends Specification { cleanup: ChangeFactory.getInstance().unregister("createTableExample") } + + def "change sets with matching dbms are parsed"() { + when: + def path = "liquibase/parser/core/xml/rollbackWithDbmsChangeLog.xml" + def database = new MSSQLDatabase() + def changeLog = new XMLChangeLogSAXParser().parse(path, new ChangeLogParameters(database), new JUnitResourceAccessor()) + + then: + changeLog.getChangeSets().size() == 4 + } + + def "change sets with non-matching dbms are skipped"() { + when: + def path = "liquibase/parser/core/xml/rollbackWithDbmsChangeLog.xml" + def database = new H2Database() + def changeLog = new XMLChangeLogSAXParser().parse(path, new ChangeLogParameters(database), new JUnitResourceAccessor()) + + then: + changeLog.getChangeSets().size() == 2 + } } diff --git a/liquibase-core/src/test/resources/liquibase/parser/core/xml/rollbackWithDbmsChangeLog.xml b/liquibase-core/src/test/resources/liquibase/parser/core/xml/rollbackWithDbmsChangeLog.xml new file mode 100644 index 00000000000..e95dc4d1eb1 --- /dev/null +++ b/liquibase-core/src/test/resources/liquibase/parser/core/xml/rollbackWithDbmsChangeLog.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + +