Illegal group reference update problem with $ char in changeset name.
Description
We have a problem during update procedure when there is $ (dolar character) in changeset (file) name. This problem not occur if it is launch first time (no update procedure).
INFO 09.01.15 16:55: liquibase: changeSet-tdp_51_708318/00000E$_PI_upgrade_package_initialization.xml::7.0.83.18-section_begin.sql::liquibase: Successfully released change log lock Unexpected error running Liquibase: Illegal group reference
SEVERE 09.01.15 16:55: liquibase: changeSet-tdp_51_708318/00000E$_PI_upgrade_package_initialization.xml::7.0.83.18-section_begin.sql::liquibase: Illegal group reference java.lang.IllegalArgumentException: Illegal group reference at java.util.regex.Matcher.appendReplacement(Unknown Source) at java.util.regex.Matcher.replaceFirst(Unknown Source) at java.lang.String.replaceFirst(Unknown Source) at liquibase.sqlgenerator.core.UpdateGenerator.generateSql(UpdateGenerator.java:50) at liquibase.sqlgenerator.core.UpdateGenerator.generateSql(UpdateGenerator.java:17) at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30) at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:208) at liquibase.sqlgenerator.core.MarkChangeSetRanGenerator.generateSql(MarkChangeSetRanGenerator.java:81) at liquibase.sqlgenerator.core.MarkChangeSetRanGenerator.generateSql(MarkChangeSetRanGenerator.java:24) at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30) at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:208) at liquibase.executor.AbstractExecutor.applyVisitors(AbstractExecutor.java:23) at liquibase.executor.jvm.JdbcExecutor.access$500(JdbcExecutor.java:36) at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:304) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:122) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:112) at liquibase.changelog.StandardChangeLogHistoryService.setExecType(StandardChangeLogHistoryService.java:264) at liquibase.database.AbstractJdbcDatabase.markChangeSetExecStatus(AbstractJdbcDatabase.java:1089) at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:50) at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73) at liquibase.Liquibase.update(Liquibase.java:200) at liquibase.integration.commandline.Main.doMigration(Main.java:1032) at liquibase.integration.commandline.Main.run(Main.java:177) at liquibase.integration.commandline.Main.main(Main.java:96)
Environment
Oracle11
Activity
Show:
RafałN
January 15, 2015 at 10:58 AM
To fix this issue it is needed to change UpdateGenerator.java line: fixedWhereClause = fixedWhereClause.replaceFirst(" ?|:value", DataTypeFactory.getInstance().fromObject(param, database).objectToSql(param, database));
with this one: fixedWhereClause = fixedWhereClause.replaceFirst(" ?|:value", Matcher.quoteReplacement(DataTypeFactory.getInstance().fromObject(param, database).objectToSql(param, database)));
If similar issues occure in DeleteGenerator or UpdateExecutablePreparedStatement classes it is necessary to make similar corrections in fixedWhereClause assignment statements in these classes.
We have a problem during update procedure when there is $ (dolar character) in changeset (file) name.
This problem not occur if it is launch first time (no update procedure).
INFO 09.01.15 16:55: liquibase: changeSet-tdp_51_708318/00000E$_PI_upgrade_package_initialization.xml::7.0.83.18-section_begin.sql::liquibase: Successfully released change log lock
Unexpected error running Liquibase: Illegal group reference
SEVERE 09.01.15 16:55: liquibase: changeSet-tdp_51_708318/00000E$_PI_upgrade_package_initialization.xml::7.0.83.18-section_begin.sql::liquibase: Illegal group reference
java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Unknown Source)
at java.util.regex.Matcher.replaceFirst(Unknown Source)
at java.lang.String.replaceFirst(Unknown Source)
at liquibase.sqlgenerator.core.UpdateGenerator.generateSql(UpdateGenerator.java:50)
at liquibase.sqlgenerator.core.UpdateGenerator.generateSql(UpdateGenerator.java:17)
at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30)
at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:208)
at liquibase.sqlgenerator.core.MarkChangeSetRanGenerator.generateSql(MarkChangeSetRanGenerator.java:81)
at liquibase.sqlgenerator.core.MarkChangeSetRanGenerator.generateSql(MarkChangeSetRanGenerator.java:24)
at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30)
at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:208)
at liquibase.executor.AbstractExecutor.applyVisitors(AbstractExecutor.java:23)
at liquibase.executor.jvm.JdbcExecutor.access$500(JdbcExecutor.java:36)
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:304)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:122)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:112)
at liquibase.changelog.StandardChangeLogHistoryService.setExecType(StandardChangeLogHistoryService.java:264)
at liquibase.database.AbstractJdbcDatabase.markChangeSetExecStatus(AbstractJdbcDatabase.java:1089)
at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:50)
at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73)
at liquibase.Liquibase.update(Liquibase.java:200)
at liquibase.integration.commandline.Main.doMigration(Main.java:1032)
at liquibase.integration.commandline.Main.run(Main.java:177)
at liquibase.integration.commandline.Main.main(Main.java:96)