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 0c5dfc67c..b5b925a44 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java @@ -40,6 +40,8 @@ public class AlterExpression { private List fkColumns; private String fkSourceTable; private List fkSourceColumns; + private boolean uk; + private boolean useEqual; private List constraints; private List parameters; @@ -206,6 +208,22 @@ public List getParameters() { return parameters; } + public boolean getUseEqual() { + return useEqual; + } + + public void setUseEqual(boolean useEqual) { + this.useEqual = useEqual; + } + + public boolean getUk() { + return uk; + } + + public void setUk(boolean uk) { + this.uk = uk; + } + @Override public String toString() { @@ -241,7 +259,12 @@ public String toString() { } else if (ukColumns != null) { b.append("UNIQUE"); if (ukName != null) { - b.append(" KEY ").append(ukName); + if (getUk()) { + b.append(" KEY "); + } else { + b.append(" INDEX "); + } + b.append(ukName); } b.append(" (").append(PlainSelect.getStringList(ukColumns)).append(")"); } else if (fkColumns != null) { @@ -261,6 +284,9 @@ public String toString() { if (getConstraints() != null && !getConstraints().isEmpty()) { b.append(' ').append(PlainSelect.getStringList(constraints, false, false)); } + if (getUseEqual()) { + b.append('='); + } if (parameters!=null && !parameters.isEmpty()) { b.append(' ').append(PlainSelect.getStringList(parameters, false, false)); } diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java index 728ab5f7d..53b278937 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java @@ -10,5 +10,5 @@ package net.sf.jsqlparser.statement.alter; public enum AlterOperation { - ADD, ALTER, DROP, MODIFY, CHANGE; + ADD, ALTER, DROP, MODIFY, CHANGE, ALGORITHM; } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 5f4b2b71d..8e29fff36 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -106,6 +106,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ { | +| | | | @@ -3785,6 +3786,7 @@ AlterExpression AlterExpression(): Token tk; Token tk2 = null; String sk3 = null; + String sk4 = null; ColDataType dataType; List columnNames = null; List constraints = null; @@ -3798,10 +3800,13 @@ AlterExpression AlterExpression(): ( (( { alterExp.setOperation(AlterOperation.ADD); } | { alterExp.setOperation(AlterOperation.ALTER); } | { alterExp.setOperation(AlterOperation.MODIFY); }) ( - LOOKAHEAD(2) ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); } ) constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + LOOKAHEAD(2) ( + columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); } + ) constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] | LOOKAHEAD(2) ( - tk = < K_INDEX > + (tk= { alterExp.setUk(true); } | tk=) sk3 = RelObjectName() columnNames = ColumnsNamesList() { @@ -3812,6 +3817,7 @@ AlterExpression AlterExpression(): alterExp.setIndex(index); } constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] ) | ( (LOOKAHEAD(2) )? @@ -3823,7 +3829,9 @@ AlterExpression AlterExpression(): ("," alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.addColDataType(alterExpressionColumnDataType); } )* ")" ) | - ( ( (tk= | tk=) { alterExp.setUkName(tk.image); } )? columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); } ) + ( (( { alterExp.setUk(true); } | ) (tk= | tk=) { alterExp.setUkName(tk.image); } )? + columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); } + [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]) | //following two choices regarding foreign keys should be merged ( columnNames=ColumnsNamesList() { alterExp.setFkColumns(columnNames); } @@ -3865,6 +3873,7 @@ AlterExpression AlterExpression(): alterExp.setIndex(index); } constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] ) | ( @@ -3877,7 +3886,7 @@ AlterExpression AlterExpression(): ) | ( - tk= (tk2=)? + tk= (tk2= { alterExp.setUk(true); } | tk2=)? columnNames=ColumnsNamesList() { index = new NamedConstraint(); @@ -3887,6 +3896,7 @@ AlterExpression AlterExpression(): alterExp.setIndex(index); } constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } + [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] ) | ( @@ -3936,6 +3946,16 @@ AlterExpression AlterExpression(): ) | + ( tk= + (tk2= | tk2=) + { + index = new Index(); + index.setType(tk.image); + index.setName(tk2.image); + alterExp.setIndex(index); + } + ) + | ( [ { alterExp.setConstraintIfExists(true); } ] (tk= | tk=) { @@ -3944,6 +3964,14 @@ AlterExpression AlterExpression(): ) ) ) + | + ( + { + alterExp.setOperation(AlterOperation.ALGORITHM); + } + ["=" { alterExp.setUseEqual(true);} ] + sk3 = RelObjectName() {alterExp.addParameters(sk3); } + ) ) { 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 dd4cea0b2..9bc8fe9cd 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -368,4 +368,14 @@ public void testIssue633() throws JSQLParserException { public void testIssue679() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("ALTER TABLE tb_session_status ADD INDEX idx_user_id_name (user_id, user_name(10)), ADD INDEX idx_user_name (user_name)"); } + + @Test + public void testAlterTableIndex586() throws Exception { + Statement result = CCJSqlParserUtil.parse("ALTER TABLE biz_add_fee DROP INDEX operation_time, " + + "ADD UNIQUE INDEX operation_time (`operation_time`, `warehouse_code`, `customerid`, `fees_type`, `external_no`) " + + "USING BTREE, ALGORITHM = INPLACE"); + assertEquals("ALTER TABLE biz_add_fee DROP INDEX operation_time , " + + "ADD UNIQUE INDEX operation_time (`operation_time`, `warehouse_code`, `customerid`, `fees_type`, `external_no`) " + + "USING BTREE, ALGORITHM = INPLACE", result.toString()); + } }