|
12 | 12 | import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; |
13 | 13 | import static org.junit.jupiter.api.Assertions.*; |
14 | 14 |
|
| 15 | +import java.io.InputStream; |
| 16 | +import java.nio.charset.StandardCharsets; |
15 | 17 | import java.util.ArrayList; |
16 | 18 | import java.util.List; |
17 | 19 | import net.sf.jsqlparser.JSQLParserException; |
@@ -56,14 +58,35 @@ void roundTripsBodyAndLanguagePosition(String sql) throws Exception { |
56 | 58 |
|
57 | 59 | @Test |
58 | 60 | void preservesProceduralBodyAndFollowingStatementsIssue1946() throws Exception { |
59 | | - String body = "$$\nBEGIN\n IF NOT EXISTS (SELECT 1 FROM comm.permission_operation) THEN\n" |
60 | | - + " INSERT INTO comm.permission_operation (permission_operation_id) VALUES (1) " |
61 | | - + "ON CONFLICT (permission_operation_id) DO NOTHING;\n END IF;\nEND $$"; |
62 | | - Statements statements = CCJSqlParserUtil.parseStatements("DO " + body + "; SELECT 1;", |
63 | | - p -> p.withDialect(Dialect.POSTGRESQL)); |
64 | | - assertEquals(2, statements.size()); |
65 | | - assertEquals(body, ((DoStatement) statements.get(0)).getCode().toString()); |
66 | | - assertEquals("SELECT 1", statements.get(1).toString()); |
| 61 | + String sql; |
| 62 | + try (InputStream input = getClass().getResourceAsStream("/postgresql/do-issue1946.sql")) { |
| 63 | + assertNotNull(input); |
| 64 | + sql = new String(input.readAllBytes(), StandardCharsets.UTF_8).strip(); |
| 65 | + } |
| 66 | + String body = sql.substring(sql.indexOf("$$"), sql.lastIndexOf("$$") + 2); |
| 67 | + Statements statements = |
| 68 | + CCJSqlParserUtil.parseStatements("SELECT 0;\n" + sql + "\nSELECT 1;", |
| 69 | + p -> p.withDialect(Dialect.POSTGRESQL).withUnsupportedStatements(false)); |
| 70 | + assertEquals(3, statements.size()); |
| 71 | + assertEquals("SELECT 0", statements.get(0).toString()); |
| 72 | + DoStatement block = assertInstanceOf(DoStatement.class, statements.get(1)); |
| 73 | + assertEquals(body, block.getCode().toString()); |
| 74 | + assertEquals(body.substring(2, body.length() - 2), block.getCode().getValue()); |
| 75 | + assertEquals("SELECT 1", statements.get(2).toString()); |
| 76 | + |
| 77 | + StringBuilder output = new StringBuilder(); |
| 78 | + for (Statement statement : statements) { |
| 79 | + statement.accept(new StatementDeParser(output), null); |
| 80 | + output.append(";\n"); |
| 81 | + } |
| 82 | + assertEquals("SELECT 0;\nDO " + body + ";\nSELECT 1;\n", output.toString()); |
| 83 | + Statements reparsed = CCJSqlParserUtil.parseStatements(output.toString(), |
| 84 | + p -> p.withDialect(Dialect.POSTGRESQL).withUnsupportedStatements(false)); |
| 85 | + assertEquals(3, reparsed.size()); |
| 86 | + assertEquals(body, |
| 87 | + assertInstanceOf(DoStatement.class, reparsed.get(1)).getCode().toString()); |
| 88 | + assertEquals("SELECT 0", reparsed.get(0).toString()); |
| 89 | + assertEquals("SELECT 1", reparsed.get(2).toString()); |
67 | 90 | } |
68 | 91 |
|
69 | 92 | @Test |
|
0 commit comments