diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java
index f5fb828b6ef..304f6ec5580 100644
--- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java
+++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/init/ScriptUtils.java
@@ -106,8 +106,8 @@ public abstract class ScriptUtils {
/**
* Split an SQL script into separate statements delimited by the provided
- * separator string. Each individual statement will be added to the provided
- * {@code List}.
+ * separator string and return a {@code List} containing each individual
+ * statement.
*
Within the script, the provided {@code commentPrefixes} will be honored:
* any text beginning with one of the comment prefixes and extending to the
* end of the line will be omitted from the output. Similarly, the provided
@@ -125,12 +125,12 @@ public abstract class ScriptUtils {
* never {@code null} or empty
* @param blockCommentEndDelimiter the end block comment delimiter;
* never {@code null} or empty
- * @param statements the list that will contain the individual statements
+ * @return a list of statements
* @throws ScriptException if an error occurred while splitting the SQL script
*/
- static void splitSqlScript(@Nullable EncodedResource resource, String script,
+ static List splitSqlScript(EncodedResource resource, String script,
String separator, String[] commentPrefixes, String blockCommentStartDelimiter,
- String blockCommentEndDelimiter, List statements) throws ScriptException {
+ String blockCommentEndDelimiter) throws ScriptException {
Assert.hasText(script, "'script' must not be null or empty");
Assert.notNull(separator, "'separator' must not be null");
@@ -141,6 +141,7 @@ public abstract class ScriptUtils {
Assert.hasText(blockCommentStartDelimiter, "'blockCommentStartDelimiter' must not be null or empty");
Assert.hasText(blockCommentEndDelimiter, "'blockCommentEndDelimiter' must not be null or empty");
+ List statements = new ArrayList<>();
StringBuilder sb = new StringBuilder();
boolean inSingleQuote = false;
boolean inDoubleQuote = false;
@@ -215,26 +216,22 @@ public abstract class ScriptUtils {
if (StringUtils.hasText(sb)) {
statements.add(sb.toString());
}
+
+ return statements;
}
/**
- * Read a script from the provided resource, using the supplied comment prefixes
- * and statement separator, and build a {@code String} containing the lines.
- * Lines beginning with one of the comment prefixes are excluded
- * from the results; however, line comments anywhere else — for example,
- * within a statement — will be included in the results.
- * @param resource the {@code EncodedResource} containing the script
- * to be processed
+ * Read a script from the provided resource, using the supplied statement
+ * separator, and build a {@code String} containing the lines.
+ * @param resource the {@code EncodedResource} containing the script to be
+ * processed
* @param dataBufferFactory the factory to create data buffers with
* @param separator the statement separator in the SQL script (typically ";")
- * @param commentPrefixes the prefixes that identify comments in the SQL script
- * (typically "--")
- * @param blockCommentEndDelimiter the end block comment delimiter
* @return a {@link Mono} of {@link String} containing the script lines that
- * completes once the resource was loaded
+ * completes once the resource has been loaded
*/
static Mono readScript(EncodedResource resource, DataBufferFactory dataBufferFactory,
- @Nullable String separator, @Nullable String[] commentPrefixes, @Nullable String blockCommentEndDelimiter) {
+ @Nullable String separator) {
return DataBufferUtils.join(DataBufferUtils.read(resource.getResource(), dataBufferFactory, 8192))
.handle((it, sink) -> {
@@ -322,7 +319,7 @@ public abstract class ScriptUtils {
* (typically "*/")
* @since 5.3.8
*/
- static boolean containsStatementSeparator(@Nullable EncodedResource resource, String script,
+ static boolean containsStatementSeparator(EncodedResource resource, String script,
String separator, String[] commentPrefixes, String blockCommentStartDelimiter,
String blockCommentEndDelimiter) throws ScriptException {
@@ -514,13 +511,12 @@ public abstract class ScriptUtils {
long startTime = System.currentTimeMillis();
- Mono inputScript = readScript(resource, dataBufferFactory, separator, commentPrefixes, blockCommentEndDelimiter)
+ Mono inputScript = readScript(resource, dataBufferFactory, separator)
.onErrorMap(IOException.class, ex -> new CannotReadScriptException(resource, ex));
AtomicInteger statementNumber = new AtomicInteger();
Flux executeScript = inputScript.flatMapIterable(script -> {
- List statements = new ArrayList<>();
String separatorToUse = separator;
if (separatorToUse == null) {
separatorToUse = DEFAULT_STATEMENT_SEPARATOR;
@@ -530,9 +526,8 @@ public abstract class ScriptUtils {
blockCommentStartDelimiter, blockCommentEndDelimiter)) {
separatorToUse = FALLBACK_STATEMENT_SEPARATOR;
}
- splitSqlScript(resource, script, separatorToUse, commentPrefixes, blockCommentStartDelimiter,
- blockCommentEndDelimiter, statements);
- return statements;
+ return splitSqlScript(resource, script, separatorToUse, commentPrefixes,
+ blockCommentStartDelimiter, blockCommentEndDelimiter);
}).concatMap(statement -> {
statementNumber.incrementAndGet();
return runStatement(statement, connection, resource, continueOnError, ignoreFailedDrops, statementNumber);
diff --git a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java
index bc9775ad9c9..8cf650bcb42 100644
--- a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java
+++ b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/init/ScriptUtilsUnitTests.java
@@ -16,7 +16,6 @@
package org.springframework.r2dbc.connection.init;
-import java.util.ArrayList;
import java.util.List;
import org.assertj.core.util.Strings;
@@ -60,8 +59,7 @@ public class ScriptUtilsUnitTests {
String delimiter = ";";
String script = Strings.join(rawStatement1, rawStatement2, rawStatement3).with(delimiter);
- List statements = new ArrayList<>();
- splitSqlScript(script, delimiter, statements);
+ List statements = splitSqlScript(script, delimiter);
assertThat(statements).containsExactly(cleanedStatement1, cleanedStatement2, cleanedStatement3);
}
@@ -75,8 +73,7 @@ public class ScriptUtilsUnitTests {
String delimiter = "\n";
String script = Strings.join(statement1, statement2, statement3).with(delimiter);
- List statements = new ArrayList<>();
- splitSqlScript(script, delimiter, statements);
+ List statements = splitSqlScript(script, delimiter);
assertThat(statements).containsExactly(statement1, statement2, statement3);
}
@@ -88,9 +85,7 @@ public class ScriptUtilsUnitTests {
String script = Strings.join(statement1, statement2).with("\n");
- List statements = new ArrayList<>();
-
- splitSqlScript(script, DEFAULT_STATEMENT_SEPARATOR, statements);
+ List statements = splitSqlScript(script, DEFAULT_STATEMENT_SEPARATOR);
assertThat(statements).as("stripped but not split statements").containsExactly(script.replace('\n', ' '));
}
@@ -103,8 +98,7 @@ public class ScriptUtilsUnitTests {
String delimiter = ";";
String script = Strings.join(statement1, statement2).with(delimiter);
- List statements = new ArrayList<>();
- splitSqlScript(script, delimiter, statements);
+ List statements = splitSqlScript(script, delimiter);
assertThat(statements).containsExactly(statement1, statement2);
}
@@ -112,8 +106,7 @@ public class ScriptUtilsUnitTests {
@Test // SPR-11560
public void readAndSplitScriptWithMultipleNewlinesAsSeparator() throws Exception {
String script = readScript("db-test-data-multi-newline.sql");
- List statements = new ArrayList<>();
- splitSqlScript(script, "\n\n", statements);
+ List statements = splitSqlScript(script, "\n\n");
String statement1 = "insert into T_TEST (NAME) values ('Keith')";
String statement2 = "insert into T_TEST (NAME) values ('Dave')";
@@ -140,9 +133,8 @@ public class ScriptUtilsUnitTests {
}
private void splitScriptContainingComments(String script, String... commentPrefixes) {
- List statements = new ArrayList<>();
- ScriptUtils.splitSqlScript(null, script, ";", commentPrefixes, DEFAULT_BLOCK_COMMENT_START_DELIMITER,
- DEFAULT_BLOCK_COMMENT_END_DELIMITER, statements);
+ List statements = ScriptUtils.splitSqlScript(null, script, ";", commentPrefixes, DEFAULT_BLOCK_COMMENT_START_DELIMITER,
+ DEFAULT_BLOCK_COMMENT_END_DELIMITER);
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)";
@@ -156,8 +148,7 @@ public class ScriptUtilsUnitTests {
@Test // SPR-10330
public void readAndSplitScriptContainingCommentsWithLeadingTabs() throws Exception {
String script = readScript("test-data-with-comments-and-leading-tabs.sql");
- List statements = new ArrayList<>();
- splitSqlScript(script, ";", statements);
+ List statements = splitSqlScript(script, ";");
String statement1 = "insert into customer (id, name) values (1, 'Sam Brannen')";
String statement2 = "insert into orders(id, order_date, customer_id) values (1, '2013-06-08', 1)";
@@ -169,8 +160,7 @@ public class ScriptUtilsUnitTests {
@Test // SPR-9531
public void readAndSplitScriptContainingMultiLineComments() throws Exception {
String script = readScript("test-data-with-multi-line-comments.sql");
- List statements = new ArrayList<>();
- splitSqlScript(script, ";", statements);
+ List statements = splitSqlScript(script, ";");
String statement1 = "INSERT INTO users(first_name, last_name) VALUES('Juergen', 'Hoeller')";
String statement2 = "INSERT INTO users(first_name, last_name) VALUES( 'Sam' , 'Brannen' )";
@@ -181,8 +171,7 @@ public class ScriptUtilsUnitTests {
@Test
public void readAndSplitScriptContainingMultiLineNestedComments() throws Exception {
String script = readScript("test-data-with-multi-line-nested-comments.sql");
- List statements = new ArrayList<>();
- splitSqlScript(script, ";", statements);
+ List statements = splitSqlScript(script, ";");
String statement1 = "INSERT INTO users(first_name, last_name) VALUES('Juergen', 'Hoeller')";
String statement2 = "INSERT INTO users(first_name, last_name) VALUES( 'Sam' , 'Brannen' )";
@@ -231,13 +220,12 @@ public class ScriptUtilsUnitTests {
private String readScript(String path) throws Exception {
EncodedResource resource = new EncodedResource(new ClassPathResource(path, getClass()));
- return ScriptUtils.readScript(resource, DefaultDataBufferFactory.sharedInstance, DEFAULT_STATEMENT_SEPARATOR,
- DEFAULT_COMMENT_PREFIXES, DEFAULT_BLOCK_COMMENT_END_DELIMITER).block();
+ return ScriptUtils.readScript(resource, DefaultDataBufferFactory.sharedInstance, DEFAULT_STATEMENT_SEPARATOR).block();
}
- private static void splitSqlScript(String script, String separator, List statements) throws ScriptException {
- ScriptUtils.splitSqlScript(null, script, separator, DEFAULT_COMMENT_PREFIXES, DEFAULT_BLOCK_COMMENT_START_DELIMITER,
- DEFAULT_BLOCK_COMMENT_END_DELIMITER, statements);
+ private static List splitSqlScript(String script, String separator) throws ScriptException {
+ return ScriptUtils.splitSqlScript(null, script, separator, DEFAULT_COMMENT_PREFIXES, DEFAULT_BLOCK_COMMENT_START_DELIMITER,
+ DEFAULT_BLOCK_COMMENT_END_DELIMITER);
}
}