From 683bc03e370a9e2adf27e877b61ec2514f13d57d Mon Sep 17 00:00:00 2001 From: mjh Date: Wed, 7 Feb 2024 10:53:29 +0800 Subject: [PATCH 1/2] fix: issue1875 --- .../sf/jsqlparser/statement/alter/Alter.java | 21 ++++++++++++++++++- .../statement/alter/AlterExpression.java | 19 +++++++++++++++++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 10 +++------ .../jsqlparser/statement/alter/AlterTest.java | 7 +++++++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java b/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java index 8257aabac..2b522c66a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java @@ -24,6 +24,8 @@ public class Alter implements Statement { private Table table; private boolean useOnly = false; + private boolean useTableIfExists = false; + private List alterExpressions; public Table getTable() { @@ -42,6 +44,19 @@ public void setUseOnly(boolean useOnly) { this.useOnly = useOnly; } + public boolean isUseTableIfExists() { + return useTableIfExists; + } + + public void setUseTableIfExists(boolean useTableIfExists) { + this.useTableIfExists = useTableIfExists; + } + + public Alter withUseTableIfExists(boolean useTableIfExists) { + this.useTableIfExists = useTableIfExists; + return this; + } + public void addAlterExpression(AlterExpression alterExpression) { if (alterExpressions == null) { alterExpressions = new ArrayList(); @@ -71,10 +86,14 @@ public String toString() { b.append("ONLY "); } - if (alterExpressions.size()>0 && alterExpressions.get(0).getOperation()==AlterOperation.RENAME_TABLE && alterExpressions.get(0).isUsingIfExists()) { + if (useTableIfExists) { b.append("IF EXISTS "); } +// if (alterExpressions.size()>0 && alterExpressions.get(0).getOperation()==AlterOperation.RENAME_TABLE && alterExpressions.get(0).isUsingIfExists()) { +// b.append("IF EXISTS "); +// } + b.append(table.getFullyQualifiedName()).append(" "); Iterator altIter = alterExpressions.iterator(); 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 1ea5d4292..744d967a4 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java @@ -70,6 +70,8 @@ public class AlterExpression implements Serializable { private String truncatePartitionName = null; + private boolean useIfNotExists = false; + public Index getOldIndex() { return oldIndex; } @@ -417,6 +419,19 @@ public AlterExpression withTruncatePartitionName(String truncatePartitionName) { return this; } + public boolean isUseIfNotExists() { + return useIfNotExists; + } + + public void setUseIfNotExists(boolean useIfNotExists) { + this.useIfNotExists = useIfNotExists; + } + + public AlterExpression withUserIfNotExists(boolean userIfNotExists) { + this.useIfNotExists = userIfNotExists; + return this; + } + @Override @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity", "PMD.ExcessiveMethodLength", "PMD.SwitchStmtsShouldHaveDefault"}) @@ -493,6 +508,10 @@ public String toString() { if (hasColumn) { b.append("COLUMN "); } + if (useIfNotExists + && operation == AlterOperation.ADD) { + b.append("IF NOT EXISTS "); + } } if (useBrackets && colDataTypeList.size() == 1) { b.append(" ( "); diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 40b9d82b8..40f393769 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -6293,7 +6293,7 @@ AlterExpression AlterExpression(): | LOOKAHEAD(3) ( ( LOOKAHEAD(2) { alterExp.hasColumn(true); } )? - + [ { alterExp.setUseIfNotExists(true); } ] ( LOOKAHEAD(4) ( "(" @@ -6625,14 +6625,10 @@ Alter AlterTable(): { [ { alter.setUseOnly(true); } ] - [ LOOKAHEAD(2) { usingIfExists = true; } ] - + [ LOOKAHEAD(2) { alter.setUseTableIfExists(true); } ] table=Table() { alter.setTable(table); } - alterExp=AlterExpression() { if (usingIfExists) - alter.addAlterExpression( alterExp.withUsingIfExists(true) ); - else - alter.addAlterExpression(alterExp); } + alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } ("," alterExp=AlterExpression() { alter.addAlterExpression(alterExp); } )* 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 b43780dce..86962ae0f 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -988,4 +988,11 @@ public void testIssue1890() throws JSQLParserException { "ALTER TABLE xdmiddle.ft_mid_sop_sms_send_list_daily TRUNCATE PARTITION sum_date"; assertSqlCanBeParsedAndDeparsed(stmt); } + + @Test + public void testIssue1875() throws JSQLParserException { + String stmt = + "ALTER TABLE IF EXISTS usercenter.dict_surgeries ADD COLUMN IF NOT EXISTS operation_grade_id int8 NULL"; + assertSqlCanBeParsedAndDeparsed(stmt); + } } From 71db97a5021d015323a3d3d30fba362a00007d28 Mon Sep 17 00:00:00 2001 From: mjh Date: Wed, 7 Feb 2024 11:02:46 +0800 Subject: [PATCH 2/2] fix: code format --- .../java/net/sf/jsqlparser/statement/alter/Alter.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java b/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java index 2b522c66a..0aabfc181 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java @@ -90,10 +90,6 @@ public String toString() { b.append("IF EXISTS "); } -// if (alterExpressions.size()>0 && alterExpressions.get(0).getOperation()==AlterOperation.RENAME_TABLE && alterExpressions.get(0).isUsingIfExists()) { -// b.append("IF EXISTS "); -// } - b.append(table.getFullyQualifiedName()).append(" "); Iterator altIter = alterExpressions.iterator(); @@ -127,13 +123,15 @@ public Alter withAlterExpressions(List alterExpressions) { } public Alter addAlterExpressions(AlterExpression... alterExpressions) { - List collection = Optional.ofNullable(getAlterExpressions()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getAlterExpressions()).orElseGet(ArrayList::new); Collections.addAll(collection, alterExpressions); return this.withAlterExpressions(collection); } public Alter addAlterExpressions(Collection alterExpressions) { - List collection = Optional.ofNullable(getAlterExpressions()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getAlterExpressions()).orElseGet(ArrayList::new); collection.addAll(alterExpressions); return this.withAlterExpressions(collection); }