diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java index 336d66b44..3a3c34394 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java @@ -19,7 +19,6 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; - import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.statement.ReferentialAction; import net.sf.jsqlparser.statement.ReferentialAction.Action; @@ -59,6 +58,7 @@ public class AlterExpression implements Serializable { private String fkSourceTable; private List fkSourceColumns; private boolean uk; + private boolean ukTypeSpecified; private boolean useEqual; private List partitions; @@ -533,6 +533,15 @@ public boolean getUk() { public void setUk(boolean uk) { this.uk = uk; + this.ukTypeSpecified = true; + } + + public boolean isUkTypeSpecified() { + return ukTypeSpecified; + } + + public void setUkTypeSpecified(boolean ukTypeSpecified) { + this.ukTypeSpecified = ukTypeSpecified; } public boolean isUseIfNotExists() { @@ -929,10 +938,14 @@ public String toString() { } else if (ukColumns != null) { b.append("UNIQUE"); if (ukName != null) { - if (getUk()) { - b.append(" KEY "); + if (isUkTypeSpecified()) { + if (getUk()) { + b.append(" KEY "); + } else { + b.append(" INDEX "); + } } else { - b.append(" INDEX "); + b.append(" "); } b.append(ukName); } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 800bc0b61..8dfccf250 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -10220,7 +10220,20 @@ AlterExpression AlterExpression(): ")" ) | - ( (( { alterExp.setUk(true); } | ) (tk= | tk=) { alterExp.setUkName(tk.image); } )? + ( + + ( + ( + { alterExp.setUk(true); } + | { alterExp.setUk(false); } + ) + [ (tk= | tk=) { alterExp.setUkName(tk.image); } ] + | + (tk= | tk=) { + alterExp.setUkTypeSpecified(false); + alterExp.setUkName(tk.image); + } + )? columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); } [ { alterExp.addParameters("USING"); } diff --git a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java index 2e9566e0d..5ac38f726 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -161,6 +161,11 @@ public void testAlterTableUniqueKey() throws JSQLParserException { "ALTER TABLE `schema_migrations` ADD UNIQUE KEY `unique_schema_migrations` (`version`)"); } + @Test + public void testAlterTableUniqueNamedWithoutKeyword() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("ALTER TABLE `goods` ADD UNIQUE `aaa` (`cate_id`)"); + } + @Test public void testAlterTableForgeignKey() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(