Liquibase H2 InsertOrUpdateGeneratorH2 fails if primary key column name contains $ character
Description
Environment
H2
Activity
Show:
Nathan Voxland November 21, 2013 at 4:17 PM
Applied patch, thanks!
Fixed
Details
Details
Reporter
Jan Simon
Jan SimonComponents
Fix versions
Affects versions
Priority
Created September 6, 2013 at 3:31 PM
Updated November 21, 2013 at 4:17 PM
Resolved November 21, 2013 at 4:17 PM
If primary key contains dollar character ($), then InsertOrUpdateGeneratorH2 fails with following error:
Caused by: java.lang.IllegalArgumentException: Illegal group reference at java.util.regex.Matcher.appendReplacement(Matcher.java:808) ~[na:1.7.0_25] at java.util.regex.Matcher.replaceAll(Matcher.java:906) ~[na:1.7.0_25] at java.lang.String.replaceAll(String.java:2162) ~[na:1.7.0_25] at liquibase.sqlgenerator.core.InsertOrUpdateGeneratorH2.getInsertStatement(InsertOrUpdateGeneratorH2.java:20) ~[classes/:na]
This issue is related to: https://liquibase.jira.com/browse/CORE-1092
The problem is that special characters are not escaped in replacement. (e.g. using Matcher.quoteReplacement)
getInsertStatement method could be fixed like:
protected String getInsertStatement(InsertOrUpdateStatement insertOrUpdateStatement, Database database, SqlGeneratorChain sqlGeneratorChain) { String insertStatement = super.getInsertStatement(insertOrUpdateStatement, database, sqlGeneratorChain); return insertStatement.replaceAll("(?i)insert into (.+) (values .+)", "MERGE INTO $1 KEY(" + Matcher.quoteReplacement(insertOrUpdateStatement.getPrimaryKey()) + ") $2"); }