Skip to content

Commit 3030c35

Browse files
fix: CREATE TABLE UNIQUE vs. UNIQUE KEY
- fixes #2082 - reformat the `CreateTable` production Signed-off-by: Andreas Reichel <[email protected]>
1 parent 229099c commit 3030c35

File tree

2 files changed

+108
-97
lines changed

2 files changed

+108
-97
lines changed

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

Lines changed: 94 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -6217,78 +6217,85 @@ CreateTable CreateTable(boolean isUsingOrReplace):
62176217
[ LOOKAHEAD(2) <K_IF> <K_NOT> <K_EXISTS> { createTable.setIfNotExists(true); }]
62186218
table=Table()
62196219
[ LOOKAHEAD(2) (
6220-
LOOKAHEAD(3)
6221-
("(" tableColumn=RelObjectName() { columns.add(tableColumn); } ("," tableColumn=RelObjectName() { columns.add(tableColumn); } )* ")")
6220+
LOOKAHEAD(3) (
6221+
"(" tableColumn=RelObjectName() { columns.add(tableColumn); } ("," tableColumn=RelObjectName() { columns.add(tableColumn); } )* ")"
6222+
)
62226223
|
6223-
("("
6224-
coldef = ColumnDefinition()
6225-
6226-
{ columnDefinitions.add(coldef); }
6227-
62286224
(
6229-
","
6225+
"("
6226+
coldef = ColumnDefinition() { columnDefinitions.add(coldef); }
62306227

62316228
(
6232-
LOOKAHEAD(3) (
6233-
tk=<K_INDEX>
6229+
","
6230+
(
6231+
LOOKAHEAD(3) (
6232+
{
6233+
idxSpec.clear();
6234+
}
6235+
tk=<K_INDEX>
62346236
sk3=RelObjectName()
6235-
/* colNames=ColumnsNamesList() */
62366237
colNames = ColumnNamesWithParamsList()
6237-
{ idxSpec.clear(); }
62386238
( parameter=CreateParameter() { idxSpec.addAll(parameter); } )*
62396239
{
62406240
index = new Index().withType(tk.image).withName(sk3).withColumns(colNames).withIndexSpec(new ArrayList<String>(idxSpec));
62416241
indexes.add(index);
62426242
}
6243-
)
6244-
|
6245-
LOOKAHEAD(3) (
6246-
{
6247-
index = new NamedConstraint();
6248-
}
6249-
[<K_CONSTRAINT> sk3=RelObjectName() {index.setName(sk3);} ]
6243+
)
6244+
|
6245+
LOOKAHEAD(3) (
6246+
{
6247+
index = new NamedConstraint();
6248+
tk2=null;
6249+
idxSpec.clear();
6250+
}
6251+
[ <K_CONSTRAINT> sk3=RelObjectName() {index.setName(sk3);} ]
6252+
6253+
(
6254+
tk=<K_PRIMARY> tk2=<K_KEY>
6255+
|
6256+
tk=<K_UNIQUE> [ tk2=<K_KEY> ]
6257+
)
6258+
{
6259+
index.setType( tk.image + ( tk2!=null ? " " + tk2.image : "" ));
6260+
tk2=null;
6261+
}
62506262

6251-
(tk=<K_PRIMARY> tk2=<K_KEY> {index.setType(tk.image + " " + tk2.image);}
6252-
| tk=<K_UNIQUE> [ tk2=<K_KEY> ] {index.setType(tk.image + (tk2!=null?" " + tk2.image:""));}
6253-
)
6254-
/* colNames=ColumnsNamesList() */
62556263
colNames = ColumnNamesWithParamsList()
6256-
{ idxSpec.clear(); }
62576264
( parameter=CreateParameter() { idxSpec.addAll(parameter); } )*
62586265
{
62596266
index.withColumns(colNames).withIndexSpec(new ArrayList<String>(idxSpec));
62606267
indexes.add(index);
62616268
}
6262-
// reset Token to null forcefullly
6269+
)
6270+
|
6271+
LOOKAHEAD(3) (
62636272
{
6264-
tk2=null;
6265-
}
6266-
)
6267-
|
6268-
LOOKAHEAD(3) ( {tk=null;}
6269-
[ tk=<K_UNIQUE> ] [ tk3=<K_FULLTEXT> ] tk2=<K_KEY>
6273+
tk=null;
6274+
idxSpec.clear();
6275+
}
6276+
[ tk=<K_UNIQUE> ]
6277+
[ tk3=<K_FULLTEXT> ] tk2=<K_KEY>
62706278
sk3=RelObjectName()
6271-
/* colNames=ColumnsNamesList() */
62726279
colNames = ColumnNamesWithParamsList()
6273-
{ idxSpec.clear(); }
62746280
( parameter=CreateParameter() { idxSpec.addAll(parameter); } )*
62756281
{
62766282
index = new Index()
6277-
.withType((tk!=null?tk.image + " ":"") + (tk3!=null?tk3.image + " ":"") + tk2.image)
6278-
.withName(sk3)
6279-
.withColumns(colNames)
6280-
.withIndexSpec(new ArrayList<String>(idxSpec));
6283+
.withType( ( tk!=null ? tk.image + " " : "") + ( tk3!=null ? tk3.image + " ":"" ) + tk2.image)
6284+
.withName(sk3)
6285+
.withColumns(colNames)
6286+
.withIndexSpec(new ArrayList<String>(idxSpec));
62816287
indexes.add(index);
62826288
}
6283-
)
6284-
|
6285-
LOOKAHEAD(3)(
6286-
{
6287-
fkIndex = new ForeignKeyIndex();
6288-
}
6289-
[<K_CONSTRAINT> sk3=RelObjectName() {fkIndex.setName(sk3);} ]
6290-
tk=<K_FOREIGN> tk2=<K_KEY>
6291-
/* colNames=ColumnsNamesList() */
6289+
)
6290+
|
6291+
LOOKAHEAD(3)(
6292+
{
6293+
fkIndex = new ForeignKeyIndex();
6294+
sk3=null;
6295+
6296+
}
6297+
[ <K_CONSTRAINT> sk3=RelObjectName() { fkIndex.setName(sk3); } ]
6298+
tk=<K_FOREIGN> tk2=<K_KEY>
62926299
colNames = ColumnNamesWithParamsList()
62936300
{
62946301
fkIndex.withType(tk.image + " " + tk2.image).withColumns(colNames);
@@ -6299,60 +6306,50 @@ CreateTable CreateTable(boolean isUsingOrReplace):
62996306
fkIndex.setReferencedColumnNames(colNames2);
63006307
indexes.add(fkIndex);
63016308
}
6302-
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6303-
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6304-
)]
6305-
[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6306-
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6307-
)]
6308-
)
6309-
|
6310-
LOOKAHEAD(3)(
6311-
[<K_CONSTRAINT> sk3 = RelObjectName()]
6312-
{Expression exp = null;}
6313-
<K_CHECK> ("(" exp = Expression() ")")* {
6314-
checkCs = new CheckConstraint().withName(sk3).withExpression(exp);
6315-
indexes.add(checkCs);
6316-
}
6317-
)
6318-
|
6319-
LOOKAHEAD(2) tk=<K_EXCLUDE> {excludeC = new ExcludeConstraint(); Expression exp = null;}
6320-
(tk2=<K_WHERE>
6321-
("(" exp = Expression() ")")* {excludeC.setExpression(exp);})
6322-
{
6323-
indexes.add(excludeC);
6324-
}
6325-
|
6326-
(
6327-
6328-
coldef = ColumnDefinition()
6329-
6330-
/*
6331-
columnName=RelObjectName()
6332-
6333-
colDataType = ColDataType()
6334-
{
6335-
columnSpecs = new ArrayList<String>();
6336-
}
6337-
6338-
( parameter=CreateParameter() { columnSpecs.addAll(parameter); } )*
6339-
6340-
{
6341-
coldef = new ColumnDefinition();
6342-
coldef.setColumnName(columnName);
6343-
coldef.setColDataType(colDataType);
6344-
if (columnSpecs.size() > 0)
6345-
coldef.setColumnSpecs(columnSpecs);
6346-
columnDefinitions.add(coldef);
6347-
} */
6348-
{ columnDefinitions.add(coldef); }
6309+
[ LOOKAHEAD(2) (
6310+
<K_ON>
6311+
( tk=<K_DELETE> | tk=<K_UPDATE> ) action = Action()
6312+
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6313+
)
6314+
]
6315+
[ LOOKAHEAD(2) (
6316+
<K_ON>
6317+
( tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
6318+
{ fkIndex.setReferentialAction(ReferentialAction.Type.from(tk.image), action); }
6319+
)
6320+
]
6321+
)
6322+
|
6323+
LOOKAHEAD(3)(
6324+
{
6325+
sk3 = null;
6326+
Expression exp = null;
6327+
}
6328+
[ <K_CONSTRAINT> sk3 = RelObjectName() ]
6329+
<K_CHECK> ( "(" exp = Expression() ")" )*
6330+
{
6331+
checkCs = new CheckConstraint().withName(sk3).withExpression(exp);
6332+
indexes.add(checkCs);
6333+
}
6334+
)
6335+
|
6336+
LOOKAHEAD(2) tk=<K_EXCLUDE> {excludeC = new ExcludeConstraint(); Expression exp = null;}
6337+
(tk2=<K_WHERE>
6338+
("(" exp = Expression() ")")* {excludeC.setExpression(exp);})
6339+
{
6340+
indexes.add(excludeC);
6341+
}
6342+
|
6343+
(
6344+
coldef = ColumnDefinition()
6345+
{ columnDefinitions.add(coldef); }
6346+
)
63496347
)
6350-
)
6351-
)*
6348+
)*
63526349

6353-
")"
6350+
")"
63546351
)
6355-
)
6352+
)
63566353
]
63576354
( LOOKAHEAD(2, { getToken(1).kind != K_AS }) parameter=CreateParameter() { tableOptions.addAll(parameter); } )*
63586355

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,4 +1059,18 @@ void testIssue1864() throws JSQLParserException {
10591059
+ " CHARACTER SET armscii8 COLLATE armscii8_bin NULL DEFAULT NULL FIRST";
10601060
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
10611061
}
1062+
1063+
@Test
1064+
void testUniqueAfterForeignKeyIssue2082() throws JSQLParserException {
1065+
String sqlStr =
1066+
"CREATE TABLE employees (\n" +
1067+
"employee_number int NOT NULL\n" +
1068+
", employee_name char (50) NOT NULL\n" +
1069+
", department_id int\n" +
1070+
", salary int\n" +
1071+
", PRIMARY KEY (employee_number)\n" +
1072+
", FOREIGN KEY (department_id) REFERENCES departments(id)\n" +
1073+
", UNIQUE (employee_name));";
1074+
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
1075+
}
10621076
}

0 commit comments

Comments
 (0)