forked from opengaussexamples/examples
add Delete
This commit is contained in:
parent
84b694de4c
commit
824b2927d0
|
|
@ -4,8 +4,12 @@
|
|||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add update convert rules">
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Document/Todolist" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Document/Todolist" afterDir="false" />
|
||||
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add Delete ast class">
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/Document/Delete statement in Oracle" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Main.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Main.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
|
|
@ -418,7 +422,14 @@
|
|||
<option name="project" value="LOCAL" />
|
||||
<updated>1726151534112</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="46" />
|
||||
<task id="LOCAL-00046" summary="add Delete ast class">
|
||||
<created>1726152030692</created>
|
||||
<option name="number" value="00046" />
|
||||
<option name="presentableId" value="LOCAL-00046" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1726152030692</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="47" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
|
|
@ -433,7 +444,6 @@
|
|||
</option>
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<MESSAGE value="init" />
|
||||
<MESSAGE value="lexer" />
|
||||
<MESSAGE value="AST node" />
|
||||
<MESSAGE value="add AST node" />
|
||||
|
|
@ -458,7 +468,8 @@
|
|||
<MESSAGE value="add select convert rules" />
|
||||
<MESSAGE value="add update ast class" />
|
||||
<MESSAGE value="add update convert rules" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="add update convert rules" />
|
||||
<MESSAGE value="add Delete ast class" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="add Delete ast class" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<watches-manager>
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
DELETE FROM deleteObject WHERE condition ;
|
||||
|
|
@ -16,7 +16,7 @@ Operation
|
|||
return
|
||||
exception
|
||||
commit、rollback、execute
|
||||
alter table
|
||||
alter table 1
|
||||
create table 1
|
||||
drop table 1
|
||||
Object
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<Token> parseTokens) {
|
||||
List<Token> 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue