Skip to content

Commit c2b5a6a

Browse files
committed
feat(parser): model MySQL CREATE TRIGGER
1 parent b67a52d commit c2b5a6a

11 files changed

Lines changed: 383 additions & 3 deletions

File tree

‎src/main/java/module-info.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
exports net.sf.jsqlparser.statement.create.sequence;
3535
exports net.sf.jsqlparser.statement.create.synonym;
3636
exports net.sf.jsqlparser.statement.create.table;
37+
exports net.sf.jsqlparser.statement.create.trigger;
3738
exports net.sf.jsqlparser.statement.create.user;
3839
exports net.sf.jsqlparser.statement.create.view;
3940
exports net.sf.jsqlparser.statement.delete;

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
2626
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
2727
import net.sf.jsqlparser.statement.create.table.CreateTable;
28+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
2829
import net.sf.jsqlparser.statement.create.user.CreateUser;
2930
import net.sf.jsqlparser.statement.create.view.AlterView;
3031
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -146,6 +147,12 @@ default void visit(CreateTable createTable) {
146147
this.visit(createTable, null);
147148
}
148149

150+
<S> T visit(CreateTrigger createTrigger, S context);
151+
152+
default void visit(CreateTrigger createTrigger) {
153+
this.visit(createTrigger, null);
154+
}
155+
149156
<S> T visit(CreateView createView, S context);
150157

