Skip to content

Commit 4b2ebb0

Browse files
committed
Added support for 'ALTER TABLE CHANGE COLUMN oldName newName columnDefinition'. Please see https://dev.mysql.com/doc/refman/8.0/en/alter-table.html for reference.
1 parent cb0e0b7 commit 4b2ebb0

3 files changed

Lines changed: 66 additions & 8 deletions

File tree

src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737
public class AlterExpression {
3838

3939
private AlterOperation operation;
40+
private String optionalSpecifier;
4041
private String columnName;
42+
private String columnOldName;
4143
//private ColDataType dataType;
4244

4345
private List<ColumnDataType> colDataTypeList;
@@ -66,6 +68,14 @@ public void setOperation(AlterOperation operation) {
6668
this.operation = operation;
6769
}
6870

71+
public String getOptionalSpecifier() {
72+
return optionalSpecifier;
73+
}
74+
75+
public void setOptionalSpecifier(String optionalSpecifier) {
76+
this.optionalSpecifier = optionalSpecifier;
77+
}
78+
6979
public boolean isOnDeleteCascade() {
7080
return onDeleteCascade;
7181
}
@@ -137,6 +147,14 @@ public void setColumnName(String columnName) {
137147
this.columnName = columnName;
138148
}
139149

150+
public String getColOldName() {
151+
return columnOldName;
152+
}
153+
154+
public void setColOldName(String columnOldName) {
155+
this.columnOldName = columnOldName;
156+
}
157+
140158
public String getConstraintName() {
141159
return this.constraintName;
142160
}
@@ -214,7 +232,12 @@ public String toString() {
214232
if (columnName != null) {
215233
b.append("COLUMN ").append(columnName);
216234
} else if (getColDataTypeList() != null) {
217-
if (colDataTypeList.size() > 1) {
235+
if(operation == AlterOperation.CHANGE) {
236+
if(optionalSpecifier != null) {
237+
b.append(optionalSpecifier).append(" ");
238+
}
239+
b.append(columnOldName).append(" ");
240+
} else if (colDataTypeList.size() > 1) {
218241
b.append("(");
219242
} else {
220243
b.append("COLUMN ");

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
158158
| <K_CASE:"CASE">
159159
| <K_CAST:"CAST">
160160
| <K_CHARACTER:"CHARACTER">
161+
| <K_CHANGE:"CHANGE">
161162
| <K_CHECK:"CHECK">
162163
| <K_CHAR:"CHAR">
163164
| <K_COLUMN:"COLUMN">
@@ -3864,6 +3865,22 @@ AlterExpression AlterExpression():
38643865
)
38653866
)
38663867
|
3868+
(<K_CHANGE>
3869+
{
3870+
alterExp.setOperation(AlterOperation.CHANGE);
3871+
}
3872+
(
3873+
<K_COLUMN> { alterExp.setOptionalSpecifier("COLUMN"); } | {}
3874+
)
3875+
(
3876+
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>)
3877+
alterExpressionColumnDataType = AlterExpressionColumnDataType() {
3878+
alterExp.setColOldName(tk.image);
3879+
alterExp.addColDataType(alterExpressionColumnDataType);
3880+
}
3881+
)
3882+
)
3883+
|
38673884
(<K_DROP>
38683885
{
38693886
alterExp.setOperation(AlterOperation.DROP);

src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package net.sf.jsqlparser.statement.alter;
22

3+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
4+
import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs;
5+
import static org.junit.Assert.*;
6+
37
import java.util.Arrays;
48
import java.util.List;
9+
10+
import org.junit.Test;
11+
512
import net.sf.jsqlparser.JSQLParserException;
613
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
714
import net.sf.jsqlparser.statement.Statement;
815
import net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDataType;
9-
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
10-
import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs;
11-
import static org.junit.Assert.assertEquals;
12-
import static org.junit.Assert.assertNotNull;
13-
import static org.junit.Assert.assertNull;
14-
import static org.junit.Assert.assertTrue;
15-
import org.junit.Test;
1616

1717
public class AlterTest {
1818

@@ -262,6 +262,24 @@ public void testAlterTableAlterColumn() throws JSQLParserException {
262262
assertSqlCanBeParsedAndDeparsed("ALTER TABLE table_name ALTER COLUMN column_name_1 TYPE TIMESTAMP, ALTER COLUMN column_name_2 TYPE BOOLEAN");
263263
}
264264

265+
@Test
266+
public void testAlterTableChangeColumn1() throws JSQLParserException {
267+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE tb_test CHANGE COLUMN c1 c2 INT (10)");
268+
}
269+
270+
@Test
271+
public void testAlterTableChangeColumn2() throws JSQLParserException {
272+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE tb_test CHANGE c1 c2 INT (10)");
273+
}
274+
275+
@Test
276+
public void testAlterTableChangeColumn3() throws JSQLParserException {
277+
Statement stmt = CCJSqlParserUtil.parse("ALTER TABLE tb_test CHANGE c1 c2 INT (10)");
278+
Alter alter = (Alter) stmt;
279+
assertEquals(AlterOperation.CHANGE, alter.getAlterExpressions().get(0).getOperation());
280+
assertEquals("c1", alter.getAlterExpressions().get(0).getColOldName());
281+
}
282+
265283
@Test
266284
public void testAlterTableAddColumnWithZone() throws JSQLParserException {
267285
assertSqlCanBeParsedAndDeparsed("ALTER TABLE mytable ADD COLUMN col1 timestamp with time zone");

0 commit comments

Comments
 (0)