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 @@
-
+
-
+
+
-
-
@@ -108,13 +107,6 @@
1723106789329
-
- 1724419179050
-
-
-
- 1724419179050
-
1724423798948
@@ -451,7 +443,14 @@
1726215657277
-
+
+ 1726234244501
+
+
+
+ 1726234244501
+
+
@@ -466,7 +465,6 @@
-
@@ -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")) {