|
10 | 10 | package net.sf.jsqlparser.statement.create.event; |
11 | 11 |
|
12 | 12 | import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; |
| 13 | +import static net.sf.jsqlparser.test.TestUtils.buildSqlString; |
13 | 14 | import static org.junit.jupiter.api.Assertions.assertEquals; |
14 | 15 | import static org.junit.jupiter.api.Assertions.assertFalse; |
15 | 16 | import static org.junit.jupiter.api.Assertions.assertInstanceOf; |
16 | 17 | import static org.junit.jupiter.api.Assertions.assertNull; |
| 18 | +import static org.junit.jupiter.api.Assertions.assertTrue; |
17 | 19 |
|
| 20 | +import java.util.HashSet; |
| 21 | +import java.util.List; |
| 22 | +import java.util.Set; |
| 23 | +import java.util.function.Consumer; |
18 | 24 | import net.sf.jsqlparser.JSQLParserException; |
19 | 25 | import net.sf.jsqlparser.expression.LongValue; |
| 26 | +import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect; |
| 27 | +import net.sf.jsqlparser.parser.CCJSqlParser; |
| 28 | +import net.sf.jsqlparser.parser.CCJSqlParserUtil; |
| 29 | +import net.sf.jsqlparser.statement.Block; |
| 30 | +import net.sf.jsqlparser.statement.Statement; |
| 31 | +import net.sf.jsqlparser.statement.Statements; |
| 32 | +import net.sf.jsqlparser.statement.UnsupportedStatement; |
| 33 | +import net.sf.jsqlparser.statement.delete.Delete; |
20 | 34 | import net.sf.jsqlparser.statement.truncate.Truncate; |
21 | 35 | import net.sf.jsqlparser.statement.update.Update; |
| 36 | +import net.sf.jsqlparser.util.TablesNamesFinder; |
22 | 37 | import org.junit.jupiter.api.Test; |
| 38 | +import org.junit.jupiter.params.ParameterizedTest; |
| 39 | +import org.junit.jupiter.params.provider.ValueSource; |
23 | 40 |
|
24 | 41 | class EventStatementTest { |
25 | 42 |
|
@@ -92,4 +109,88 @@ void parsesCompletionPolicy() throws JSQLParserException { |
92 | 109 | assertFalse(event.getOnCompletionPreserve()); |
93 | 110 | assertEquals(EventStatus.ENABLE, event.getStatus()); |
94 | 111 | } |
| 112 | + |
| 113 | + @ParameterizedTest |
| 114 | + @ValueSource(strings = { |
| 115 | + "CREATE DEFINER = `root`@`localhost` EVENT `e_daily` ON SCHEDULE EVERY 1 DAY " |
| 116 | + + "STARTS CURRENT_TIMESTAMP + INTERVAL 6 HOUR ON COMPLETION NOT PRESERVE " |
| 117 | + + "ENABLE COMMENT 'Saves total number of sessions then clears the table' " |
| 118 | + + "DO BEGIN INSERT INTO site_activity.totals (time, total) " |
| 119 | + + "SELECT CURRENT_TIMESTAMP, COUNT(*) FROM site_activity.sessions; " |
| 120 | + + "DELETE FROM site_activity.sessions; END", |
| 121 | + "CREATE DEFINER = 'admin'@'%' EVENT IF NOT EXISTS ev ON SCHEDULE EVERY 1 HOUR " |
| 122 | + + "DO SELECT 1", |
| 123 | + "CREATE DEFINER = CURRENT_USER() EVENT ev ON SCHEDULE AT CURRENT_TIMESTAMP " |
| 124 | + + "DISABLE ON REPLICA DO SELECT 1", |
| 125 | + "CREATE EVENT ev ON SCHEDULE EVERY 1 DAY DO BEGIN END", |
| 126 | + "CREATE EVENT ev ON SCHEDULE EVERY 1 DAY " |
| 127 | + + "DO BEGIN IF @a > 0 THEN DELETE FROM t1; END IF; END", |
| 128 | + "ALTER DEFINER = CURRENT_USER EVENT ev ON COMPLETION PRESERVE RENAME TO db2.ev2 " |
| 129 | + + "ENABLE COMMENT 'moved' DO SELECT 2", |
| 130 | + "ALTER EVENT ev DISABLE ON REPLICA", |
| 131 | + "ALTER EVENT ev DISABLE ON SLAVE", |
| 132 | + "ALTER EVENT ev DO BEGIN DELETE FROM t1; DELETE FROM t2; END"}) |
| 133 | + void parsesMySqlEventForms(String sql) throws JSQLParserException { |
| 134 | + for (Consumer<CCJSqlParser> consumer : List.<Consumer<CCJSqlParser>>of( |
| 135 | + parser -> parser.withDialect(Dialect.MYSQL), parser -> { |
| 136 | + })) { |
| 137 | + // a statement block prints one statement per line |
| 138 | + Statement event = assertSqlCanBeParsedAndDeparsed(sql, true, consumer); |
| 139 | + assertInstanceOf(EventStatement.class, event); |
| 140 | + Statements script = CCJSqlParserUtil.parseStatements(sql + ";\nSELECT 1", consumer); |
| 141 | + assertEquals(2, script.size()); |
| 142 | + assertEquals(buildSqlString(sql, true), |
| 143 | + buildSqlString(script.get(0).toString(), true)); |
| 144 | + } |
| 145 | + } |
| 146 | + |
| 147 | + @Test |
| 148 | + void parsesDefinerAsShowCreateEventPrintsIt() throws JSQLParserException { |
| 149 | + CreateEvent event = assertInstanceOf(CreateEvent.class, CCJSqlParserUtil.parse( |
| 150 | + "CREATE DEFINER=`root`@`localhost` EVENT `ev` ON SCHEDULE EVERY 1 DAY " |
| 151 | + + "STARTS '2026-01-01 00:00:00' ON COMPLETION NOT PRESERVE ENABLE " |
| 152 | + + "DO DELETE FROM t1")); |
| 153 | + |
| 154 | + assertEquals("root", event.getDefiner().getUser().getValue()); |
| 155 | + assertEquals("localhost", event.getDefiner().getHost().getValue()); |
| 156 | + assertInstanceOf(Delete.class, event.getBody()); |
| 157 | + assertEquals("CREATE DEFINER = `root`@`localhost` EVENT `ev` ON SCHEDULE EVERY 1 DAY " |
| 158 | + + "STARTS '2026-01-01 00:00:00' ON COMPLETION NOT PRESERVE ENABLE " |
| 159 | + + "DO DELETE FROM t1", event.toString()); |
| 160 | + |
| 161 | + AlterEvent altered = assertInstanceOf(AlterEvent.class, CCJSqlParserUtil.parse( |
| 162 | + "ALTER DEFINER = 'admin'@'%' EVENT ev ENABLE")); |
| 163 | + assertEquals("admin", altered.getDefiner().getUser().getValue()); |
| 164 | + assertEquals("%", altered.getDefiner().getHost().getValue()); |
| 165 | + assertEquals(EventStatus.ENABLE, altered.getStatus()); |
| 166 | + } |
| 167 | + |
| 168 | + @Test |
| 169 | + void keepsStatementBlockBodiesStructured() throws JSQLParserException { |
| 170 | + CreateEvent event = assertInstanceOf(CreateEvent.class, CCJSqlParserUtil.parse( |
| 171 | + "CREATE EVENT ev ON SCHEDULE EVERY 1 DAY " |
| 172 | + + "DO BEGIN DELETE FROM a; DELETE FROM b; END", |
| 173 | + parser -> parser.withDialect(Dialect.MYSQL))); |
| 174 | + |
| 175 | + Block body = assertInstanceOf(Block.class, event.getBody()); |
| 176 | + assertEquals(2, body.getStatements().size()); |
| 177 | + assertInstanceOf(Delete.class, body.getStatements().get(0)); |
| 178 | + assertEquals(Set.of("a", "b"), |
| 179 | + new HashSet<>(new TablesNamesFinder<>().getTables((Statement) event))); |
| 180 | + |
| 181 | + AlterEvent altered = assertInstanceOf(AlterEvent.class, CCJSqlParserUtil.parse( |
| 182 | + "ALTER EVENT ev DO BEGIN IF @a > 0 THEN DELETE FROM t1; END IF; END")); |
| 183 | + assertTrue(altered.getBody() instanceof UnsupportedStatement); |
| 184 | + } |
| 185 | + |
| 186 | + @Test |
| 187 | + void parsesDisableOnReplica() throws JSQLParserException { |
| 188 | + AlterEvent event = assertInstanceOf(AlterEvent.class, |
| 189 | + CCJSqlParserUtil.parse("ALTER EVENT ev DISABLE ON REPLICA")); |
| 190 | + assertEquals(EventStatus.DISABLE_ON_REPLICA, event.getStatus()); |
| 191 | + |
| 192 | + event = assertInstanceOf(AlterEvent.class, |
| 193 | + CCJSqlParserUtil.parse("ALTER EVENT ev DISABLE ON SLAVE")); |
| 194 | + assertEquals(EventStatus.DISABLE_ON_SLAVE, event.getStatus()); |
| 195 | + } |
95 | 196 | } |
0 commit comments