44import java .util .List ;
55import junit .framework .TestCase ;
66import net .sf .jsqlparser .JSQLParserException ;
7+ import net .sf .jsqlparser .parser .CCJSqlParser ;
78import net .sf .jsqlparser .parser .CCJSqlParserUtil ;
89import net .sf .jsqlparser .statement .Statement ;
910import net .sf .jsqlparser .statement .alter .Alter ;
1011import net .sf .jsqlparser .statement .alter .AlterExpression ;
1112import net .sf .jsqlparser .statement .alter .AlterExpression .ColumnDataType ;
13+ import net .sf .jsqlparser .statement .alter .AlterOperation ;
14+
1215import static net .sf .jsqlparser .test .TestUtils .assertSqlCanBeParsedAndDeparsed ;
16+ import static net .sf .jsqlparser .test .TestUtils .assertStatementCanBeDeparsedAs ;
1317
1418public class AlterTest extends TestCase {
1519
@@ -28,8 +32,20 @@ public void testAlterTableAddColumn() throws JSQLParserException {
2832 assertEquals ("mycolumn" , colDataTypes .get (0 ).getColumnName ());
2933 assertEquals ("varchar (255)" , colDataTypes .get (0 ).getColDataType ().toString ());
3034 }
31-
32- public void testAlterTablePrimaryKey () throws JSQLParserException {
35+
36+ public void testAlterTableAddColumn_ColumnKeyWordImplicit () throws JSQLParserException {
37+ Statement stmt = CCJSqlParserUtil .parse ("ALTER TABLE mytable ADD mycolumn varchar (255)" );
38+ assertTrue (stmt instanceof Alter );
39+ Alter alter = (Alter )stmt ;
40+ assertEquals ("mytable" ,alter .getTable ().getFullyQualifiedName ());
41+ AlterExpression alterExp = alter .getAlterExpressions ().get (0 );
42+ assertNotNull (alterExp );
43+ List <ColumnDataType > colDataTypes = alterExp .getColDataTypeList ();
44+ assertEquals ("mycolumn" , colDataTypes .get (0 ).getColumnName ());
45+ assertEquals ("varchar (255)" , colDataTypes .get (0 ).getColDataType ().toString ());
46+ }
47+
48+ public void testAlterTablePrimaryKey () throws JSQLParserException {
3349 assertSqlCanBeParsedAndDeparsed ("ALTER TABLE animals ADD PRIMARY KEY (id)" );
3450 }
3551
@@ -74,13 +90,35 @@ public void testAlterTableDropColumn2() throws JSQLParserException {
7490 }
7591
7692 public void testAlterTableDropConstraint () throws JSQLParserException {
77- assertSqlCanBeParsedAndDeparsed ("ALTER TABLE test DROP CONSTRAINT YYY" );
93+ final String sql = "ALTER TABLE test DROP CONSTRAINT YYY" ;
94+ Statement stmt = CCJSqlParserUtil .parse (sql );
95+ assertStatementCanBeDeparsedAs (stmt , sql );
96+ AlterExpression alterExpression = ((Alter ) stmt ).getAlterExpressions ().get (0 );
97+ assertEquals (alterExpression .getConstraintName (), "YYY" );
7898 }
7999
80100 public void testAlterTablePK () throws JSQLParserException {
81- assertSqlCanBeParsedAndDeparsed ("ALTER TABLE `Author` ADD CONSTRAINT `AuthorPK` PRIMARY KEY (`ID`)" );
101+ final String sql = "ALTER TABLE `Author` ADD CONSTRAINT `AuthorPK` PRIMARY KEY (`ID`)" ;
102+ Statement stmt = CCJSqlParserUtil .parse (sql );
103+ assertStatementCanBeDeparsedAs (stmt , sql );
104+ AlterExpression alterExpression = ((Alter ) stmt ).getAlterExpressions ().get (0 );
105+ assertNull (alterExpression .getConstraintName ());
106+ // TODO: should this pass? ==> assertEquals(alterExpression.getPkColumns().get(0), "ID");
107+ assertEquals (alterExpression .getIndex ().getColumnsNames ().get (0 ), "`ID`" );
82108 }
83109
110+ public void testAlterTableFK () throws JSQLParserException {
111+ String sql = "ALTER TABLE `Novels` ADD FOREIGN KEY (AuthorID) REFERENCES Author (ID)" ;
112+ Statement stmt = CCJSqlParserUtil .parse (sql );
113+ assertStatementCanBeDeparsedAs (stmt , sql );
114+ AlterExpression alterExpression = ((Alter ) stmt ).getAlterExpressions ().get (0 );
115+ assertEquals (alterExpression .getFkColumns ().size (), 1 );
116+ assertEquals (alterExpression .getFkColumns ().get (0 ), "AuthorID" );
117+ assertEquals (alterExpression .getFkSourceTable (), "Author" );
118+ assertEquals (alterExpression .getFkSourceColumns ().size (), 1 );
119+ assertEquals (alterExpression .getFkSourceColumns ().get (0 ), "ID" );
120+ }
121+
84122 public void testAlterTableCheckConstraint () throws JSQLParserException {
85123 assertSqlCanBeParsedAndDeparsed ("ALTER TABLE `Author` ADD CONSTRAINT name_not_empty CHECK (`NAME` <> '')" );
86124 }
@@ -109,6 +147,44 @@ public void testAlterTableAddColumn4() throws JSQLParserException {
109147 assertEquals ("integer" , col2DataTypes .get (0 ).getColDataType ().toString ());
110148 }
111149
150+ public void testAlterTableAddColumn5 () throws JSQLParserException {
151+ Statement stmt = CCJSqlParserUtil .parse ("ALTER TABLE mytable ADD col1 timestamp (3)" );
152+
153+ // COLUMN keyword appears in deparsed statement
154+ assertStatementCanBeDeparsedAs (stmt , "ALTER TABLE mytable ADD COLUMN col1 timestamp (3)" );
155+
156+ Alter alter = (Alter ) stmt ;
157+ List <AlterExpression > alterExps = alter .getAlterExpressions ();
158+ AlterExpression col1Exp = alterExps .get (0 );
159+ List <ColumnDataType > col1DataTypes = col1Exp .getColDataTypeList ();
160+ assertEquals ("col1" , col1DataTypes .get (0 ).getColumnName ());
161+ assertEquals ("timestamp (3)" , col1DataTypes .get (0 ).getColDataType ().toString ());
162+ }
163+
164+ public void testAlterTableAddColumn6 () throws JSQLParserException {
165+ final String sql = "ALTER TABLE mytable ADD COLUMN col1 timestamp (3) not null" ;
166+ Statement stmt = CCJSqlParserUtil .parse (sql );
167+ assertStatementCanBeDeparsedAs (stmt , sql );
168+ Alter alter = (Alter ) stmt ;
169+ List <AlterExpression > alterExps = alter .getAlterExpressions ();
170+ AlterExpression col1Exp = alterExps .get (0 );
171+ assertEquals ("not" , col1Exp .getColDataTypeList ().get (0 ).getColumnSpecs ().get (0 ));
172+ assertEquals ("null" , col1Exp .getColDataTypeList ().get (0 ).getColumnSpecs ().get (1 ));
173+ }
174+
175+ public void testAlterTableModifyColumn1 () throws JSQLParserException {
176+ assertSqlCanBeParsedAndDeparsed ("ALTER TABLE animals MODIFY (col1 integer, col2 number (8, 2))" );
177+ }
178+
179+ public void testAlterTableModifyColumn2 () throws JSQLParserException {
180+ Statement stmt = CCJSqlParserUtil .parse ("ALTER TABLE mytable modify col1 timestamp (6)" );
181+
182+ // COLUMN keyword appears in deparsed statement, modify becomes all caps
183+ assertStatementCanBeDeparsedAs (stmt , "ALTER TABLE mytable MODIFY COLUMN col1 timestamp (6)" );
184+
185+ assertEquals (AlterOperation .MODIFY , ((Alter ) stmt ).getAlterExpressions ().get (0 ).getOperation ());
186+ }
187+
112188 public void testAlterTableAddColumnWithZone () throws JSQLParserException {
113189 assertSqlCanBeParsedAndDeparsed ("ALTER TABLE mytable ADD COLUMN col1 timestamp with time zone" );
114190 assertSqlCanBeParsedAndDeparsed ("ALTER TABLE mytable ADD COLUMN col1 timestamp without time zone" );
0 commit comments