diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 5008c3d76..a23217b19 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -9195,7 +9195,11 @@ AlterExpression AlterExpression(): LOOKAHEAD(2) ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); }) constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] + [ + { alterExp.addParameters("USING"); } + [ { alterExp.addParameters("INDEX"); } ] + sk4=RelObjectName() { alterExp.addParameters(sk4); } + ] | LOOKAHEAD(2) ( (tk= { alterExp.setUk(true); } | tk=) @@ -9324,7 +9328,11 @@ AlterExpression AlterExpression(): | ( (( { alterExp.setUk(true); } | ) (tk= | tk=) { alterExp.setUkName(tk.image); } )? columnNames=ColumnsNamesList() { alterExp.setUkColumns(columnNames); } - [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] + [ + { alterExp.addParameters("USING"); } + [ { alterExp.addParameters("INDEX"); } ] + sk4=RelObjectName() { alterExp.addParameters(sk4); } + ] [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ] ) | @@ -9414,7 +9422,11 @@ AlterExpression AlterExpression(): alterExp.setIndex(index); } constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] + [ + { alterExp.addParameters("USING"); } + [ { alterExp.addParameters("INDEX"); } ] + sk4=RelObjectName() { alterExp.addParameters(sk4); } + ] [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ] ) | @@ -9446,7 +9458,11 @@ AlterExpression AlterExpression(): alterExp.setIndex(index); } constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } - [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] + [ + { alterExp.addParameters("USING"); } + [ { alterExp.addParameters("INDEX"); } ] + sk4=RelObjectName() { alterExp.addParameters(sk4); } + ] [ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ] ) | 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 749e12853..5d9975033 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -9,22 +9,21 @@ */ package net.sf.jsqlparser.statement.alter; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Stream; - +import static net.sf.jsqlparser.test.TestUtils.assertDeparse; +import static net.sf.jsqlparser.test.TestUtils.assertEqualsObjectTree; +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; +import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; @@ -43,10 +42,10 @@ import net.sf.jsqlparser.statement.create.table.Index.ColumnParams; import net.sf.jsqlparser.statement.create.table.NamedConstraint; import net.sf.jsqlparser.statement.create.table.PartitionDefinition; -import static net.sf.jsqlparser.test.TestUtils.assertDeparse; -import static net.sf.jsqlparser.test.TestUtils.assertEqualsObjectTree; -import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; -import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; public class AlterTest { @@ -2234,4 +2233,26 @@ public void testAlterTableAddIndexInvisible() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(sql); } + + @Test + public void testAlterTableAddConstraintPrimaryKeyUsingIndexName() throws JSQLParserException { + String sql = + "ALTER TABLE TNWAV ADD CONSTRAINT PK_TNWAV PRIMARY KEY (NWNAME, ZEILE, BESTGRU) USING INDEX PK_TNWAV"; + Statement stmt = CCJSqlParserUtil.parse(sql); + assertInstanceOf(Alter.class, stmt); + + Alter alter = (Alter) stmt; + assertEquals("TNWAV", alter.getTable().getFullyQualifiedName()); + + List alterExpressions = alter.getAlterExpressions(); + assertNotNull(alterExpressions); + assertEquals(1, alterExpressions.size()); + + AlterExpression alterExp = alterExpressions.get(0); + assertEquals(AlterOperation.ADD, alterExp.getOperation()); + assertNotNull(alterExp.getIndex()); + assertEquals(Arrays.asList("USING", "INDEX", "PK_TNWAV"), alterExp.getParameters()); + + assertSqlCanBeParsedAndDeparsed(sql); + } }