4
4
import java .util .List ;
5
5
import junit .framework .TestCase ;
6
6
import net .sf .jsqlparser .JSQLParserException ;
7
+ import net .sf .jsqlparser .parser .CCJSqlParser ;
7
8
import net .sf .jsqlparser .parser .CCJSqlParserUtil ;
8
9
import net .sf .jsqlparser .statement .Statement ;
9
10
import net .sf .jsqlparser .statement .alter .Alter ;
10
11
import net .sf .jsqlparser .statement .alter .AlterExpression ;
11
12
import net .sf .jsqlparser .statement .alter .AlterExpression .ColumnDataType ;
13
+ import net .sf .jsqlparser .statement .alter .AlterOperation ;
14
+
12
15
import static net .sf .jsqlparser .test .TestUtils .assertSqlCanBeParsedAndDeparsed ;
16
+ import static net .sf .jsqlparser .test .TestUtils .assertStatementCanBeDeparsedAs ;
13
17
14
18
public class AlterTest extends TestCase {
15
19
@@ -28,8 +32,20 @@ public void testAlterTableAddColumn() throws JSQLParserException {
28
32
assertEquals ("mycolumn" , colDataTypes .get (0 ).getColumnName ());
29
33
assertEquals ("varchar (255)" , colDataTypes .get (0 ).getColDataType ().toString ());
30
34
}
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 {
33
49
assertSqlCanBeParsedAndDeparsed ("ALTER TABLE animals ADD PRIMARY KEY (id)" );
34
50
}
35
51
@@ -74,13 +90,35 @@ public void testAlterTableDropColumn2() throws JSQLParserException {
74
90
}
75
91
76
92
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" );
78
98
}
79
99
80
100
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`" );
82
108
}
83
109
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
+
84
122
public void testAlterTableCheckConstraint () throws JSQLParserException {
85
123
assertSqlCanBeParsedAndDeparsed ("ALTER TABLE `Author` ADD CONSTRAINT name_not_empty CHECK (`NAME` <> '')" );
86
124
}
@@ -109,6 +147,44 @@ public void testAlterTableAddColumn4() throws JSQLParserException {
109
147
assertEquals ("integer" , col2DataTypes .get (0 ).getColDataType ().toString ());
110
148
}
111
149
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
+
112
188
public void testAlterTableAddColumnWithZone () throws JSQLParserException {
113
189
assertSqlCanBeParsedAndDeparsed ("ALTER TABLE mytable ADD COLUMN col1 timestamp with time zone" );
114
190
assertSqlCanBeParsedAndDeparsed ("ALTER TABLE mytable ADD COLUMN col1 timestamp without time zone" );
0 commit comments