Skip to content

Commit 0c41f27

Browse files
committed
create table can now have foreign key definitions
fixes #14
1 parent 8c37ca2 commit 0c41f27

File tree

6 files changed

+106
-20
lines changed

6 files changed

+106
-20
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ Original project websites:
1515

1616
## Extensions Version 0.8.4
1717

18+
* Added support for foreign keys in create table statements
19+
20+
```sql
21+
create table testTable1 (a varchar(10), b varchar(20), foreign key a references testTable2(a))
22+
create table testTable1 (a varchar(10), b varchar(20), constraint fkIdx foreign key a references testTable2(a))
23+
```
1824
* Added support for simple intervals
1925

2026
```sql

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ public void setColumnName(String string) {
6868

6969
@Override
7070
public String toString() {
71-
return columnName + " " + colDataType + " " + PlainSelect.getStringList(columnSpecStrings, false, false);
71+
return columnName + " " + colDataType + (columnSpecStrings != null ? " " + PlainSelect.getStringList(columnSpecStrings, false, false) : "");
7272
}
7373
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2013 JSQLParser
6+
* %%
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation, either version 2.1 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Lesser Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Lesser Public
18+
* License along with this program. If not, see
19+
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
20+
* #L%
21+
*/
22+
package net.sf.jsqlparser.statement.create.table;
23+
24+
import java.util.List;
25+
import net.sf.jsqlparser.schema.Table;
26+
import net.sf.jsqlparser.statement.select.PlainSelect;
27+
28+
/**
29+
* Foreign Key Index
30+
* @author toben
31+
*/
32+
public class ForeignKeyIndex extends Index {
33+
private Table table;
34+
private List<String> referencedColumnNames;
35+
36+
public Table getTable() {
37+
return table;
38+
}
39+
40+
public void setTable(Table table) {
41+
this.table = table;
42+
}
43+
44+
public List<String> getReferencedColumnNames() {
45+
return referencedColumnNames;
46+
}
47+
48+
public void setReferencedColumnNames(List<String> referencedColumnNames) {
49+
this.referencedColumnNames = referencedColumnNames;
50+
}
51+
52+
@Override
53+
public String toString() {
54+
return (getName()!=null?"CONSTRAINT " + getName() + " ":"")
55+
+ getType() + " " + PlainSelect.getStringList(getColumnsNames(), true, true)
56+
+ " REFERENCES " + table + PlainSelect.getStringList(getReferencedColumnNames(), true, true);
57+
}
58+
}

src/main/java/net/sf/jsqlparser/util/deparser/CreateTableDeParser.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,32 +59,19 @@ public void deParse(CreateTable createTable) {
5959
}
6060

6161
if (iter.hasNext()) {
62-
buffer.append(" , ");
62+
buffer.append(", ");
6363
}
64-
6564
}
6665

6766
if (createTable.getIndexes() != null) {
6867
for (Iterator<Index> iter = createTable.getIndexes().iterator(); iter.hasNext();) {
69-
buffer.append(",");
68+
buffer.append(", ");
7069
Index index = iter.next();
71-
buffer.append(index.getType()).append(" ").append(index.getName());
72-
buffer.append("(");
73-
for (Iterator<String> iterator = index.getColumnsNames().iterator(); iterator.hasNext();) {
74-
buffer.append(iterator.next());
75-
if (iterator.hasNext()) {
76-
buffer.append(", ");
77-
}
78-
}
79-
buffer.append(")");
80-
81-
if (iter.hasNext()) {
82-
buffer.append(",");
83-
}
70+
buffer.append(index.toString());
8471
}
8572
}
8673

87-
buffer.append(" )");
74+
buffer.append(")");
8875
}
8976
}
9077

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
115115
import net.sf.jsqlparser.statement.create.table.CreateTable;
116116
import net.sf.jsqlparser.statement.create.view.CreateView;
117117
import net.sf.jsqlparser.statement.create.table.Index;
118+
import net.sf.jsqlparser.statement.create.table.ForeignKeyIndex;
118119
import net.sf.jsqlparser.statement.delete.Delete;
119120
import net.sf.jsqlparser.statement.drop.Drop;
120121
import net.sf.jsqlparser.statement.insert.Insert;
@@ -241,6 +242,9 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
241242
| <K_LATERAL:"LATERAL">
242243
| <K_MATERIALIZED:"MATERIALIZED">
243244
| <K_INTERVAL:"INTERVAL">
245+
| <K_FOREIGN:"FOREIGN">
246+
| <K_CONSTRAINT:"CONSTRAINT">
247+
| <K_REFERENCES:"REFERENCES">
244248
}
245249

246250

@@ -1806,7 +1810,9 @@ CreateTable CreateTable():
18061810
List indexes = new ArrayList();
18071811
List colNames = null;
18081812
Index index = null;
1813+
ForeignKeyIndex fkIndex = null;
18091814
String parameter = null;
1815+
Table fkTable = null;
18101816
}
18111817
{
18121818
<K_CREATE>
@@ -1878,6 +1884,25 @@ CreateTable CreateTable():
18781884
}
18791885
)
18801886
|
1887+
(
1888+
{
1889+
fkIndex = new ForeignKeyIndex();
1890+
}
1891+
[<K_CONSTRAINT> tk3=<S_IDENTIFIER> {fkIndex.setName(tk3.image);} ]
1892+
tk=<K_FOREIGN> tk2=<K_KEY>
1893+
colNames=ColumnsNamesList()
1894+
{
1895+
fkIndex.setType(tk.image + " " + tk2.image);
1896+
fkIndex.setColumnsNames(colNames);
1897+
}
1898+
<K_REFERENCES> fkTable=Table() colNames=ColumnsNamesList()
1899+
{
1900+
fkIndex.setTable(fkTable);
1901+
fkIndex.setReferencedColumnNames(colNames);
1902+
indexes.add(fkIndex);
1903+
}
1904+
)
1905+
|
18811906
(
18821907
(columnName=<S_IDENTIFIER>
18831908
|

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ public CreateTableTest(String arg0) {
2727
}
2828

2929
public void testCreateTable2() throws JSQLParserException {
30-
String statement = "CREATE TABLE testtab (\"test\" varchar (255) )";
30+
String statement = "CREATE TABLE testtab (\"test\" varchar (255))";
3131
assertSqlCanBeParsedAndDeparsed(statement);
3232
}
3333

3434
public void testCreateTable3() throws JSQLParserException {
35-
String statement = "CREATE TABLE testtab (\"test\" varchar (255) , \"test\" varchar (255) )";
35+
String statement = "CREATE TABLE testtab (\"test\" varchar (255), \"test2\" varchar (255))";
3636
assertSqlCanBeParsedAndDeparsed(statement);
3737
}
3838

@@ -47,6 +47,16 @@ public void testCreateTable() throws JSQLParserException {
4747
assertEquals("mycol", ((Index) createTable.getIndexes().get(0)).getColumnsNames().get(1));
4848
assertEquals(statement, "" + createTable);
4949
}
50+
51+
public void testCreateTableForeignKey() throws JSQLParserException {
52+
String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES ra_user(id))";
53+
assertSqlCanBeParsedAndDeparsed(statement);
54+
}
55+
56+
public void testCreateTableForeignKey2() throws JSQLParserException {
57+
String statement = "CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR (20), user_id INT UNSIGNED, PRIMARY KEY (id), CONSTRAINT fkIdx FOREIGN KEY (user_id) REFERENCES ra_user(id))";
58+
assertSqlCanBeParsedAndDeparsed(statement);
59+
}
5060

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

0 commit comments

Comments
 (0)