Skip to content

Add support for parsing MySQL ALTER TABLE statements with advanced options #2223

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 135 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ public class AlterExpression implements Serializable {
private List<ColumnDataType> colDataTypeList;
private List<ColumnDropNotNull> columnDropNotNullList;
private List<ColumnDropDefault> columnDropDefaultList;
private List<ColumnSetDefault> columnSetDefaultList;
private List<ColumnSetVisibility> columnSetVisibilityList;

private List<String> pkColumns;
private List<String> ukColumns;
private String ukName;
Expand Down Expand Up @@ -88,6 +91,10 @@ public class AlterExpression implements Serializable {

private int keyBlockSize;

private String constraintSymbol;
private boolean enforced;
private String constraintType;

public Index getOldIndex() {
return oldIndex;
}
Expand Down Expand Up @@ -302,13 +309,39 @@ public void addColDropNotNull(ColumnDropNotNull columnDropNotNull) {
columnDropNotNullList.add(columnDropNotNull);
}

public List<ColumnDropDefault> getColumnDropDefaultList() {
return columnDropDefaultList;
}

public void addColDropDefault(ColumnDropDefault columnDropDefault) {
if (columnDropDefaultList == null) {
columnDropDefaultList = new ArrayList<>();
}
columnDropDefaultList.add(columnDropDefault);
}

public void addColSetDefault(ColumnSetDefault columnSetDefault) {
if (columnSetDefaultList == null) {
columnSetDefaultList = new ArrayList<>();
}
columnSetDefaultList.add(columnSetDefault);
}

public List<ColumnSetDefault> getColumnSetDefaultList() {
return columnSetDefaultList;
}

public void addColSetVisibility(ColumnSetVisibility columnSetVisibility) {
if (columnSetVisibilityList == null) {
columnSetVisibilityList = new ArrayList<>();
}
columnSetVisibilityList.add(columnSetVisibility);
}

public List<ColumnSetVisibility> getColumnSetVisibilityList() {
return columnSetVisibilityList;
}

public List<String> getFkSourceColumns() {
return fkSourceColumns;
}
Expand Down Expand Up @@ -571,6 +604,30 @@ public int getKeyBlockSize() {
return keyBlockSize;
}

public String getConstraintSymbol() {
return constraintSymbol;
}

public void setConstraintSymbol(String constraintSymbol) {
this.constraintSymbol = constraintSymbol;
}

public boolean isEnforced() {
return enforced;
}

public void setEnforced(boolean enforced) {
this.enforced = enforced;
}

public String getConstraintType() {
return constraintType;
}

public void setConstraintType(String constraintType) {
this.constraintType = constraintType;
}

@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity",
"PMD.ExcessiveMethodLength", "PMD.SwitchStmtsShouldHaveDefault"})
Expand All @@ -580,6 +637,38 @@ public String toString() {

if (operation == AlterOperation.UNSPECIFIC) {
b.append(optionalSpecifier);
} else if (operation == AlterOperation.ALTER && constraintType != null) {
b.append("ALTER");
b.append(" ").append(constraintType);

if (constraintSymbol != null) {
b.append(" ").append(constraintSymbol);
}
if (!isEnforced()) {
b.append(" NOT ");
}
b.append(" ENFORCED");
} else if (operation == AlterOperation.ALTER
&& columnDropDefaultList != null && !columnDropDefaultList.isEmpty()) {
b.append("ALTER ");
if (hasColumn) {
b.append("COLUMN ");
}
b.append(PlainSelect.getStringList(columnDropDefaultList));
} else if (operation == AlterOperation.ALTER
&& columnSetDefaultList != null && !columnSetDefaultList.isEmpty()) {
b.append("ALTER ");
if (hasColumn) {
b.append("COLUMN ");
}
b.append(PlainSelect.getStringList(columnSetDefaultList));
} else if (operation == AlterOperation.ALTER
&& columnSetVisibilityList != null && !columnSetVisibilityList.isEmpty()) {
b.append("ALTER ");
if (hasColumn) {
b.append("COLUMN ");
}
b.append(PlainSelect.getStringList(columnSetVisibilityList));
} else if (operation == AlterOperation.SET_TABLE_OPTION) {
b.append(tableOption);
} else if (operation == AlterOperation.DISCARD_TABLESPACE) {
Expand Down Expand Up @@ -1139,6 +1228,52 @@ public String toString() {
}
}

public static final class ColumnSetDefault implements Serializable {
private final String columnName;
private final String defaultValue;

public ColumnSetDefault(String columnName, String defaultValue) {
this.columnName = columnName;
this.defaultValue = defaultValue;
}

public String getColumnName() {
return columnName;
}

public String getDefaultValue() {
return defaultValue;
}

@Override
public String toString() {
return columnName + " SET DEFAULT " + defaultValue;
}
}

public static final class ColumnSetVisibility implements Serializable {
private final String columnName;
private final boolean visible;

public ColumnSetVisibility(String columnName, boolean visible) {
this.columnName = columnName;
this.visible = visible;
}

public String getColumnName() {
return columnName;
}

public boolean isVisible() {
return visible;
}

@Override
public String toString() {
return columnName + " SET " + (visible ? " VISIBLE" : " INVISIBLE");
}
}

public enum ConvertType {
CONVERT_TO, DEFAULT_CHARACTER_SET, CHARACTER_SET
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,11 @@ public List<String> getColumnsNames() {
}

public void setColumnsNames(List<String> list) {
columns = list.stream().map(ColumnParams::new).collect(toList());
if (list == null) {
this.columns = Collections.emptyList();
} else {
this.columns = list.stream().map(ColumnParams::new).collect(toList());
}
}

@Deprecated
Expand Down Expand Up @@ -159,7 +163,9 @@ public String toString() {
(!name.isEmpty() ? " " + getName() : "") +
(using != null ? " USING " + using : "");

String tail = PlainSelect.getStringList(columns, true, true)
String tail = (columns != null && !columns.isEmpty()
? PlainSelect.getStringList(columns, true, true)
: "")
+ (!idxSpecText.isEmpty() ? " " + idxSpecText : "");

return tail.isEmpty() ? head : head + " " + tail;
Expand Down
Loading
Loading