Skip to content

Commit b081484

Browse files
feat: Support more Statement Separators
- `GO` - Slash `/` - Two empty lines
1 parent 4aeafbc commit b081484

5 files changed

Lines changed: 67 additions & 12 deletions

File tree

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -450,9 +450,9 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
450450
| <K_ZONE:"ZONE">
451451
}
452452

453-
TOKEN : /* Stuff */
453+
TOKEN : /* Statement Separators */
454454
{
455-
<ST_SEMICOLON : ";" >
455+
<ST_SEMICOLON : ( ";" | ("\n\n\n") | "\n/\n" | "\ngo" ) >
456456
}
457457

458458
TOKEN : /* Operators */
@@ -6248,7 +6248,7 @@ AlterExpression AlterExpression():
62486248
int i=0;
62496249

62506250
for (String s: tokens)
6251-
if (!s.equals(";")) {
6251+
if (! (s.equals(";") || s.equals("\n\n\n")) ) {
62526252
if (i>0)
62536253
optionalSpecifier.append( " " );
62546254
optionalSpecifier.append( s );

src/site/sphinx/usage.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ How to use it
1212

1313
4) Oracle Alternative Quoting is partially supported for common brackets such as ``q'{...}'``, ``q'[...]'``, ``q'(...)'`` and ``q''...''``.
1414

15+
5) Supported Statement Separators are Semicolon ``\;``, ``GO``, Slash ``\/`` or 2 empty lines.
16+
1517

1618
Compile from Source Code
1719
==============================
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package net.sf.jsqlparser.statement;
2+
3+
import net.sf.jsqlparser.*;
4+
import net.sf.jsqlparser.parser.*;
5+
import net.sf.jsqlparser.test.*;
6+
import org.junit.jupiter.api.*;
7+
8+
public class StatementSeparatorTest {
9+
10+
@Test
11+
void testDoubleNewLine() throws JSQLParserException {
12+
String sqlStr =
13+
"SELECT * FROM DUAL\n\n\nSELECT * FROM DUAL\n\n\n\nSELECT * FROM dual\n\n\n\n\nSELECT * FROM dual";
14+
Statements statements = CCJSqlParserUtil.parseStatements(sqlStr);
15+
Assertions.assertEquals(4, statements.getStatements().size());
16+
}
17+
18+
@Test
19+
void testNewLineSlash() throws JSQLParserException {
20+
String sqlStr =
21+
"SELECT * FROM DUAL\n\n\nSELECT * FROM DUAL\n/\nSELECT * FROM dual\n/\n\nSELECT * FROM dual";
22+
Statements statements = CCJSqlParserUtil.parseStatements(sqlStr);
23+
Assertions.assertEquals(4, statements.getStatements().size());
24+
}
25+
26+
@Test
27+
void testNewLineGo() throws JSQLParserException {
28+
String sqlStr =
29+
"SELECT * FROM DUAL\n\n\nSELECT * FROM DUAL\nGO\nSELECT * FROM dual\ngo\n\nSELECT * FROM dual\ngo";
30+
Statements statements = CCJSqlParserUtil.parseStatements(sqlStr);
31+
Assertions.assertEquals(4, statements.getStatements().size());
32+
}
33+
34+
@Test
35+
void testOracleBlock() throws JSQLParserException {
36+
String sqlStr = "BEGIN\n" + "\n" + "SELECT * FROM TABLE;\n" + "\n" + "END\n" + "/\n";
37+
Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
38+
System.out.println(statement);
39+
}
40+
41+
@Test
42+
void testMSSQLBlock() throws JSQLParserException {
43+
String sqlStr = "create view MyView1 as\n" + "select Id,Name from table1\n" + "go\n"
44+
+ "create view MyView2 as\n" + "select Id,Name from table1\n" + "go";
45+
Statements statements = CCJSqlParserUtil.parseStatements(sqlStr);
46+
Assertions.assertEquals(2, statements.getStatements().size());
47+
}
48+
}

src/test/java/net/sf/jsqlparser/test/TestUtils.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@
99
*/
1010
package net.sf.jsqlparser.test;
1111

12-
import static org.junit.jupiter.api.Assertions.assertEquals;
13-
import static org.junit.jupiter.api.Assertions.assertNotNull;
14-
import static org.junit.jupiter.api.Assertions.assertNull;
15-
1612
import java.io.File;
1713
import java.io.FileWriter;
1814
import java.io.IOException;
@@ -48,6 +44,8 @@
4844
import org.apache.commons.lang3.builder.ToStringBuilder;
4945
import org.junit.jupiter.api.Test;
5046

47+
import static org.junit.jupiter.api.Assertions.*;
48+
5149
/**
5250
*
5351
* @author toben
@@ -326,7 +324,18 @@ public static String buildSqlString(final String originalSql, boolean laxDeparsi
326324

327325
// assure spacing around Syntax Characters
328326
sanitizedSqlStr = SQL_SANITATION_PATTERN2.matcher(sanitizedSqlStr).replaceAll("$1");
329-
return sanitizedSqlStr.trim().toLowerCase();
327+
328+
sanitizedSqlStr = sanitizedSqlStr.trim().toLowerCase();
329+
330+
// Rewrite statement separators "/" and "GO"
331+
if (sanitizedSqlStr.endsWith("/")) {
332+
sanitizedSqlStr = sanitizedSqlStr.substring(0, sanitizedSqlStr.length() - 1) + ";";
333+
} else if (sanitizedSqlStr.endsWith("go")) {
334+
sanitizedSqlStr = sanitizedSqlStr.substring(0, sanitizedSqlStr.length() - 2) + ";";
335+
}
336+
337+
return sanitizedSqlStr;
338+
330339
} else {
331340
// remove comments only
332341
return SQL_COMMENT_PATTERN.matcher(originalSql).replaceAll("");

src/test/resources/net/sf/jsqlparser/statement/select/large-sql-issue-923-2.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,6 @@ AP_CLAIMS AS
292292

293293
--MAIN QUERY SELECT STARTS HERE
294294

295-
296295
SELECT
297296

298297
--ORIGINAL
@@ -349,7 +348,6 @@ ALL_KINAL_NET_PENALTY,
349348
ALL_KINAL_NET_INTEREST,
350349
ALL_KINAL_STATUS,
351350

352-
353351
-- DUP 5
354352

355353
CASE WHEN ALL_KINAL_STATUS = 'CLEAN' THEN NULL ELSE TRIM(REPLACE(ALL_KINAL_EOB,',',''))END AS ALL_KINAL_EOB,
@@ -368,8 +366,6 @@ CRM_SUBTOPIC
368366
,INFO_CODE3
369367
,INFO_CODE3_ENTRY_DATE
370368

371-
372-
373369
FROM
374370

375371
--MAIN QUERY TABLE BEGINS TEST3

0 commit comments

Comments
 (0)