diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml
index d1a371135..664b0258e 100644
--- a/sqlTranslate/.idea/workspace.xml
+++ b/sqlTranslate/.idea/workspace.xml
@@ -4,9 +4,8 @@
-
-
-
+
+
@@ -104,20 +103,6 @@
1723106789329
-
- 1724511620952
-
-
-
- 1724511620952
-
-
- 1725117071687
-
-
-
- 1725117071687
-
1725885115923
@@ -447,7 +432,21 @@
1726298762627
-
+
+ 1726315007495
+
+
+
+ 1726315007495
+
+
+ 1726315219011
+
+
+
+ 1726315219011
+
+
@@ -462,8 +461,6 @@
-
-
@@ -487,7 +484,9 @@
-
+
+
+
diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/ForNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/ForNode.java
new file mode 100644
index 000000000..c70d1ac3b
--- /dev/null
+++ b/sqlTranslate/src/main/java/Parser/AST/Loop/ForNode.java
@@ -0,0 +1,33 @@
+package Parser.AST.Loop;
+
+import Lexer.Token;
+import Parser.AST.ASTNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ForNode extends ASTNode {
+ public ForNode() {
+ super();
+ setTokens(new ArrayList<>());
+ }
+
+ public ForNode(ASTNode node) {
+ super(node);
+ setTokens(new ArrayList<>());
+ }
+
+ public ForNode(List tokens) {
+ super(tokens);
+ setTokens(new ArrayList<>());
+ }
+
+ @Override
+ public void visit(ASTNode node, StringBuilder queryString) {
+ queryString.append(toString() + " ");
+ for (ASTNode child : getChildren())
+ {
+ child.visit(child, queryString);
+ }
+ }
+}
diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopBodyNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopBodyNode.java
new file mode 100644
index 000000000..84140970f
--- /dev/null
+++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopBodyNode.java
@@ -0,0 +1,33 @@
+package Parser.AST.Loop;
+
+import Lexer.Token;
+import Parser.AST.ASTNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoopBodyNode extends ASTNode {
+ public LoopBodyNode() {
+ super();
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopBodyNode(ASTNode node) {
+ super(node);
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopBodyNode(List tokens) {
+ super(tokens);
+ setTokens(new ArrayList<>());
+ }
+
+ @Override
+ public void visit(ASTNode node, StringBuilder queryString) {
+ queryString.append(toString() + " ");
+ for (ASTNode child : getChildren())
+ {
+ child.visit(child, queryString);
+ }
+ }
+}
diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopEndNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopEndNode.java
new file mode 100644
index 000000000..895b5a2a1
--- /dev/null
+++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopEndNode.java
@@ -0,0 +1,33 @@
+package Parser.AST.Loop;
+
+import Lexer.Token;
+import Parser.AST.ASTNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoopEndNode extends ASTNode {
+ public LoopEndNode() {
+ super();
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopEndNode(ASTNode node) {
+ super(node);
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopEndNode(List tokens) {
+ super(tokens);
+ setTokens(new ArrayList<>());
+ }
+
+ @Override
+ public void visit(ASTNode node, StringBuilder queryString) {
+ queryString.append(toString());
+ for (ASTNode child : getChildren())
+ {
+ child.visit(child, queryString);
+ }
+ }
+}
diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopExitNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopExitNode.java
new file mode 100644
index 000000000..76f105c74
--- /dev/null
+++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopExitNode.java
@@ -0,0 +1,33 @@
+package Parser.AST.Loop;
+
+import Lexer.Token;
+import Parser.AST.ASTNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoopExitNode extends ASTNode {
+ public LoopExitNode() {
+ super();
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopExitNode(ASTNode node) {
+ super(node);
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopExitNode(List tokens) {
+ super(tokens);
+ setTokens(new ArrayList<>());
+ }
+
+ @Override
+ public void visit(ASTNode node, StringBuilder queryString) {
+ queryString.append(toString() + " ");
+ for (ASTNode child : getChildren())
+ {
+ child.visit(child, queryString);
+ }
+ }
+}
diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/LoopNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopNode.java
new file mode 100644
index 000000000..128005399
--- /dev/null
+++ b/sqlTranslate/src/main/java/Parser/AST/Loop/LoopNode.java
@@ -0,0 +1,33 @@
+package Parser.AST.Loop;
+
+import Lexer.Token;
+import Parser.AST.ASTNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoopNode extends ASTNode {
+ public LoopNode() {
+ super();
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopNode(ASTNode node) {
+ super(node);
+ setTokens(new ArrayList<>());
+ }
+
+ public LoopNode(List tokens) {
+ super(tokens);
+ setTokens(new ArrayList<>());
+ }
+
+ @Override
+ public void visit(ASTNode node, StringBuilder queryString) {
+ queryString.append(toString() + " ");
+ for (ASTNode child : getChildren())
+ {
+ child.visit(child, queryString);
+ }
+ }
+}
diff --git a/sqlTranslate/src/main/java/Parser/AST/Loop/WhileNode.java b/sqlTranslate/src/main/java/Parser/AST/Loop/WhileNode.java
new file mode 100644
index 000000000..d4e4a775e
--- /dev/null
+++ b/sqlTranslate/src/main/java/Parser/AST/Loop/WhileNode.java
@@ -0,0 +1,33 @@
+package Parser.AST.Loop;
+
+import Lexer.Token;
+import Parser.AST.ASTNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class WhileNode extends ASTNode {
+ public WhileNode() {
+ super();
+ setTokens(new ArrayList<>());
+ }
+
+ public WhileNode(ASTNode node) {
+ super(node);
+ setTokens(new ArrayList<>());
+ }
+
+ public WhileNode(List tokens) {
+ super(tokens);
+ setTokens(new ArrayList<>());
+ }
+
+ @Override
+ public void visit(ASTNode node, StringBuilder queryString) {
+ queryString.append(toString());
+ for (ASTNode child : getChildren())
+ {
+ child.visit(child, queryString);
+ }
+ }
+}
diff --git a/sqlTranslate/src/main/java/Parser/OracleParser.java b/sqlTranslate/src/main/java/Parser/OracleParser.java
index d94c5f5ad..d83c3feaf 100644
--- a/sqlTranslate/src/main/java/Parser/OracleParser.java
+++ b/sqlTranslate/src/main/java/Parser/OracleParser.java
@@ -65,7 +65,14 @@ public class OracleParser {
|| (lexer.getTokens().get(0).getValue().equalsIgnoreCase("CREATE") && lexer.getTokens().get(1).getValue().equalsIgnoreCase("VIEW"))
) {
return parseCreateView(lexer.getTokens());
- } else {
+ } else if (
+ lexer.getTokens().get(0).getValue().equalsIgnoreCase("FOR")
+ || lexer.getTokens().get(0).getValue().equalsIgnoreCase("LOOP")
+ || lexer.getTokens().get(0).getValue().equalsIgnoreCase("WHILE")
+ ) {
+ return parseLoop(lexer.getTokens());
+ }
+ else {
try {
throw new ParseFailedException("Parse failed!--Unsupport SQL:" + lexer.getTokens().get(0).getValue());
} catch (ParseFailedException e) {
@@ -724,6 +731,27 @@ public class OracleParser {
return root;
}
+ /**
+ * Loop_clauses
+ * 1:LOOP
+ * --
+ * EXIT WHEN condition;
+ * END LOOP;
+ *
+ * 2:WHILE condition LOOP
+ * --
+ * END LOOP;
+ *
+ * 3:FOR counter IN start..stop LOOP
+ * --
+ * END LOOP;
+ *
+ * @param parseTokens should start with LOOP | WHILE | FOR
+ */
+ public static ASTNode parseLoop(List parseTokens) {
+ return null;
+ }
+
/**
* JOIN clause
* For example: table1 t1 JOIN table2 t2 ON|USING t1.id = t2.id