Hello,
I had problems with using dollar signs ($) in ChangeSet-ID’s (for example when updateing md5sum):
IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:706)
at java.util.regex.Matcher.replaceFirst(Matcher.java:848)
at java.lang.String.replaceFirst(String.java:1967)
at liquibase.sqlgenerator.core.UpdateGenerator.generateSql(UpdateGenerator.java:35)
It is easy to solve and should have no side-effects (as far see):
- — orig/liquibase-core/src/main/java/liquibase/sqlgenerator/core/DeleteGenerator.java 2012-08-14 14:36:09.401427600 +0200
+++ fixed/liquibase-core/src/main/java/liquibase/sqlgenerator/core/DeleteGenerator.java 2012-08-14 15:42:38.172000000 +0200
@@ -11,6 +11,7 @@
import liquibase.statement.core.DeleteStatement;
import java.util.Date;
+import java.util.regex.Matcher;
public class DeleteGenerator extends AbstractSqlGenerator {
@@ -31,7 +32,7 @@
if (statement.getWhereClause() != null) {
String fixedWhereClause = " WHERE " + statement.getWhereClause();
for (Object param : statement.getWhereParameters()) {
- fixedWhereClause = fixedWhereClause.replaceFirst("\?", convertToString(param, database));
+ fixedWhereClause = fixedWhereClause.replaceFirst("\?", Matcher.quoteReplacement( convertToString(param, database) ));
}
sql.append(" “).append(fixedWhereClause);
}
- — orig/liquibase-core/src/main/java/liquibase/sqlgenerator/core/UpdateGenerator.java 2012-08-14 14:36:09.322423100 +0200
+++ fixed/liquibase-core/src/main/java/liquibase/sqlgenerator/core/UpdateGenerator.java 2012-08-14 15:40:12.203000000 +0200
@@ -10,6 +10,7 @@
import liquibase.statement.core.UpdateStatement;
import java.util.Date;
+import java.util.regex.Matcher;
public class UpdateGenerator extends AbstractSqlGenerator {
@@ -32,7 +33,7 @@
if (statement.getWhereClause() != null) {
String fixedWhereClause = “WHERE " + statement.getWhereClause().trim();
for (Object param : statement.getWhereParameters()) {
- fixedWhereClause = fixedWhereClause.replaceFirst(”\?”, convertToString(param, database));
+ fixedWhereClause = fixedWhereClause.replaceFirst("\?", Matcher.quoteReplacement( convertToString(param, database)));
}
sql.append(" ").append(fixedWhereClause);
}
HopeThatHelps,
Markus Fritz