diff --git a/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java b/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java index eb6e8b2ce..0acc825c5 100644 --- a/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java +++ b/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java @@ -22,6 +22,8 @@ import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; @@ -525,4 +527,19 @@ public static int getUnbalancedPosition(String text) { return -1; // Return -1 if all brackets and quotes are balanced } + public static String sanitizeSingleSql(String sqlStr) { + final Pattern SQL_DELIMITER_SPLIT = + Pattern.compile("((?:'[^']*+'|[^\\n])*+)"); + final StringBuilder builder = new StringBuilder(); + final Matcher matcher = SQL_DELIMITER_SPLIT.matcher(sqlStr); + while (matcher.find()) { + for (int i = 1; i <= matcher.groupCount(); i++) { + if (!matcher.group(i).isEmpty()) { + builder.append("\n").append(matcher.group(i)); + } + } + } + return builder.toString(); + } + } diff --git a/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java b/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java index 16dba1a4a..b420c0615 100644 --- a/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java +++ b/src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java @@ -40,6 +40,7 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.TableStatement; import net.sf.jsqlparser.test.MemoryLeakVerifier; +import net.sf.jsqlparser.test.TestUtils; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; @@ -519,4 +520,27 @@ void testParseEmpty() throws JSQLParserException { assertNull(CCJSqlParserUtil.parse("")); assertNull(CCJSqlParserUtil.parse((String) null)); } + + @Test + void testSingleStatementWithEmptyLines() throws JSQLParserException { + String sqlStr = "update shop_info set title=?,\n" + + "\n" + + "\n" + + "\n" + + "content='abc\n" + + "\n" + + "\n" + + "\n" + + "def'\n" + + "where id=?"; + + Statement statement = CCJSqlParserUtil.parse(CCJSqlParserUtil.sanitizeSingleSql(sqlStr)); + TestUtils.assertStatementCanBeDeparsedAs(statement, "update shop_info set title=?,\n" + + "content='abc\n" + + "\n" + + "\n" + + "\n" + + "def'\n" + + "where id=?", true); + } } diff --git a/src/test/java/net/sf/jsqlparser/statement/StatementSeparatorTest.java b/src/test/java/net/sf/jsqlparser/statement/StatementSeparatorTest.java index 2a4fd081c..f8b766300 100644 --- a/src/test/java/net/sf/jsqlparser/statement/StatementSeparatorTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/StatementSeparatorTest.java @@ -9,10 +9,11 @@ */ package net.sf.jsqlparser.statement; -import net.sf.jsqlparser.*; -import net.sf.jsqlparser.parser.*; -import net.sf.jsqlparser.test.*; -import org.junit.jupiter.api.*; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.test.TestUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class StatementSeparatorTest {