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.

Details

Reporter

Components

Affects versions

Priority

Created January 9, 2015 at 4:31 PM
Updated January 15, 2015 at 10:58 AM