diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml index be45680e5..cfd427f1f 100644 --- a/sqlTranslate/.idea/workspace.xml +++ b/sqlTranslate/.idea/workspace.xml @@ -4,12 +4,11 @@ - @@ -491,7 +489,8 @@ - diff --git a/sqlTranslate/src/main/java/Document/Update statement in Oracle b/sqlTranslate/src/main/java/Document/Update statement in Oracle index 121d2a591..fa215a03a 100644 --- a/sqlTranslate/src/main/java/Document/Update statement in Oracle +++ b/sqlTranslate/src/main/java/Document/Update statement in Oracle @@ -1 +1,4 @@ -UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; \ No newline at end of file +UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; + +Example: UPDATE employees e JOIN departments d using e.department_id = d.department_id + SET e.salary = e.salary * 1.10, d.budget = d.budget * 1.10 WHERE d.department_name = 'Sales'; \ No newline at end of file diff --git a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java index 6a1de0aea..ce4967e89 100644 --- a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java +++ b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java @@ -19,6 +19,7 @@ import Parser.AST.Select.SelectNode; import Parser.AST.Select.SelectObjNode; import Parser.AST.Update.UpdateNode; import Parser.AST.Update.UpdateObjNode; +import Parser.AST.View.ViewCreateNode; import Parser.OracleParser; import java.util.ArrayList; @@ -59,6 +60,9 @@ public class OpenGaussGenerator { else if (node instanceof AlterNode) { return GenAlterSQL(node); } + else if (node instanceof ViewCreateNode) { + return GenCreateViewSQL(node); + } else { try { throw new GenerateFailedException("Root node:" + node.getClass() + "(Unsupported node type!)"); @@ -88,7 +92,7 @@ public class OpenGaussGenerator { } private String GenSelectSQL(ASTNode node) { - visitSelect(node, null); + visitSelect(node); // System.out.println(node.getASTString()); return node.toQueryString(); } @@ -114,6 +118,11 @@ public class OpenGaussGenerator { return node.toQueryString(); } + private String GenCreateViewSQL(ASTNode node) { + visitCreateView(node); + return node.toQueryString(); + } + private void visitCrt(ASTNode node) { if (node instanceof ColumnNode) { ColumnTypeConvert((ColumnNode) node); @@ -153,21 +162,12 @@ public class OpenGaussGenerator { } } - private void visitSelect(ASTNode node, ASTNode parentNode) { - if (node instanceof SelectObjNode) { - // check whether there exists a join statement in the select sql - if (node.getTokens().contains(new Token(Token.TokenType.KEYWORD, "JOIN"))) { - ASTNode joinRootNode = OracleParser.parseJoin(node.getTokens()); - visitJoin(joinRootNode); - parentNode.replaceChild(node, joinRootNode); - ASTNode smallestChild = joinRootNode.getDeepestChild(); - for (ASTNode child : node.getChildren()) { - smallestChild.addChild(child); - } - } + private void visitSelect(ASTNode node) { + if (node instanceof JoinSourceTabNode) { + visitJoin(node); } for (ASTNode child : node.getChildren()) { - visitSelect(child, node); + visitSelect(child); } } @@ -201,6 +201,15 @@ public class OpenGaussGenerator { } } + private void visitCreateView(ASTNode node) { + if (node instanceof SelectNode) { + visitSelect(node); + } + for (ASTNode child : node.getChildren()) { + visitCreateView(child); + } + } + private void ColumnTypeConvert(ColumnType node) { // type convert if (node.getType().getValue().equalsIgnoreCase("NUMBER")) { diff --git a/sqlTranslate/src/main/java/Main.java b/sqlTranslate/src/main/java/Main.java index b2bb58bed..5b072bf97 100644 --- a/sqlTranslate/src/main/java/Main.java +++ b/sqlTranslate/src/main/java/Main.java @@ -32,7 +32,7 @@ public class Main { // ");"; // String sql = "ALTER TABLE employees ADD email VARCHAR2(100) Check (email != '12813@163.com');"; // String sql = "CASE WHEN column2 > 0 THEN 'Positive' ELSE 'Non-positive' END"; - String sql = "CREATE OR REPLACE VIEW emp_dept_info AS SELECT e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id;"; + String sql = "CREATE OR REPLACE VIEW emp_dept_info AS SELECT e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d Using e.department_id = d.department_id;"; 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 b9dd3a6a6..6bff97fc1 100644 --- a/sqlTranslate/src/main/java/Parser/OracleParser.java +++ b/sqlTranslate/src/main/java/Parser/OracleParser.java @@ -450,9 +450,16 @@ public class OracleParser { } tokens.add(parseTokens.get(j)); } - ASTNode childNode = new SelectObjNode(tokens); - currentNode.addChild(childNode); - currentNode = childNode; + if (tokens.contains(new Token(Token.TokenType.KEYWORD, "JOIN"))) { + ASTNode joinRootNode = parseJoin(tokens); + currentNode.addChild(joinRootNode); + currentNode = joinRootNode.getDeepestChild(); + } + else { + ASTNode childNode = new SelectObjNode(tokens); + currentNode.addChild(childNode); + currentNode = childNode; + } } // match where_clause (possible last token: ; | GROUP | ORDER | HAVING | UNION) else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("WHERE")) {