Skip to content

Commit 388b7c3

Browse files
Enhance ALTER TABLE ... DROP CONSTRAINTS ... (#1351)
* Enhance ALTER TABLE ... DROP CONSTRAINTS ... Add support for DROP PRIMARY KEY, DROP UNIQUE(...) Add support for DROP FOREIGN KEY(...) Fixes #1342 * Remove one useless PMD rule Add more tests Adjust Test Coverage
1 parent b0adaa8 commit 388b7c3

File tree

6 files changed

+74
-38
lines changed

6 files changed

+74
-38
lines changed

build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,13 @@ jacocoTestReport {
6868
html.outputLocation = layout.buildDirectory.dir('reports/jacoco')
6969
}
7070
}
71-
7271
jacocoTestCoverageVerification {
7372
violationRules {
7473
rule {
7574
limit {
76-
minimum = 0.838
75+
minimum = JavaVersion.current().isJava8() // for any reason, different results
76+
? 0.83 // depending on the Java Version
77+
: 0.842
7778
}
7879
}
7980
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,15 @@ public String toString() {
379379
} else if (operation== AlterOperation.RENAME_TABLE) {
380380

381381
b.append("RENAME TO ").append(newTableName);
382+
} else if (operation== AlterOperation.DROP_PRIMARY_KEY) {
383+
384+
b.append("DROP PRIMARY KEY ");
385+
} else if (operation== AlterOperation.DROP_UNIQUE) {
386+
387+
b.append("DROP UNIQUE (").append(PlainSelect.getStringList(pkColumns)).append(')');
388+
} else if (operation== AlterOperation.DROP_FOREIGN_KEY) {
389+
390+
b.append("DROP FOREIGN KEY (").append(PlainSelect.getStringList(pkColumns)).append(')');
382391
} else {
383392
b.append(operation).append(" ");
384393

@@ -468,6 +477,7 @@ public String toString() {
468477
if (getUseEqual()) {
469478
b.append('=');
470479
}
480+
471481
if (parameters != null && !parameters.isEmpty()) {
472482
b.append(' ').append(PlainSelect.getStringList(parameters, false, false));
473483
}

src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010
package net.sf.jsqlparser.statement.alter;
1111

1212
public enum AlterOperation {
13-
ADD, ALTER, DROP, MODIFY, CHANGE, ALGORITHM, RENAME, RENAME_TABLE, COMMENT, UNSPECIFIC;
13+
ADD, ALTER, DROP, DROP_PRIMARY_KEY, DROP_UNIQUE, DROP_FOREIGN_KEY, MODIFY, CHANGE, ALGORITHM, RENAME, RENAME_TABLE, COMMENT, UNSPECIFIC;
1414
}

src/main/java/net/sf/jsqlparser/util/AddAliasesVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void visit(SetOperationList setOpList) {
5252

5353
@Override
5454
public void visit(AllTableColumns allTableColumns) {
55-
throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
55+
5656
}
5757

5858
@Override

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

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5572,43 +5572,50 @@ AlterExpression AlterExpression():
55725572
)
55735573
(
55745574
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>)
5575-
alterExpressionColumnDataType = AlterExpressionColumnDataType() {
5576-
alterExp.withColumnOldName(tk.image).addColDataType(alterExpressionColumnDataType);
5577-
}
5575+
alterExpressionColumnDataType = AlterExpressionColumnDataType() { alterExp.withColumnOldName(tk.image).addColDataType(alterExpressionColumnDataType); }
55785576
)
55795577
)
55805578
|
5581-
(<K_DROP>
5582-
{
5583-
alterExp.setOperation(AlterOperation.DROP);
5584-
}
5585-
(
5586-
( (LOOKAHEAD(2) <K_COLUMN> { alterExp.hasColumn(true); })?
5587-
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>)
5588-
{
5589-
alterExp.setColumnName(tk.image);
5590-
}
5591-
[tk=<K_CASCADE> { alterExp.addParameters(tk.image); } ]
5592-
5593-
)
5594-
|
5595-
( tk=<K_INDEX>
5596-
(tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER>)
5597-
{
5598-
index = new Index().withType(tk.image).withName(tk2.image);
5599-
alterExp.setIndex(index);
5600-
}
5601-
)
5602-
|
5603-
( <K_CONSTRAINT> [<K_IF> <K_EXISTS> { alterExp.setUsingIfExists(true); } ]
5604-
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>)
5605-
{
5606-
alterExp.setConstraintName(tk.image);
5607-
}
5608-
)
5609-
)
5610-
)
5611-
|
5579+
<K_DROP> { alterExp.setOperation(AlterOperation.DROP); }
5580+
(
5581+
(
5582+
( LOOKAHEAD(2) <K_COLUMN> { alterExp.hasColumn(true); } )?
5583+
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { alterExp.setColumnName(tk.image); }
5584+
[tk=<K_CASCADE> { alterExp.addParameters(tk.image); } ]
5585+
)
5586+
|
5587+
(
5588+
tk=<K_INDEX>
5589+
( tk2=<S_IDENTIFIER> | tk2=<S_QUOTED_IDENTIFIER> ) {
5590+
index = new Index().withType(tk.image).withName(tk2.image);
5591+
alterExp.setIndex(index);
5592+
}
5593+
)
5594+
|
5595+
(
5596+
tk=<K_UNIQUE> { alterExp.setOperation(AlterOperation.DROP_UNIQUE); }
5597+
columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); columnNames = null; }
5598+
[ ( tk=<K_CASCADE> | tk=<K_RESTRICT> ) { alterExp.addParameters(tk.image); } ]
5599+
)
5600+
|
5601+
(
5602+
tk=<K_PRIMARY> tk2=<K_KEY> { alterExp.setOperation(AlterOperation.DROP_PRIMARY_KEY); }
5603+
[ ( tk=<K_CASCADE> | tk=<K_RESTRICT> ) { alterExp.addParameters(tk.image); } ]
5604+
)
5605+
|
5606+
(
5607+
tk=<K_FOREIGN> tk2=<K_KEY> { alterExp.setOperation(AlterOperation.DROP_FOREIGN_KEY); }
5608+
columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); columnNames = null; }
5609+
[ ( tk=<K_CASCADE> | tk=<K_RESTRICT> ) { alterExp.addParameters(tk.image); } ]
5610+
)
5611+
|
5612+
(
5613+
<K_CONSTRAINT> [<K_IF> <K_EXISTS> { alterExp.setUsingIfExists(true); } ]
5614+
( tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { alterExp.setConstraintName(tk.image); }
5615+
[ ( tk=<K_CASCADE> | tk=<K_RESTRICT> ) { alterExp.addParameters(tk.image); } ]
5616+
)
5617+
)
5618+
|
56125619
(<K_ALGORITHM>
56135620
{
56145621
alterExp.setOperation(AlterOperation.ALGORITHM);

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,4 +760,22 @@ public void testRowFormatKeywordIssue1033() throws JSQLParserException {
760760
assertSqlCanBeParsedAndDeparsed("ALTER TABLE test_tab MOVE PARTITION test_tab_q2 COMPRESS", true);
761761
}
762762

763+
@Test
764+
public void testAlterTableDropConstraintsIssue1342() throws JSQLParserException {
765+
// Oracle compliant
766+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE a DROP PRIMARY KEY", true);
767+
768+
// Oracle compliant
769+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE a DROP UNIQUE (b, c, d)", true);
770+
771+
// NOT Oracle compliant!
772+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE a DROP FOREIGN KEY (b, c, d)", true);
773+
}
774+
775+
@Test
776+
public void testAlterTableChangeColumnDropNotNull() throws JSQLParserException {
777+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE a MODIFY COLUMN b DROP NOT NULL", true);
778+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE a MODIFY (COLUMN b DROP NOT NULL, COLUMN c DROP NOT NULL)", true);
779+
}
780+
763781
}

0 commit comments

Comments
 (0)