Skip to content

Commit

Permalink
Add some flexibility to the Alter Statement
Browse files Browse the repository at this point in the history
in order to allow:

ALTER TABLE ... MOVE TABLESPACE ...
ALTER TABLE ... COMPRESS NOLOGGING
ALTER TABLE ... ROWFORMAT=DYNAMIC

Fixes #1033
  • Loading branch information
manticore-projects committed Jul 28, 2021
1 parent d662484 commit 313d162
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 89 deletions.
180 changes: 92 additions & 88 deletions src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java
Original file line number Diff line number Diff line change
Expand Up @@ -360,101 +360,105 @@ public void setUk(boolean uk) {
}

@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity", "PMD.ExcessiveMethodLength"})
public String toString() {

StringBuilder b = new StringBuilder();

b.append(operation).append(" ");

if (commentText != null) {
if (columnName != null) {
b.append(columnName).append(" COMMENT ");
}
b.append(commentText);
} else if (columnName != null) {
if (hasColumn) {
b.append("COLUMN ");
}
if (operation == AlterOperation.RENAME) {
b.append(columnOldName).append(" TO ");
}
b.append(columnName);
} else if (getColDataTypeList() != null) {
if (operation == AlterOperation.CHANGE) {
if (optionalSpecifier != null) {
b.append(optionalSpecifier).append(" ");

if (operation== AlterOperation.UNSPECIFIC) {
b.append(optionalSpecifier);
} else {
b.append(operation).append(" ");

if (commentText != null) {
if (columnName != null) {
b.append(columnName).append(" COMMENT ");
}
b.append(commentText);
} else if (columnName != null) {
if (hasColumn) {
b.append("COLUMN ");
}
if (operation == AlterOperation.RENAME) {
b.append(columnOldName).append(" TO ");
}
b.append(columnName);
} else if (getColDataTypeList() != null) {
if (operation == AlterOperation.CHANGE) {
if (optionalSpecifier != null) {
b.append(optionalSpecifier).append(" ");
}
b.append(columnOldName).append(" ");
} else if (colDataTypeList.size() > 1) {
b.append("(");
} else {
if (hasColumn) {
b.append("COLUMN ");
}
}
b.append(PlainSelect.getStringList(colDataTypeList));
if (colDataTypeList.size() > 1) {
b.append(")");
}
} else if (getColumnDropNotNullList() != null) {
if (operation == AlterOperation.CHANGE) {
if (optionalSpecifier != null) {
b.append(optionalSpecifier).append(" ");
}
b.append(columnOldName).append(" ");
} else if (columnDropNotNullList.size() > 1) {
b.append("(");
} else {
b.append("COLUMN ");
}
b.append(PlainSelect.getStringList(columnDropNotNullList));
if (columnDropNotNullList.size() > 1) {
b.append(")");
}
} else if (constraintName != null) {
b.append("CONSTRAINT ");
if (constraintIfExists) {
b.append("IF EXISTS ");
}
b.append(constraintName);
} else if (pkColumns != null) {
b.append("PRIMARY KEY (").append(PlainSelect.getStringList(pkColumns)).append(')');
} else if (ukColumns != null) {
b.append("UNIQUE");
if (ukName != null) {
if (getUk()) {
b.append(" KEY ");
} else {
b.append(" INDEX ");
}
b.append(ukName);
}
b.append(" (").append(PlainSelect.getStringList(ukColumns)).append(")");
} else if (fkColumns != null) {
b.append("FOREIGN KEY (")
.append(PlainSelect.getStringList(fkColumns))
.append(") REFERENCES ")
.append(
fkSourceSchema != null && fkSourceSchema.trim().length() > 0
? fkSourceSchema + "."
: "")
.append(fkSourceTable)
.append(" (")
.append(PlainSelect.getStringList(fkSourceColumns))
.append(")");
referentialActions.forEach(b::append);
} else if (index != null) {
b.append(index);
}
b.append(columnOldName).append(" ");
} else if (colDataTypeList.size() > 1) {
b.append("(");
} else {
if (hasColumn) {
b.append("COLUMN ");
if (getConstraints() != null && !getConstraints().isEmpty()) {
b.append(' ').append(PlainSelect.getStringList(constraints, false, false));
}
}
b.append(PlainSelect.getStringList(colDataTypeList));
if (colDataTypeList.size() > 1) {
b.append(")");
}
} else if (getColumnDropNotNullList() != null) {
if (operation == AlterOperation.CHANGE) {
if (optionalSpecifier != null) {
b.append(optionalSpecifier).append(" ");
if (getUseEqual()) {
b.append('=');
}
b.append(columnOldName).append(" ");
} else if (columnDropNotNullList.size() > 1) {
b.append("(");
} else {
b.append("COLUMN ");
}
b.append(PlainSelect.getStringList(columnDropNotNullList));
if (columnDropNotNullList.size() > 1) {
b.append(")");
}
} else if (constraintName != null) {
b.append("CONSTRAINT ");
if (constraintIfExists) {
b.append("IF EXISTS ");
}
b.append(constraintName);
} else if (pkColumns != null) {
b.append("PRIMARY KEY (").append(PlainSelect.getStringList(pkColumns)).append(')');
} else if (ukColumns != null) {
b.append("UNIQUE");
if (ukName != null) {
if (getUk()) {
b.append(" KEY ");
} else {
b.append(" INDEX ");
if (parameters != null && !parameters.isEmpty()) {
b.append(' ').append(PlainSelect.getStringList(parameters, false, false));
}
b.append(ukName);
}
b.append(" (").append(PlainSelect.getStringList(ukColumns)).append(")");
} else if (fkColumns != null) {
b.append("FOREIGN KEY (")
.append(PlainSelect.getStringList(fkColumns))
.append(") REFERENCES ")
.append(
fkSourceSchema != null && fkSourceSchema.trim().length() > 0
? fkSourceSchema + "."
: "")
.append(fkSourceTable)
.append(" (")
.append(PlainSelect.getStringList(fkSourceColumns))
.append(")");
referentialActions.forEach(b::append);
} else if (index != null) {
b.append(index);
}
if (getConstraints() != null && !getConstraints().isEmpty()) {
b.append(' ').append(PlainSelect.getStringList(constraints, false, false));
}
if (getUseEqual()) {
b.append('=');
}
if (parameters != null && !parameters.isEmpty()) {
b.append(' ').append(PlainSelect.getStringList(parameters, false, false));
}

return b.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@
package net.sf.jsqlparser.statement.alter;

public enum AlterOperation {
ADD, ALTER, DROP, MODIFY, CHANGE, ALGORITHM, RENAME, COMMENT;
ADD, ALTER, DROP, MODIFY, CHANGE, ALGORITHM, RENAME, COMMENT, UNSPECIFIC;
}
19 changes: 19 additions & 0 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -5258,6 +5258,9 @@ AlterExpression AlterExpression():
AlterExpression.ColumnDataType alterExpressionColumnDataType = null;
AlterExpression.ColumnDropNotNull alterExpressionColumnDropNotNull = null;
ReferentialAction.Action action = null;

// for captureRest()
List<String> tokens = new LinkedList<String>();
}
{

Expand Down Expand Up @@ -5467,6 +5470,22 @@ AlterExpression AlterExpression():
(<K_COMMENT> {alterExp.setOperation(AlterOperation.COMMENT);}
tk=<S_CHAR_LITERAL> { alterExp.setCommentText(tk.image); }
)
|
tokens = captureRest() {
alterExp.setOperation(AlterOperation.UNSPECIFIC);
StringBuilder optionalSpecifier = new StringBuilder();
int i=0;

for (String s: tokens)
if (!s.equals(";")) {
if (i>0)
optionalSpecifier.append( " " );
optionalSpecifier.append( s );
i++;
}

alterExp.setOptionalSpecifier( optionalSpecifier.toString() );
}
)

{
Expand Down
12 changes: 12 additions & 0 deletions src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -747,5 +747,17 @@ private void assertReferentialAction(Alter parsed, Action onUpdate, Action onDel
assertNull(alterExpression.getReferentialAction(Type.UPDATE));
}
}

@Test
public void testRowFormatKeywordIssue1033() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("ALTER TABLE basic_test_case "
+ "ADD COLUMN display_name varchar(512) NOT NULL DEFAULT '' AFTER name"
+ ", ADD KEY test_case_status (test_case_status)"
+ ", add KEY display_name (display_name), ROW_FORMAT=DYNAMIC", true);

assertSqlCanBeParsedAndDeparsed("ALTER TABLE t1 MOVE TABLESPACE users", true);

assertSqlCanBeParsedAndDeparsed("ALTER TABLE test_tab MOVE PARTITION test_tab_q2 COMPRESS", true);
}

}

0 comments on commit 313d162

Please sign in to comment.