From cc7aa01913a720141be0da69bac41b6e4497f422 Mon Sep 17 00:00:00 2001 From: mjh Date: Sun, 4 Feb 2024 15:19:19 +0800 Subject: [PATCH] support oracle alter table truncate partition (#1954) * feat: oracle alter table truncate partition * feat: oracle alter table truncate partition * feat: code format * feat: code format --------- Co-authored-by: mjh --- .../statement/alter/AlterExpression.java | 18 ++++++++++++++++++ .../statement/alter/AlterOperation.java | 2 +- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 3 +++ .../jsqlparser/statement/alter/AlterTest.java | 7 +++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java index f31de0da3..1ea5d4292 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java @@ -68,6 +68,8 @@ public class AlterExpression implements Serializable { private boolean useBrackets = false; + private String truncatePartitionName = null; + public Index getOldIndex() { return oldIndex; } @@ -402,6 +404,19 @@ public void setUk(boolean uk) { this.uk = uk; } + public String getTruncatePartitionName() { + return truncatePartitionName; + } + + public void setTruncatePartitionName(String truncatePartitionName) { + this.truncatePartitionName = truncatePartitionName; + } + + public AlterExpression withTruncatePartitionName(String truncatePartitionName) { + this.truncatePartitionName = truncatePartitionName; + return this; + } + @Override @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity", "PMD.ExcessiveMethodLength", "PMD.SwitchStmtsShouldHaveDefault"}) @@ -441,6 +456,9 @@ public String toString() { && !pkColumns.isEmpty()) { // Oracle Multi Column Drop b.append("DROP (").append(PlainSelect.getStringList(pkColumns)).append(')'); + } else if (operation == AlterOperation.TRUNCATE_PARTITION + && truncatePartitionName != null) { + b.append("TRUNCATE PARTITION ").append(truncatePartitionName); } else { if (operation == AlterOperation.COMMENT_WITH_EQUAL_SIGN) { b.append("COMMENT =").append(" "); diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java index adddaa14d..3d0ead731 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterOperation.java @@ -10,7 +10,7 @@ package net.sf.jsqlparser.statement.alter; public enum AlterOperation { - ADD, ALTER, DROP, DROP_PRIMARY_KEY, DROP_UNIQUE, DROP_FOREIGN_KEY, MODIFY, CHANGE, ALGORITHM, RENAME, RENAME_TABLE, RENAME_INDEX, RENAME_KEY, RENAME_CONSTRAINT, COMMENT, COMMENT_WITH_EQUAL_SIGN, UNSPECIFIC; + ADD, ALTER, DROP, DROP_PRIMARY_KEY, DROP_UNIQUE, DROP_FOREIGN_KEY, MODIFY, CHANGE, ALGORITHM, RENAME, RENAME_TABLE, RENAME_INDEX, RENAME_KEY, RENAME_CONSTRAINT, COMMENT, COMMENT_WITH_EQUAL_SIGN, UNSPECIFIC, TRUNCATE_PARTITION; public static AlterOperation from(String operation) { return Enum.valueOf(AlterOperation.class, operation.toUpperCase()); diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index c857e4cbb..40b9d82b8 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -6255,6 +6255,7 @@ AlterExpression AlterExpression(): AlterExpression.ColumnDropNotNull alterExpressionColumnDropNotNull = null; AlterExpression.ColumnDropDefault alterExpressionColumnDropDefault = null; ReferentialAction.Action action = null; + String truncatePartitionName = null; // for captureRest() List tokens = new LinkedList(); @@ -6546,6 +6547,8 @@ AlterExpression AlterExpression(): } ) | + LOOKAHEAD(2) { alterExp.setOperation(AlterOperation.TRUNCATE_PARTITION); } truncatePartitionName = RelObjectName() { alterExp.setTruncatePartitionName(truncatePartitionName); } + | tokens = captureRest() { alterExp.setOperation(AlterOperation.UNSPECIFIC); StringBuilder optionalSpecifier = new StringBuilder(); diff --git a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java index ab07437a6..b43780dce 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -981,4 +981,11 @@ public void testAlterColumnSetCommitTimestamp1() throws JSQLParserException { assertEquals("UPDATE_DATE_TIME_GMT SET OPTIONS (allow_commit_timestamp=true)", type.toString()); } + + @Test + public void testIssue1890() throws JSQLParserException { + String stmt = + "ALTER TABLE xdmiddle.ft_mid_sop_sms_send_list_daily TRUNCATE PARTITION sum_date"; + assertSqlCanBeParsedAndDeparsed(stmt); + } }