FYI: solve "IllegalArgumentException: Illegal group reference"

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):

  1. — 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);
             }
  2. — 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