Liquibase H2 InsertOrUpdateGeneratorH2 fails if primary key column name contains $ character

Description

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"); }

Environment

H2

Activity

Show:

Nathan Voxland November 21, 2013 at 4:17 PM

Applied patch, thanks!

Fixed

Details

Reporter

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

Flag notifications