Skip to content

Commit 466f1bd

Browse files
committed
fix(parser): model ALTER COLUMN nullability actions
Represent SET NOT NULL with a dedicated AST node and match DROP NOT NULL before the generic column-data-type branch. Cover parsing, deparsing, validation, and reflection.
1 parent 9a32ff5 commit 466f1bd

6 files changed

Lines changed: 84 additions & 5 deletions

File tree

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class AlterExpression implements Serializable {
4141
private String columnOldName;
4242
private List<ColumnDataType> colDataTypeList;
4343
private List<ColumnDropNotNull> columnDropNotNullList;
44+
private List<ColumnSetNotNull> columnSetNotNullList;
4445
private List<ColumnDropDefault> columnDropDefaultList;
4546
private List<ColumnSetDefault> columnSetDefaultList;
4647
private List<ColumnSetVisibility> columnSetVisibilityList;
@@ -382,6 +383,13 @@ public void addColDropNotNull(ColumnDropNotNull columnDropNotNull) {
382383
columnDropNotNullList.add(columnDropNotNull);
383384
}
384385

386+
public void addColSetNotNull(ColumnSetNotNull columnSetNotNull) {
387+
if (columnSetNotNullList == null) {
388+
columnSetNotNullList = new ArrayList<>();
389+
}
390+
columnSetNotNullList.add(columnSetNotNull);
391+
}
392+
385393
public List<ColumnDropDefault> getColumnDropDefaultList() {
386394
return columnDropDefaultList;
387395
}
@@ -527,6 +535,10 @@ public List<ColumnDropNotNull> getColumnDropNotNullList() {
527535
return columnDropNotNullList;
528536
}
529537

538+
public List<ColumnSetNotNull> getColumnSetNotNullList() {
539+
return columnSetNotNullList;
540+
}
541+
530542
public void addParameters(String... params) {
531543
if (parameters == null) {
532544
parameters = new ArrayList<>();
@@ -1134,6 +1146,9 @@ protected void toStringGeneral(StringBuilder b) {
11341146
if (colDataTypeList.size() > 1) {
11351147
b.append(")");
11361148
}
1149+
} else if (getColumnSetNotNullList() != null) {
1150+
b.append("COLUMN ");
1151+
b.append(PlainSelect.getStringList(columnSetNotNullList));
11371152
} else if (getColumnDropNotNullList() != null) {
11381153
b.append("COLUMN ");
11391154
b.append(PlainSelect.getStringList(columnDropNotNullList));
@@ -1467,6 +1482,24 @@ public String toString() {
14671482
}
14681483
}
14691484

1485+
public static final class ColumnSetNotNull implements Serializable {
1486+
1487+
private final String columnName;
1488+
1489+
public ColumnSetNotNull(String columnName) {
1490+
this.columnName = columnName;
1491+
}
1492+
1493+
public String getColumnName() {
1494+
return columnName;
1495+
}
1496+
1497+
@Override
1498+
public String toString() {
1499+
return columnName + " SET NOT NULL";
1500+
}
1501+
}
1502+
14701503
public static final class ColumnDropDefault implements Serializable {
14711504

14721505
private final String columnName;

‎src/main/java/net/sf/jsqlparser/util/validation/validator/AlterValidator.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.sf.jsqlparser.statement.alter.AlterExpression;
1818
import net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDataType;
1919
import net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDropNotNull;
20+
import net.sf.jsqlparser.statement.alter.AlterExpression.ColumnSetNotNull;
2021
import net.sf.jsqlparser.statement.alter.AlterOperation;
2122
import net.sf.jsqlparser.util.validation.ValidationCapability;
2223
import net.sf.jsqlparser.util.validation.ValidationUtil;
@@ -47,6 +48,11 @@ public void validate(Alter alter, AlterExpression e) {
4748
ColumnDropNotNull::getColumnName));
4849
}
4950

51+
if (e.getColumnSetNotNullList() != null) {
52+
validateOptionalColumnNames(c, ValidationUtil.map(e.getColumnSetNotNullList(),
53+
ColumnSetNotNull::getColumnName));
54+
}
55+
5056
if (e.getColDataTypeList() != null) {
5157
boolean validateForExist =
5258
!EnumSet.of(AlterOperation.ADD).contains(e.getOperation());

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12213,13 +12213,15 @@ Truncate Truncate():
1221312213

1221412214
/**
1221512215
* Parses common column-level changes shared between the COLUMN-prefixed and bare forms:
12216-
* DROP DEFAULT, SET DEFAULT, SET VISIBLE/INVISIBLE, and bracketed multi-column definitions.
12216+
* DROP DEFAULT, SET DEFAULT, SET NOT NULL, SET VISIBLE/INVISIBLE, and bracketed multi-column
12217+
* definitions.
1221712218
*/
1221812219
void AlterExpressionColumnChanges(AlterExpression alterExp):
1221912220
{
1222012221
AlterExpression.ColumnDataType alterExpressionColumnDataType = null;
1222112222
AlterExpression.ColumnDropDefault alterExpressionColumnDropDefault = null;
1222212223
AlterExpression.ColumnSetDefault alterExpressionColumnSetDefault = null;
12224+
AlterExpression.ColumnSetNotNull alterExpressionColumnSetNotNull = null;
1222312225
AlterExpression.ColumnSetVisibility alterExpressionColumnSetVisibility = null;
1222412226
}
1222512227
{
@@ -12230,6 +12232,9 @@ void AlterExpressionColumnChanges(AlterExpression alterExp):
1223012232
LOOKAHEAD(3) alterExpressionColumnSetDefault = AlterExpressionColumnSetDefault()
1223112233
{ alterExp.addColSetDefault(alterExpressionColumnSetDefault); }
1223212234
|
12235+
LOOKAHEAD(4) alterExpressionColumnSetNotNull = AlterExpressionColumnSetNotNull()
12236+
{ alterExp.addColSetNotNull(alterExpressionColumnSetNotNull); }
12237+
|
1223312238
LOOKAHEAD(3) alterExpressionColumnSetVisibility = AlterExpressionColumnSetVisibility()
1223412239
{ alterExp.addColSetVisibility(alterExpressionColumnSetVisibility); }
1223512240
|
@@ -12287,6 +12292,19 @@ AlterExpression.ColumnDropNotNull AlterExpressionColumnDropNotNull():
1228712292
}
1228812293
}
1228912294

12295+
AlterExpression.ColumnSetNotNull AlterExpressionColumnSetNotNull():
12296+
{
12297+
String columnName = null;
12298+
}
12299+
{
12300+
columnName = RelObjectName()
12301+
<K_SET>
12302+
<K_NOT> <K_NULL>
12303+
{
12304+
return new AlterExpression.ColumnSetNotNull(columnName);
12305+
}
12306+
}
12307+
1229012308
AlterExpression.ColumnDropDefault AlterExpressionColumnDropDefault():
1229112309
{
1229212310
String columnName = null;
@@ -12926,11 +12944,11 @@ AlterExpression AlterExpressionAddAlterModify():
1292612944
(
1292712945
LOOKAHEAD(3) AlterExpressionColumnChanges(alterExp)
1292812946
|
12929-
LOOKAHEAD(2) alterExpressionColumnDataType = AlterExpressionColumnDataType()
12930-
{ alterExp.addColDataType(alterExpressionColumnDataType); }
12931-
|
1293212947
LOOKAHEAD(3) alterExpressionColumnDropNotNull = AlterExpressionColumnDropNotNull()
1293312948
{ alterExp.addColDropNotNull( alterExpressionColumnDropNotNull);}
12949+
|
12950+
LOOKAHEAD(2) alterExpressionColumnDataType = AlterExpressionColumnDataType()
12951+
{ alterExp.addColDataType(alterExpressionColumnDataType); }
1293412952
)
1293512953
)
1293612954
|

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,23 @@ public void testAlterConstraintWithoutFKSourceColumnsIssue929() throws JSQLParse
644644

645645
@Test
646646
public void testAlterTableAlterColumnDropNotNullIssue918() throws JSQLParserException {
647-
assertSqlCanBeParsedAndDeparsed(
647+
Alter alter = (Alter) assertSqlCanBeParsedAndDeparsed(
648648
"ALTER TABLE \"user_table_t\" ALTER COLUMN name DROP NOT NULL");
649+
AlterExpression expression = alter.getAlterExpressions().get(0);
650+
651+
assertNull(expression.getColDataTypeList());
652+
assertEquals("name", expression.getColumnDropNotNullList().get(0).getColumnName());
653+
assertTrue(expression.getColumnDropNotNullList().get(0).isWithNot());
654+
}
655+
656+
@Test
657+
public void testAlterTableAlterColumnSetNotNull() throws JSQLParserException {
658+
Alter alter = (Alter) assertSqlCanBeParsedAndDeparsed(
659+
"ALTER TABLE user_table ALTER COLUMN name SET NOT NULL");
660+
AlterExpression expression = alter.getAlterExpressions().get(0);
661+
662+
assertNull(expression.getColDataTypeList());
663+
assertEquals("name", expression.getColumnSetNotNullList().get(0).getColumnName());
649664
}
650665

651666
@Test

‎src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ public class ReflectionModelTest {
141141
new net.sf.jsqlparser.statement.alter.AlterExpression(),
142142
new net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDataType(false),
143143
new net.sf.jsqlparser.statement.alter.AlterExpression.ColumnDropNotNull("name"),
144+
new net.sf.jsqlparser.statement.alter.AlterExpression.ColumnSetNotNull("name"),
144145
new net.sf.jsqlparser.statement.merge.MergeInsert(),
145146
new net.sf.jsqlparser.statement.alter.DeferrableConstraint(),
146147
new net.sf.jsqlparser.statement.alter.EnableConstraint(),

‎src/test/java/net/sf/jsqlparser/util/validation/validator/AlterValidatorTest.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,10 @@ public void testAlterTableAlterColumnDropNotNullIssue918() throws JSQLParserExce
151151
DatabaseType.DATABASES);
152152
}
153153

154+
@Test
155+
public void testAlterTableAlterColumnSetNotNull() throws JSQLParserException {
156+
validateNoErrors("ALTER TABLE user_table ALTER COLUMN name SET NOT NULL", 1,
157+
DatabaseType.DATABASES);
158+
}
159+
154160
}

0 commit comments

Comments
 (0)