|
12 | 12 | import static org.junit.jupiter.api.Assertions.*; |
13 | 13 | import java.util.ArrayList; |
14 | 14 | import java.util.List; |
| 15 | +import java.util.stream.Collectors; |
15 | 16 | import net.sf.jsqlparser.JSQLParserException; |
16 | 17 | import net.sf.jsqlparser.expression.Expression; |
17 | 18 | import net.sf.jsqlparser.expression.NullValue; |
18 | 19 | import net.sf.jsqlparser.expression.StringValue; |
19 | 20 | import net.sf.jsqlparser.parser.CCJSqlParserUtil; |
| 21 | +import net.sf.jsqlparser.schema.Table; |
| 22 | +import net.sf.jsqlparser.statement.CascadeBehavior; |
20 | 23 | import net.sf.jsqlparser.statement.Statement; |
21 | 24 | import net.sf.jsqlparser.statement.StatementVisitorAdapter; |
22 | 25 | import net.sf.jsqlparser.statement.alter.AlterForeignDataWrapper; |
|
27 | 30 | import net.sf.jsqlparser.statement.create.server.CreateServer; |
28 | 31 | import net.sf.jsqlparser.statement.create.table.ForeignDataOption; |
29 | 32 | import net.sf.jsqlparser.statement.create.usermapping.CreateUserMapping; |
| 33 | +import net.sf.jsqlparser.statement.drop.Drop; |
| 34 | +import net.sf.jsqlparser.statement.drop.DropUserMapping; |
30 | 35 | import net.sf.jsqlparser.statement.foreign.ForeignDataStatement; |
31 | 36 | import net.sf.jsqlparser.util.TablesNamesFinder; |
32 | 37 | import net.sf.jsqlparser.util.deparser.StatementDeParser; |
@@ -70,6 +75,50 @@ void foreignObjectsShareOptionsAndKeepBoundaries(String sql) throws JSQLParserEx |
70 | 75 | assertFalse(new Validation(List.of(FeaturesAllowed.SELECT), sql).validate().isEmpty()); |
71 | 76 | } |
72 | 77 |
|
| 78 | + @ParameterizedTest |
| 79 | + @ValueSource(strings = {"DROP FOREIGN DATA WRAPPER w", |
| 80 | + "DROP FOREIGN DATA WRAPPER IF EXISTS w1, w2 CASCADE", |
| 81 | + "DROP FOREIGN DATA WRAPPER w RESTRICT", |
| 82 | + "DROP USER MAPPING FOR CURRENT_USER SERVER s", |
| 83 | + "DROP USER MAPPING IF EXISTS FOR PUBLIC SERVER s", |
| 84 | + "DROP USER MAPPING FOR USER SERVER s", |
| 85 | + "DROP USER MAPPING FOR \"user name\" SERVER \"server name\""}) |
| 86 | + void dropsForeignDataObjects(String sql) throws JSQLParserException { |
| 87 | + Statement statement = CCJSqlParserUtil.parse(sql); |
| 88 | + assertEquals(sql, statement.toString()); |
| 89 | + assertTrue(new TablesNamesFinder().getTables(statement).isEmpty()); |
| 90 | + roundTrip(statement); |
| 91 | + assertEquals(2, CCJSqlParserUtil.parseStatements(sql + "; SELECT 1").size()); |
| 92 | + assertTrue(new Validation(List.of(FeaturesAllowed.DDL), sql).validate().isEmpty()); |
| 93 | + assertFalse(new Validation(List.of(FeaturesAllowed.SELECT), sql).validate().isEmpty()); |
| 94 | + } |
| 95 | + |
| 96 | + @Test |
| 97 | + void dropStatementsKeepObjectKindAndMappingKey() throws JSQLParserException { |
| 98 | + Drop wrapper = (Drop) CCJSqlParserUtil.parse( |
| 99 | + "DROP FOREIGN DATA WRAPPER IF EXISTS w1, w2 CASCADE"); |
| 100 | + assertEquals(Drop.ObjectType.FOREIGN_DATA_WRAPPER, wrapper.getObjectType()); |
| 101 | + assertEquals(List.of("w1", "w2"), |
| 102 | + wrapper.getNames().stream().map(Table::getFullyQualifiedName) |
| 103 | + .collect(Collectors.toList())); |
| 104 | + assertTrue(wrapper.isIfExists()); |
| 105 | + assertEquals(CascadeBehavior.CASCADE, wrapper.getBehavior()); |
| 106 | + |
| 107 | + DropUserMapping mapping = (DropUserMapping) CCJSqlParserUtil.parse( |
| 108 | + "DROP USER MAPPING IF EXISTS FOR CURRENT_USER SERVER s"); |
| 109 | + assertTrue(mapping.isIfExists()); |
| 110 | + assertEquals("CURRENT_USER", mapping.getUser()); |
| 111 | + assertEquals("s", mapping.getServer()); |
| 112 | + mapping.setIfExists(false); |
| 113 | + mapping.setServer("s2"); |
| 114 | + assertEquals("DROP USER MAPPING FOR CURRENT_USER SERVER s2", mapping.toString()); |
| 115 | + roundTrip(mapping); |
| 116 | + |
| 117 | + // MAPPING followed by neither FOR nor IF is still a user name |
| 118 | + Drop user = (Drop) CCJSqlParserUtil.parse("DROP USER mapping"); |
| 119 | + assertEquals(Drop.ObjectType.USER, user.getObjectType()); |
| 120 | + } |
| 121 | + |
73 | 122 | @Test |
74 | 123 | void omittedAndRemovedHandlersStayDistinct() throws JSQLParserException { |
75 | 124 | CreateForeignDataWrapper create = (CreateForeignDataWrapper) CCJSqlParserUtil.parse( |
@@ -210,7 +259,9 @@ public <S> String visit(CreateUserMapping statement, S context) { |
210 | 259 | "ALTER SERVER s OPTIONS(SET x)", "ALTER SERVER s OPTIONS(DROP x 'y')", |
211 | 260 | "ALTER SERVER s OPTIONS()", "ALTER SERVER s OPTIONS(host = 'localhost')", |
212 | 261 | "CREATE SERVER s TYPE NULL FOREIGN DATA WRAPPER w", "ALTER SERVER s VERSION 18", |
213 | | - "ALTER SERVER s RENAME TO s2 OPTIONS(x 'y')"}) |
| 262 | + "ALTER SERVER s RENAME TO s2 OPTIONS(x 'y')", |
| 263 | + "DROP USER MAPPING FOR u", "DROP USER MAPPING FOR u SERVER s CASCADE", |
| 264 | + "DROP USER MAPPING IF EXISTS u SERVER s"}) |
214 | 265 | void rejectsWrongObjectAndOptionForms(String sql) { |
215 | 266 | assertThrows(JSQLParserException.class, () -> CCJSqlParserUtil.parse(sql)); |
216 | 267 | } |
|
0 commit comments