Skip to content

Commit 6329af6

Browse files
committed
feat(parser): model MySQL CREATE TRIGGER
1 parent 628e3c1 commit 6329af6

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
@@ -33,6 +33,7 @@
3333
exports net.sf.jsqlparser.statement.create.sequence;
3434
exports net.sf.jsqlparser.statement.create.synonym;
3535
exports net.sf.jsqlparser.statement.create.table;
36+
exports net.sf.jsqlparser.statement.create.trigger;
3637
exports net.sf.jsqlparser.statement.create.user;
3738
exports net.sf.jsqlparser.statement.create.view;
3839
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
@@ -23,6 +23,7 @@
2323
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
2424
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
2525
import net.sf.jsqlparser.statement.create.table.CreateTable;
26+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
2627
import net.sf.jsqlparser.statement.create.user.CreateUser;
2728
import net.sf.jsqlparser.statement.create.view.AlterView;
2829
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -138,6 +139,12 @@ default void visit(CreateTable createTable) {
138139
this.visit(createTable, null);
139140
}
140141

142+
<S> T visit(CreateTrigger createTrigger, S context);
143+
144+
default void visit(CreateTrigger createTrigger) {
145+
this.visit(createTrigger, null);
146+
}
147+
141148
<S> T visit(CreateView createView, S context);
142149

143150
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
@@ -27,6 +27,7 @@
2727
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
2828
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
2929
import net.sf.jsqlparser.statement.create.table.CreateTable;
30+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
3031
import net.sf.jsqlparser.statement.create.user.CreateUser;
3132
import net.sf.jsqlparser.statement.create.view.AlterView;
3233
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -278,6 +279,11 @@ public <S> T visit(CreateTable createTable, S context) {
278279
return createTable.getTable().accept(fromItemVisitor, context);
279280
}
280281

282+
@Override
283+
public <S> T visit(CreateTrigger createTrigger, S context) {
284+
return null;
285+
}
286+
281287
@Override
282288
public <S> T visit(CreateView createView, S context) {
283289
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
@@ -104,6 +104,7 @@
104104
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
105105
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
106106
import net.sf.jsqlparser.statement.create.table.CreateTable;
107+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
107108
import net.sf.jsqlparser.statement.create.user.CreateUser;
108109
import net.sf.jsqlparser.statement.create.view.AlterView;
109110
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -1580,6 +1581,20 @@ public void visit(CreateTable createTable) {
15801581
StatementVisitor.super.visit(createTable);
15811582
}
15821583

1584+
@Override
1585+
public <S> Void visit(CreateTrigger createTrigger, S context) {
1586+
createTrigger.getTable().accept(this, context);
1587+
if (createTrigger.getBody() != null) {
1588+
createTrigger.getBody().accept(this, context);
1589+
}
1590+
return null;
1591+
}
1592+
1593+
@Override
1594+
public void visit(CreateTrigger createTrigger) {
1595+
StatementVisitor.super.visit(createTrigger);
1596+
}
1597+
15831598
@Override
15841599
public <S> Void visit(CreateView create, S context) {
15851600
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
@@ -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;
@@ -135,6 +136,12 @@ public <S> StringBuilder visit(CreateTable createTable, S context) {
135136
return builder;
136137
}
137138

139+
@Override
140+
public <S> StringBuilder visit(CreateTrigger createTrigger, S context) {
141+
builder.append(createTrigger);
142+
return builder;
143+
}
144+
138145
@Override
139146
public <S> StringBuilder visit(CreateView createView, S context) {
140147
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
@@ -46,6 +46,7 @@
4646
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
4747
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
4848
import net.sf.jsqlparser.statement.create.table.CreateTable;
49+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
4950
import net.sf.jsqlparser.statement.create.user.CreateUser;
5051
import net.sf.jsqlparser.statement.create.view.AlterView;
5152
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -89,6 +90,14 @@ public <S> Void visit(CreateTable createTable, S context) {
8990
return null;
9091
}
9192

93+
@Override
94+
public <S> Void visit(CreateTrigger createTrigger, S context) {
95+
if (createTrigger.getBody() != null) {
96+
createTrigger.getBody().accept(this, context);
97+
}
98+
return null;
99+
}
100+
92101
@Override
93102
public <S> Void visit(CreateView createView, S context) {
94103
getValidator(CreateViewValidator.class).validate(createView);
@@ -429,6 +438,10 @@ public void visit(CreateTable createTable) {
429438
visit(createTable, null);
430439
}
431440

441+
public void visit(CreateTrigger createTrigger) {
442+
visit(createTrigger, null);
443+
}
444+
432445
public void visit(CreateView createView) {
433446
visit(createView, null);
434447
}

0 commit comments

Comments
 (0)