Skip to content

Commit cff5c80

Browse files
committed
Merge pull request #220 from pabloa/mysql
Added reference options foreign keys support (ON UPDATE/DELETE NO ACT…
2 parents 62cf81d + c29565b commit cff5c80

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed

src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
public class ForeignKeyIndex extends NamedConstraint {
3333
private Table table;
3434
private List<String> referencedColumnNames;
35+
private String onDeleteReferenceOption;
36+
private String onUpdateReferenceOption;
3537

3638
public Table getTable() {
3739
return table;
@@ -49,9 +51,33 @@ public void setReferencedColumnNames(List<String> referencedColumnNames) {
4951
this.referencedColumnNames = referencedColumnNames;
5052
}
5153

54+
public String getOnDeleteReferenceOption() {
55+
return onDeleteReferenceOption;
56+
}
57+
58+
public void setOnDeleteReferenceOption(String onDeleteReferenceOption) {
59+
this.onDeleteReferenceOption = onDeleteReferenceOption;
60+
}
61+
62+
public String getOnUpdateReferenceOption() {
63+
return onUpdateReferenceOption;
64+
}
65+
66+
public void setOnUpdateReferenceOption(String onUpdateReferenceOption) {
67+
this.onUpdateReferenceOption = onUpdateReferenceOption;
68+
}
69+
5270
@Override
5371
public String toString() {
72+
String referenceOptions = "";
73+
if(onDeleteReferenceOption != null) {
74+
referenceOptions += " ON DELETE " + onDeleteReferenceOption;
75+
}
76+
if(onUpdateReferenceOption != null) {
77+
referenceOptions += " ON UPDATE " + onUpdateReferenceOption;
78+
}
5479
return super.toString()
55-
+ " REFERENCES " + table + PlainSelect.getStringList(getReferencedColumnNames(), true, true);
80+
+ " REFERENCES " + table + PlainSelect.getStringList(getReferencedColumnNames(), true, true)
81+
+ referenceOptions;
5682
}
5783
}

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
166166
| <K_VALUES:"VALUES">
167167
| <K_ESCAPE:"ESCAPE">
168168
| <K_PRIMARY:"PRIMARY">
169+
| <K_FULLTEXT:"FULLTEXT">
169170
| <K_NATURAL:"NATURAL">
170171
| <K_REPLACE:"REPLACE">
171172
| <K_BETWEEN:"BETWEEN">
@@ -227,6 +228,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
227228
| <K_MATCHED: "MATCHED">
228229
| <K_CASCADE: "CASCADE">
229230
| <K_RESTRICT: "RESTRICT">
231+
| <K_NO_ACTION: "NO ACTION">
230232
| <K_DUPLICATE: "DUPLICATE">
231233
| <K_LOW_PRIORITY : "LOW_PRIORITY">
232234
| <K_DELAYED : "DELAYED">
@@ -2589,7 +2591,7 @@ CreateTable CreateTable():
25892591
)
25902592
|
25912593
LOOKAHEAD(3) ( {tk=null;}
2592-
[ tk=<K_UNIQUE> ] tk2=<K_KEY>
2594+
[ tk=<K_UNIQUE> ] [ tk=<K_FULLTEXT> ] tk2=<K_KEY>
25932595
sk3=RelObjectName()
25942596
colNames=ColumnsNamesList()
25952597
{
@@ -2618,6 +2620,8 @@ CreateTable CreateTable():
26182620
fkIndex.setReferencedColumnNames(colNames);
26192621
indexes.add(fkIndex);
26202622
}
2623+
[LOOKAHEAD(2) (<K_ON> <K_DELETE> (<K_CASCADE> {fkIndex.setOnDeleteReferenceOption("CASCADE");}|<K_NO_ACTION> {fkIndex.setOnDeleteReferenceOption("NO ACTION");}))]
2624+
[LOOKAHEAD(2) (<K_ON> <K_UPDATE> (<K_CASCADE> {fkIndex.setOnUpdateReferenceOption("CASCADE");}|<K_NO_ACTION> {fkIndex.setOnUpdateReferenceOption("NO ACTION");}))]
26212625
)
26222626
|
26232627
(

src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -169,16 +169,28 @@ public void testCreateTableColumnValue() throws JSQLParserException {
169169
}
170170

171171
public void testCreateTableForeignKey5() throws JSQLParserException {
172-
assertSqlCanBeParsedAndDeparsed("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY AUTO_INCREMENT, aid INTEGER REFERENCES accounts ON aid ON DELETE CASCADE, name STRING, lastname STRING)");
173-
}
174-
175-
public void testCreateTableForeignKey6() throws JSQLParserException {
176-
assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (id long, fkey long references another_table (id))");
177-
}
172+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY AUTO_INCREMENT, aid INTEGER REFERENCES accounts ON aid ON DELETE CASCADE, name STRING, lastname STRING)");
173+
}
178174

179-
public void testCreateTableMySqlOnUpdateCurrentTimestamp() throws JSQLParserException {
180-
assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (applied timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)");
181-
}
175+
public void testCreateTableForeignKey6() throws JSQLParserException {
176+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (id long, fkey long references another_table (id))");
177+
}
178+
179+
public void testMySqlCreateTableOnUpdateCurrentTimestamp() throws JSQLParserException {
180+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (applied timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)");
181+
}
182+
183+
public void testMySqlCreateTableWithConstraintWithCascade() throws JSQLParserException {
184+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE CASCADE, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE CASCADE) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8");
185+
}
186+
187+
public void testMySqlCreateTableWithConstraintWithNoAction() throws JSQLParserException {
188+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE NO ACTION) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8");
189+
}
190+
191+
public void testMySqlCreateTableWithTextIndexes() throws JSQLParserException {
192+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, name TEXT, url TEXT, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FULLTEXT KEY idx_table2_name (name)) ENGINE = InnoDB AUTO_INCREMENT = 7334 DEFAULT CHARSET = utf8");
193+
}
182194

183195
public void testRUBiSCreateList() throws Exception {
184196
BufferedReader in = new BufferedReader(new InputStreamReader(CreateTableTest.class.getResourceAsStream("/RUBiS-create-requests.txt")));

0 commit comments

Comments
 (0)