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 @@
-
-
+
+
+
+
+
+
@@ -418,7 +422,14 @@
1726151534112
-
+
+ 1726152030692
+
+
+
+ 1726152030692
+
+
@@ -433,7 +444,6 @@
-
@@ -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;
+ }
+
+
+
}