From 824b2927d0031148c0f9cb03e8aa92cfcd40608d Mon Sep 17 00:00:00 2001 From: XudongXie Date: Thu, 12 Sep 2024 22:56:47 +0800 Subject: [PATCH] add Delete --- sqlTranslate/.idea/workspace.xml | 21 +++-- .../java/Document/Delete statement in Oracle | 1 + sqlTranslate/src/main/java/Document/Todolist | 2 +- .../java/Generator/OpenGaussGenerator.java | 8 ++ sqlTranslate/src/main/java/Main.java | 6 ++ .../src/main/java/Parser/OracleParser.java | 82 +++++++++++++++++++ 6 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 sqlTranslate/src/main/java/Document/Delete statement in Oracle diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml index 1c09af0fb..5f9f115e8 100644 --- a/sqlTranslate/.idea/workspace.xml +++ b/sqlTranslate/.idea/workspace.xml @@ -4,8 +4,12 @@ - @@ -458,7 +468,8 @@ - diff --git a/sqlTranslate/src/main/java/Document/Delete statement in Oracle b/sqlTranslate/src/main/java/Document/Delete statement in Oracle new file mode 100644 index 000000000..b02b4bdef --- /dev/null +++ b/sqlTranslate/src/main/java/Document/Delete statement in Oracle @@ -0,0 +1 @@ +DELETE FROM deleteObject WHERE condition ; \ No newline at end of file diff --git a/sqlTranslate/src/main/java/Document/Todolist b/sqlTranslate/src/main/java/Document/Todolist index a00b01667..a1576e7d5 100644 --- a/sqlTranslate/src/main/java/Document/Todolist +++ b/sqlTranslate/src/main/java/Document/Todolist @@ -16,7 +16,7 @@ Operation  return  exception  commit、rollback、execute - alter table + alter table 1  create table 1  drop table 1 Object diff --git a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java index c5acf0dee..3d8a08a57 100644 --- a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java +++ b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java @@ -5,6 +5,7 @@ import Parser.AST.ASTNode; import Parser.AST.CreateTable.ColumnNode; import Parser.AST.CreateTable.CreateTabNode; import Exception.GenerateFailedException; +import Parser.AST.Delete.DeleteNode; import Parser.AST.Drop.DropNode; import Parser.AST.Drop.DropOptionNode; import Parser.AST.Insert.InsertNode; @@ -48,6 +49,9 @@ public class OpenGaussGenerator { else if (node instanceof UpdateNode) { return GenUpdateSQL(node); } + else if (node instanceof DeleteNode) { + return GenDeleteSQL(node); + } else { try { throw new GenerateFailedException("Root node:" + node.getClass() + "(Unsupported node type!)"); @@ -92,6 +96,10 @@ public class OpenGaussGenerator { return node.toQueryString(); } + private String GenDeleteSQL(ASTNode node) { + return node.toQueryString(); + } + private void visitCrt(ASTNode node) { if (node instanceof ColumnNode) { ColumnTypeConvert((ColumnNode) node); diff --git a/sqlTranslate/src/main/java/Main.java b/sqlTranslate/src/main/java/Main.java index b2381420a..d815f31ff 100644 --- a/sqlTranslate/src/main/java/Main.java +++ b/sqlTranslate/src/main/java/Main.java @@ -23,6 +23,12 @@ public class Main { // "SET e.salary = e.salary * 1.10,\n" + // " d.budget = d.budget * 1.10\n" + // "WHERE d.department_name = 'Sales';"; +// String sql = "DELETE FROM employees e\n" + +// "WHERE e.department_id IN (\n" + +// " SELECT d.department_id\n" + +// " FROM departments d\n" + +// " WHERE d.department_name = 'Sales'\n" + +// ");"; OracleLexer lexer = new OracleLexer(sql); lexer.printTokens(); OracleParser parser = new OracleParser(lexer); diff --git a/sqlTranslate/src/main/java/Parser/OracleParser.java b/sqlTranslate/src/main/java/Parser/OracleParser.java index 312bb14d2..3f12175f7 100644 --- a/sqlTranslate/src/main/java/Parser/OracleParser.java +++ b/sqlTranslate/src/main/java/Parser/OracleParser.java @@ -9,6 +9,10 @@ import Parser.AST.CaseWhen.CaseElseNode; import Parser.AST.CaseWhen.CaseEndNode; import Parser.AST.CaseWhen.CaseThenNode; import Parser.AST.CreateTable.*; +import Parser.AST.Delete.DeleteConditionNode; +import Parser.AST.Delete.DeleteEndNode; +import Parser.AST.Delete.DeleteNode; +import Parser.AST.Delete.DeleteObjNode; import Parser.AST.Drop.DropEndNode; import Parser.AST.Drop.DropObjNameNode; import Parser.AST.Drop.DropNode; @@ -50,6 +54,9 @@ public class OracleParser { else if (lexer.getTokens().get(0).getValue().equalsIgnoreCase("UPDATE")) { return parseUpdate(lexer.getTokens()); } + else if (lexer.getTokens().get(0).getValue().equalsIgnoreCase("DELETE")) { + return parseDelete(lexer.getTokens()); + } else { try { throw new ParseFailedException("Parse failed!"); @@ -818,4 +825,79 @@ public class OracleParser { return root; } + + /** + * Delete + * For example: + * DELETE FROM employees e + * WHERE e.department_id IN ( + * SELECT d.department_id + * FROM departments d + * WHERE d.department_name = 'Sales' + * ); + */ + private ASTNode parseDelete(List parseTokens) { + List tokens = new ArrayList<>(); + tokens.add(parseTokens.get(0)); + try{ + tokens.add(parseTokens.get(1)); + } catch (IndexOutOfBoundsException e) { + e.printStackTrace(); + } + ASTNode root = new DeleteNode(tokens); + ASTNode currentNode = root; + for (int i = 2; i < parseTokens.size(); i++) { + // match delete object + if (i == 2 && parseTokens.get(i).hasType(Token.TokenType.IDENTIFIER)) { + tokens = new ArrayList<>(); + for (int j = i; j < parseTokens.size(); j++) { + if (parseTokens.get(j).hasType(Token.TokenType.KEYWORD) && parseTokens.get(j).getValue().equalsIgnoreCase("WHERE")) { + i = j - 1; + break; + } + tokens.add(parseTokens.get(j)); + } + ASTNode childNode = new DeleteObjNode(tokens); + currentNode.addChild(childNode); + currentNode = childNode; + } + // match WHERE condition + else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("WHERE")) { + tokens = new ArrayList<>(); + for (int j = i; j < parseTokens.size(); j++) { + if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equalsIgnoreCase(";")) { + i = j - 1; + break; + } + tokens.add(parseTokens.get(j)); + } + ASTNode childNode = new DeleteConditionNode(tokens); + currentNode.addChild(childNode); + currentNode = childNode; + } + else if (parseTokens.get(i).hasType(Token.TokenType.SYMBOL) && parseTokens.get(i).getValue().equals(";")) { + tokens = new ArrayList<>(); + tokens.add(parseTokens.get(i)); + ASTNode childNode = new DeleteEndNode(tokens); + currentNode.addChild(childNode); + currentNode = childNode; + } + else if (parseTokens.get(i).hasType(Token.TokenType.EOF)) { + break; + } + else { + try { + throw new ParseFailedException("Parse failed:" + parseTokens.get(i)); + } + catch (ParseFailedException e) { + e.printStackTrace(); + } + } + } + + return root; + } + + + }