From b150e7205249fc761f174ea46b99d536fe76a930 Mon Sep 17 00:00:00 2001 From: chrunchyjesus Date: Thu, 23 May 2019 20:20:25 +0200 Subject: [PATCH] Fix ScriptUtils for MS Windows line ending Prior to this commit, ScriptUtils did not properly split SQL scripts that contained line endings for MS Windows. Closes gh-23019 --- .../jdbc/datasource/init/ScriptUtils.java | 2 +- .../datasource/init/ScriptUtilsUnitTests.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java index c4ecc3f5671..b2c60048e47 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java @@ -233,7 +233,7 @@ public abstract class ScriptUtils { "Missing block comment end delimiter: " + blockCommentEndDelimiter, resource); } } - else if (c == ' ' || c == '\n' || c == '\t') { + else if (c == ' ' || c == '\r' || c == '\n' || c == '\t') { // Avoid multiple adjacent whitespace characters if (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ') { c = ' '; diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/init/ScriptUtilsUnitTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/init/ScriptUtilsUnitTests.java index b740f507255..f2bfdd22b89 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/init/ScriptUtilsUnitTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/init/ScriptUtilsUnitTests.java @@ -132,6 +132,25 @@ public class ScriptUtilsUnitTests { assertEquals("statement 4 not split correctly", statement4, statements.get(3)); } + @Test + public void readAndSplitScriptContainingCommentsWithWindowsLineEnding() throws Exception { + String script = readScript("test-data-with-comments.sql").replaceAll("\n", "\r\n"); + List statements = new ArrayList<>(); + splitSqlScript(script, ';', statements); + + String statement1 = "insert into customer (id, name) values (1, 'Rod; Johnson'), (2, 'Adrian Collier')"; + String statement2 = "insert into orders(id, order_date, customer_id) values (1, '2008-01-02', 2)"; + String statement3 = "insert into orders(id, order_date, customer_id) values (1, '2008-01-02', 2)"; + // Statement 4 addresses the error described in SPR-9982. + String statement4 = "INSERT INTO persons( person_id , name) VALUES( 1 , 'Name' )"; + + assertEquals("wrong number of statements", 4, statements.size()); + assertEquals("statement 1 not split correctly", statement1, statements.get(0)); + assertEquals("statement 2 not split correctly", statement2, statements.get(1)); + assertEquals("statement 3 not split correctly", statement3, statements.get(2)); + assertEquals("statement 4 not split correctly", statement4, statements.get(3)); + } + @Test // SPR-10330 public void readAndSplitScriptContainingCommentsWithLeadingTabs() throws Exception { String script = readScript("test-data-with-comments-and-leading-tabs.sql");