Skip to content

Commit 8397d3a

Browse files
authored
fix(parser): model ALTER COLUMN nullability actions (#2529)
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 a6da400 commit 8397d3a

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
@@ -12340,13 +12340,15 @@ Truncate Truncate():
1234012340

1234112341
/**
1234212342
* Parses common column-level changes shared between the COLUMN-prefixed and bare forms:
12343-
* DROP DEFAULT, SET DEFAULT, SET VISIBLE/INVISIBLE, and bracketed multi-column definitions.
12343+
* DROP DEFAULT, SET DEFAULT, SET NOT NULL, SET VISIBLE/INVISIBLE, and bracketed multi-column
12344+
* definitions.
1234412345
*/
1234512346
void AlterExpressionColumnChanges(AlterExpression alterExp):
1234612347
{
1234712348
AlterExpression.ColumnDataType alterExpressionColumnDataType = null;
1234812349
AlterExpression.ColumnDropDefault alterExpressionColumnDropDefault = null;
1234912350
AlterExpression.ColumnSetDefault alterExpressionColumnSetDefault = null;
12351+
AlterExpression.ColumnSetNotNull alterExpressionColumnSetNotNull = null;
1235012352
AlterExpression.ColumnSetVisibility alterExpressionColumnSetVisibility = null;
1235112353
}
1235212354
{
@@ -12357,6 +12359,9 @@ void AlterExpressionColumnChanges(AlterExpression alterExp):
1235712359
LOOKAHEAD(3) alterExpressionColumnSetDefault = AlterExpressionColumnSetDefault()
1235812360
{ alterExp.addColSetDefault(alterExpressionColumnSetDefault); }
1235912361
|
12362+
LOOKAHEAD(4) alterExpressionColumnSetNotNull = AlterExpressionColumnSetNotNull()
12363+
{ alterExp.addColSetNotNull(alterExpressionColumnSetNotNull); }
12364+
|
1236012365
LOOKAHEAD(3) alterExpressionColumnSetVisibility = AlterExpressionColumnSetVisibility()
1236112366
{ alterExp.addColSetVisibility(alterExpressionColumnSetVisibility); }
1236212367
|
@@ -12414,6 +12419,19 @@ AlterExpression.ColumnDropNotNull AlterExpressionColumnDropNotNull():
1241412419
}
1241512420
}
1241612421

12422+
AlterExpression.ColumnSetNotNull AlterExpressionColumnSetNotNull():
12423+
{
12424+
String columnName = null;
12425+
}
12426+
{
12427+
columnName = RelObjectName()
12428+
<K_SET>
12429+
<K_NOT> <K_NULL>
12430+
{
12431+
return new AlterExpression.ColumnSetNotNull(columnName);
12432+
}
12433+
}
12434+
1241712435
AlterExpression.ColumnDropDefault AlterExpressionColumnDropDefault():
1241812436
{
1241912437
String columnName = null;
@@ -13277,11 +13295,11 @@ AlterExpression AlterExpressionAddAlterModify():
1327713295
(
1327813296
LOOKAHEAD(3) AlterExpressionColumnChanges(alterExp)
1327913297
|
13280-
LOOKAHEAD(2) alterExpressionColumnDataType = AlterExpressionColumnDataType()
13281-
{ alterExp.addColDataType(alterExpressionColumnDataType); }
13282-
|
1328313298
LOOKAHEAD(3) alterExpressionColumnDropNotNull = AlterExpressionColumnDropNotNull()
1328413299
{ alterExp.addColDropNotNull( alterExpressionColumnDropNotNull);}
13300+
|
13301+
LOOKAHEAD(2) alterExpressionColumnDataType = AlterExpressionColumnDataType()
13302+
{ alterExp.addColDataType(alterExpressionColumnDataType); }
1328513303
)
1328613304
)
1328713305
|

‎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)