Skip to content

Commit 8d419d3

Browse files
committed
fixes #174
1 parent bc4bc9e commit 8d419d3

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

src/main/java/net/sf/jsqlparser/statement/alter/Alter.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,46 @@ public class Alter implements Statement {
4141
private List<String> ukColumns;
4242
private String ukName;
4343

44+
private boolean onDeleteCascade;
45+
46+
public boolean isOnDeleteCascade() {
47+
return onDeleteCascade;
48+
}
49+
50+
public void setOnDeleteCascade(boolean onDeleteCascade) {
51+
this.onDeleteCascade = onDeleteCascade;
52+
}
53+
54+
private List<String> fkColumns;
55+
56+
public List<String> getFkColumns() {
57+
return fkColumns;
58+
}
59+
60+
public void setFkColumns(List<String> fkColumns) {
61+
this.fkColumns = fkColumns;
62+
}
63+
64+
private String fkSourceTable;
65+
66+
public String getFkSourceTable() {
67+
return fkSourceTable;
68+
}
69+
70+
public void setFkSourceTable(String fkSourceTable) {
71+
this.fkSourceTable = fkSourceTable;
72+
}
73+
74+
private List<String> fkSourceColumns;
75+
76+
public List<String> getFkSourceColumns() {
77+
return fkSourceColumns;
78+
}
79+
80+
public void setFkSourceColumns(List<String> fkSourceColumns) {
81+
this.fkSourceColumns = fkSourceColumns;
82+
}
83+
4484
public Table getTable() {
4585
return table;
4686
}
@@ -104,6 +144,11 @@ public String toString() {
104144
b.append("PRIMARY KEY (").append(PlainSelect.getStringList(pkColumns)).append(")");
105145
} else if (ukColumns != null) {
106146
b.append("UNIQUE KEY ").append(ukName).append(" (").append(PlainSelect.getStringList(ukColumns)).append(")");
147+
} else if (fkColumns != null) {
148+
b.append("FOREIGN KEY (").append(PlainSelect.getStringList(fkColumns)).append(") REFERENCES ").append(fkSourceTable).append(" (").append(PlainSelect.getStringList(fkSourceColumns)).append(")");
149+
if (isOnDeleteCascade()) {
150+
b.append(" ON DELETE CASCADE");
151+
}
107152
}
108153
return b.toString();
109154
}

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
225225
| <K_SKIP: "SKIP">
226226
| <K_MERGE: "MERGE">
227227
| <K_MATCHED: "MATCHED">
228+
| <K_CASCADE: "CASCADE">
228229
}
229230

230231
TOKEN : /* Numeric Constants */
@@ -2655,6 +2656,8 @@ String CreateParameter():
26552656
tk=<K_ROWS> { retval = tk.image; }
26562657
|
26572658
tk=<K_UNIQUE> { retval = tk.image; }
2659+
|
2660+
tk=<K_CASCADE> { retval = tk.image; }
26582661
|
26592662
tk=<K_DELETE> { retval = tk.image; }
26602663
|
@@ -2717,7 +2720,7 @@ Drop Drop():
27172720
)
27182721
{ drop.setType(tk.image); }
27192722
name = Table() { drop.setName(name); }
2720-
(tk=<S_IDENTIFIER> { dropArgs.add(tk.image); })*
2723+
((tk=<S_IDENTIFIER> | tk=<K_CASCADE>) { dropArgs.add(tk.image); })*
27212724

27222725
{
27232726
if (dropArgs.size() > 0)
@@ -2745,8 +2748,7 @@ Alter Alter():
27452748
Table table;
27462749
Token tk;
27472750
ColDataType dataType;
2748-
List<String> pkColumnNames = null;
2749-
List<String> ukColumnNames = null;
2751+
List<String> columnNames = null;
27502752
}
27512753
{
27522754
<K_ALTER> <K_TABLE> table=Table() { alter.setTable(table); }
@@ -2762,9 +2764,14 @@ Alter Alter():
27622764
}
27632765
)
27642766
|
2765-
( <K_PRIMARY> <K_KEY> pkColumnNames=ColumnsNamesList() { alter.setPkColumns(pkColumnNames); } )
2767+
( <K_PRIMARY> <K_KEY> columnNames=ColumnsNamesList() { alter.setPkColumns(columnNames); } )
2768+
|
2769+
( <K_UNIQUE> <K_KEY> (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) columnNames=ColumnsNamesList() { alter.setUkName(tk.image); alter.setUkColumns(columnNames); } )
27662770
|
2767-
( <K_UNIQUE> <K_KEY> (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) ukColumnNames=ColumnsNamesList() { alter.setUkName(tk.image); alter.setUkColumns(ukColumnNames); } )
2771+
( <K_FOREIGN> <K_KEY> columnNames=ColumnsNamesList() { alter.setFkColumns(columnNames); }
2772+
<K_REFERENCES> tk=<S_IDENTIFIER> columnNames=ColumnsNamesList()
2773+
{ alter.setFkSourceTable(tk.image); alter.setFkSourceColumns(columnNames); }
2774+
[<K_ON> <K_DELETE> <K_CASCADE> { alter.setOnDeleteCascade(true); } ] )
27682775
)
27692776

27702777
{

src/test/java/net/sf/jsqlparser/test/alter/AlterTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@ public void testAlterTablePrimaryKey() throws JSQLParserException {
3030
public void testAlterTableUniqueKey() throws JSQLParserException {
3131
assertSqlCanBeParsedAndDeparsed("ALTER TABLE `schema_migrations` ADD UNIQUE KEY `unique_schema_migrations` (`version`)");
3232
}
33+
34+
public void testAlterTableForgeignKey() throws JSQLParserException {
35+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE test ADD FOREIGN KEY (user_id) REFERENCES ra_user (id) ON DELETE CASCADE");
36+
}
3337
}

0 commit comments

Comments
 (0)