151158
default void visit(CreateView createView) {

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
3030
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
3131
import net.sf.jsqlparser.statement.create.table.CreateTable;
32+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
3233
import net.sf.jsqlparser.statement.create.user.CreateUser;
3334
import net.sf.jsqlparser.statement.create.view.AlterView;
3435
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -285,6 +286,11 @@ public <S> T visit(CreateTable createTable, S context) {
285286
return createTable.getTable().accept(fromItemVisitor, context);
286287
}
287288

289+
@Override
290+
public <S> T visit(CreateTrigger createTrigger, S context) {
291+
return null;
292+
}
293+
288294
@Override
289295
public <S> T visit(CreateView createView, S context) {
290296
return null;
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.trigger;
11+
12+
import net.sf.jsqlparser.schema.Table;
13+
import net.sf.jsqlparser.statement.Statement;
14+
import net.sf.jsqlparser.statement.StatementVisitor;
15+
16+
/** MySQL {@code CREATE TRIGGER} statement with a structured trigger definition. */
17+
public class CreateTrigger implements Statement {
18+
19+
public enum Timing {
20+
BEFORE, AFTER
21+
}
22+
23+
public enum Event {
24+
INSERT, UPDATE, DELETE
25+
}
26+
27+
public enum Order {
28+
FOLLOWS, PRECEDES
29+
}
30+
31+
private TriggerDefiner definer;
32+
private Table trigger;
33+
private Timing timing;
34+
private Event event;
35+
private Table table;
36+
private Order order;
37+
private Table otherTrigger;
38+
private Statement body;
39+
40+
public TriggerDefiner getDefiner() {
41+
return definer;
42+
}
43+
44+
public void setDefiner(TriggerDefiner definer) {
45+
this.definer = definer;
46+
}
47+
48+
public Table getTrigger() {
49+
return trigger;
50+
}
51+
52+
public void setTrigger(Table trigger) {
53+
this.trigger = trigger;
54+
}
55+
56+
public Timing getTiming() {
57+
return timing;
58+
}
59+
60+
public void setTiming(Timing timing) {
61+
this.timing = timing;
62+
}
63+
64+
public Event getEvent() {
65+
return event;
66+
}
67+
68+
public void setEvent(Event event) {
69+
this.event = event;
70+
}
71+
72+
public Table getTable() {
73+
return table;
74+
}
75+
76+
public void setTable(Table table) {
77+
this.table = table;
78+
}
79+
80+
public Order getOrder() {
81+
return order;
82+
}
83+
84+
public void setOrder(Order order) {
85+
this.order = order;
86+
}
87+
88+
public Table getOtherTrigger() {
89+
return otherTrigger;
90+
}
91+
92+
public void setOtherTrigger(Table otherTrigger) {
93+
this.otherTrigger = otherTrigger;
94+
}
95+
96+
public Statement getBody() {
97+
return body;
98+
}
99+
100+
public void setBody(Statement body) {
101+
this.body = body;
102+
}
103+
104+
@Override
105+
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
106+
return statementVisitor.visit(this, context);
107+
}
108+
109+
@Override
110+
public String toString() {
111+
StringBuilder builder = new StringBuilder("CREATE ");
112+
if (definer != null) {
113+
builder.append("DEFINER = ").append(definer).append(" ");
114+
}
115+
builder.append("TRIGGER ").append(trigger).append(" ").append(timing).append(" ")
116+
.append(event).append(" ON ").append(table).append(" FOR EACH ROW ");
117+
if (order != null) {
118+
builder.append(order).append(" ").append(otherTrigger).append(" ");
119+
}
120+
return builder.append(body).toString();
121+
}
122+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.trigger;
11+
12+
import java.io.Serializable;
13+
import net.sf.jsqlparser.expression.StringValue;
14+
15+
/** Structured account used by a MySQL trigger {@code DEFINER} clause. */
16+
public class TriggerDefiner implements Serializable {
17+
18+
private StringValue user;
19+
private StringValue host;
20+
21+
public StringValue getUser() {
22+
return user;
23+
}
24+
25+
public void setUser(StringValue user) {
26+
this.user = user;
27+
}
28+
29+
public StringValue getHost() {
30+
return host;
31+
}
32+
33+
public void setHost(StringValue host) {
34+
this.host = host;
35+
}
36+
37+
@Override
38+
public String toString() {
39+
StringBuilder builder = new StringBuilder().append(user);
40+
if (host != null) {
41+
builder.append("@").append(host);
42+
}
43+
return builder.toString();
44+
}
45+
46+
public TriggerDefiner withUser(StringValue user) {
47+
setUser(user);
48+
return this;
49+
}
50+
51+
public TriggerDefiner withHost(StringValue host) {
52+
setHost(host);
53+
return this;
54+
}
55+
}

‎src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
107107
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
108108
import net.sf.jsqlparser.statement.create.table.CreateTable;
109+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
109110
import net.sf.jsqlparser.statement.create.user.CreateUser;
110111
import net.sf.jsqlparser.statement.create.view.AlterView;
111112
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -1595,6 +1596,20 @@ public void visit(CreateTable createTable) {
15951596
StatementVisitor.super.visit(createTable);
15961597
}
15971598

1599+
@Override
1600+
public <S> Void visit(CreateTrigger createTrigger, S context) {
1601+
createTrigger.getTable().accept(this, context);
1602+
if (createTrigger.getBody() != null) {
1603+
createTrigger.getBody().accept(this, context);
1604+
}
1605+
return null;
1606+
}
1607+
1608+
@Override
1609+
public void visit(CreateTrigger createTrigger) {
1610+
StatementVisitor.super.visit(createTrigger);
1611+
}
1612+
15981613
@Override
15991614
public <S> Void visit(CreateView create, S context) {
16001615
visit(create.getView(), null);

‎src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
5151
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
5252
import net.sf.jsqlparser.statement.create.table.CreateTable;
53+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
5354
import net.sf.jsqlparser.statement.create.user.CreateUser;
5455
import net.sf.jsqlparser.statement.create.view.AlterView;
5556
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -137,6 +138,12 @@ public <S> StringBuilder visit(CreateTable createTable, S context) {
137138
return builder;
138139
}
139140

141+
@Override
142+
public <S> StringBuilder visit(CreateTrigger createTrigger, S context) {
143+
builder.append(createTrigger);
144+
return builder;
145+
}
146+
140147
@Override
141148
public <S> StringBuilder visit(CreateView createView, S context) {
142149
CreateViewDeParser createViewDeParser = new CreateViewDeParser(builder);

‎src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
4949
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
5050
import net.sf.jsqlparser.statement.create.table.CreateTable;
51+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
5152
import net.sf.jsqlparser.statement.create.user.CreateUser;
5253
import net.sf.jsqlparser.statement.create.view.AlterView;
5354
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -91,6 +92,14 @@ public <S> Void visit(CreateTable createTable, S context) {
9192
return null;
9293
}
9394

95+
@Override
96+
public <S> Void visit(CreateTrigger createTrigger, S context) {
97+
if (createTrigger.getBody() != null) {
98+
createTrigger.getBody().accept(this, context);
99+
}
100+
return null;
101+
}
102+
94103
@Override
95104
public <S> Void visit(CreateView createView, S context) {
96105
getValidator(CreateViewValidator.class).validate(createView);
@@ -447,6 +456,10 @@ public void visit(CreateTable createTable) {
447456
visit(createTable, null);
448457
}
449458

459+
public void visit(CreateTrigger createTrigger) {
460+
visit(createTrigger, null);
461+
}
462+
450463
public void visit(CreateView createView) {
451464
visit(createView, null);
452465
}

0 commit comments

Comments
 (0)