diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml
index eb513254..b6926131 100644
--- a/sqlTranslate/.idea/workspace.xml
+++ b/sqlTranslate/.idea/workspace.xml
@@ -4,16 +4,20 @@
-
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
@@ -136,7 +140,14 @@
1723992163694
-
+
+ 1724145125754
+
+
+
+ 1724145125754
+
+
@@ -155,6 +166,7 @@
-
+
+
\ No newline at end of file
diff --git a/sqlTranslate/pom.xml b/sqlTranslate/pom.xml
index bb34291c..a05364c0 100644
--- a/sqlTranslate/pom.xml
+++ b/sqlTranslate/pom.xml
@@ -40,6 +40,14 @@
maven-surefire-plugin
3.0.0-M5
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 9
+ 9
+
+
diff --git a/sqlTranslate/src/main/java/Exception/ParseFailedException.java b/sqlTranslate/src/main/java/Exception/ParseFailedException.java
new file mode 100644
index 00000000..7d9458f5
--- /dev/null
+++ b/sqlTranslate/src/main/java/Exception/ParseFailedException.java
@@ -0,0 +1,8 @@
+package Exception;
+
+public class ParseFailedException extends RuntimeException{
+ public ParseFailedException(String message)
+ {
+ super(message);
+ }
+}
diff --git a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java
index 6e4a894f..fe661260 100644
--- a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java
+++ b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java
@@ -1,4 +1,13 @@
package Generator;
+import Parser.AST.ASTNode;
+
public class OpenGaussGenerator {
+ private ASTNode node;
+ public OpenGaussGenerator(ASTNode node) {
+ this.node = node;
+ }
+ public String generate() {
+ return node.toQueryString();
+ }
}
diff --git a/sqlTranslate/src/main/java/Lexer/OracleLexer.java b/sqlTranslate/src/main/java/Lexer/OracleLexer.java
index f9ee67a0..70fdcaaa 100644
--- a/sqlTranslate/src/main/java/Lexer/OracleLexer.java
+++ b/sqlTranslate/src/main/java/Lexer/OracleLexer.java
@@ -10,7 +10,7 @@ import java.util.regex.Pattern;
public class OracleLexer {
public static final String[] keywords = {"SELECT", "FROM", "WHERE", "AND", "OR", "INSERT", "UPDATE", "DELETE",
// keywords of creating table
- "CREATE", "TABLE", "TEMPORARY",
+ "CREATE", "TABLE", "TEMPORARY", "GLOBAL",
"NUMBER", "INTEGER", "SMALLIN", "BINARY_INTEGER", "DECIMAL", "REAL", "FLOAT", "DOUBLE PRECISION", "CHAR", "VARCHAR2",
"NCHAR", "NVARCHAR2", "CLOB", "NCLOB", "DATE", "TIMESTAMP", "TIMESTAMP WITH TIME ZONE", "TIMESTAMP WITH LOCAL TIME ZONE", "BLOB", "RAW",
"LONG RAW", "BOOLEAN", "INTERVAL YEAR TO MONTH", "INTERVAL DAY TO SECOND", "ROWID", "UROWID", "REF CURSOR",
@@ -138,4 +138,8 @@ public class OracleLexer {
System.out.println(token);
}
}
+
+ public List getTokens() {
+ return tokens;
+ }
}
diff --git a/sqlTranslate/src/main/java/Parser/AST/ASTNode.java b/sqlTranslate/src/main/java/Parser/AST/ASTNode.java
index de092614..d89a6918 100644
--- a/sqlTranslate/src/main/java/Parser/AST/ASTNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/ASTNode.java
@@ -6,26 +6,26 @@ import java.util.ArrayList;
import java.util.List;
public abstract class ASTNode {
- private Token token;
+ private List tokens;
private ASTNode parent;
private List children = new ArrayList<>();
- public ASTNode(Token token) {
- this.token = token;
+ public ASTNode(List tokens) {
+ this.tokens = tokens;
}
public ASTNode(ASTNode node) {
- this.token = node.token;
+ this.tokens = node.tokens;
this.parent = node.parent;
this.children = new ArrayList<>(node.children);
}
- public Token getToken() {
- return token;
+ public List getTokens() {
+ return tokens;
}
- public void setToken(Token token) {
- this.token = token;
+ public void setTokens(List tokens) {
+ this.tokens = tokens;
}
public ASTNode getParent() {
@@ -66,7 +66,7 @@ public abstract class ASTNode {
*/
public void setChildrenByName(String childName, ASTNode child) {
for (int i = 0; i < this.children.size(); i++) {
- if (this.children.get(i).getToken().getValue().contains(childName)) {
+ if (this.children.get(i).toString().contains(childName)) {
this.children.set(i, child);
break;
}
@@ -103,6 +103,13 @@ public abstract class ASTNode {
@Override
public String toString() {
- return token.getValue();
+ String str = "";
+ for (int i = 0; i < tokens.size(); i++) {
+ if (i < tokens.size() - 1)
+ str += tokens.get(i).getValue() + " ";
+ else
+ str += tokens.get(i).getValue();
+ }
+ return str;
}
}
diff --git a/sqlTranslate/src/main/java/Parser/AST/EndNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/CRTEndNode.java
similarity index 53%
rename from sqlTranslate/src/main/java/Parser/AST/EndNode.java
rename to sqlTranslate/src/main/java/Parser/AST/CreateTable/CRTEndNode.java
index 5aa6a95e..01db870e 100644
--- a/sqlTranslate/src/main/java/Parser/AST/EndNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/CRTEndNode.java
@@ -1,18 +1,21 @@
-package Parser.AST;
+package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
-public class EndNode extends ASTNode{
- public EndNode(ASTNode node)
+
+import java.util.List;
+
+public class CRTEndNode extends ASTNode {
+ public CRTEndNode(ASTNode node)
{
super(node);
}
- public EndNode(Token token)
+ public CRTEndNode(List tokens)
{
- super(token);
+ super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
- queryString.append(")" + getToken().getValue());
+ queryString.append(")" + toString());
for (ASTNode child : getChildren())
{
child.visit(child, queryString);
diff --git a/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java
index 0b0c7bbd..671912fb 100644
--- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java
@@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
+import java.util.List;
+
public class ColumnNode extends ASTNode {
public ColumnNode(ASTNode node)
{
super(node);
}
- public ColumnNode(Token token)
+ public ColumnNode(List tokens)
{
- super(token);
+ super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
- queryString.append(getToken().getValue() + " ");
+ queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);
diff --git a/sqlTranslate/src/main/java/Parser/AST/CreateTable/CreateTabNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/CreateTabNode.java
index 3676552e..5fbc3006 100644
--- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/CreateTabNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/CreateTabNode.java
@@ -2,25 +2,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
+import java.util.List;
public class CreateTabNode extends ASTNode {
public CreateTabNode(ASTNode node) {
super(node);
}
- public CreateTabNode(Token token) {
- super(token);
+ public CreateTabNode(List tokens) {
+ super(tokens);
}
@Override
public void visit(ASTNode node, StringBuilder queryString) {
// judge the type of the table
- if (getChildren().get(0) instanceof TableTypeNode) {
- queryString.append("CREATE ");
- }
- else {
- queryString.append("CREATE TABLE ");
- }
+ queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);
diff --git a/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java
index f64a8668..d10d4126 100644
--- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java
@@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
+import java.util.List;
+
public class TableConstraintNode extends ASTNode{
public TableConstraintNode(ASTNode node)
{
super(node);
}
- public TableConstraintNode(Token token)
+ public TableConstraintNode(List tokens)
{
- super(token);
+ super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
- queryString.append(getToken().getValue() + " ");
+ queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);
diff --git a/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableNode.java
index ce8ab1b4..a66bde7d 100644
--- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableNode.java
@@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
+import java.util.List;
+
public class TableNode extends ASTNode{
public TableNode(ASTNode node)
{
super(node);
}
- public TableNode(Token token)
+ public TableNode(List tokens)
{
- super(token);
+ super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
- queryString.append(getToken().getValue() + " ");
+ queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);
diff --git a/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableTypeNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableTypeNode.java
index b90157c8..73de827f 100644
--- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableTypeNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableTypeNode.java
@@ -3,19 +3,21 @@ package Parser.AST.CreateTable;
import Lexer.Token;
import Parser.AST.ASTNode;
+import java.util.List;
+
public class TableTypeNode extends ASTNode {
public TableTypeNode(ASTNode node)
{
super(node);
}
- public TableTypeNode(Token token)
+ public TableTypeNode(List tokens)
{
- super(token);
+ super(tokens);
}
public void visit(ASTNode node, StringBuilder queryString)
{
- queryString.append(getToken() + " ");
+ queryString.append(toString() + " ");
for (ASTNode child : getChildren())
{
child.visit(child, queryString);
diff --git a/sqlTranslate/src/main/java/Parser/AST/SelectStatementNode.java b/sqlTranslate/src/main/java/Parser/AST/SelectStatementNode.java
index d7ac736b..0d3eb828 100644
--- a/sqlTranslate/src/main/java/Parser/AST/SelectStatementNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/SelectStatementNode.java
@@ -2,21 +2,23 @@ package Parser.AST;
import Lexer.Token;
+import java.util.List;
+
public class SelectStatementNode extends ASTNode{
public SelectStatementNode(ASTNode node)
{
super(node);
}
- public SelectStatementNode(Token token)
+ public SelectStatementNode(List tokens)
{
- super(token);
+ super(tokens);
}
@Override
public void visit(ASTNode node, StringBuilder queryString)
{
- queryString.append("SELECT ");
+ 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 bd0f93ca..d44c522d 100644
--- a/sqlTranslate/src/main/java/Parser/OracleParser.java
+++ b/sqlTranslate/src/main/java/Parser/OracleParser.java
@@ -1,17 +1,83 @@
package Parser;
import Lexer.OracleLexer;
+import Lexer.Token;
import Parser.AST.ASTNode;
+import Exception.ParseFailedException;
+import Parser.AST.CreateTable.CreateTabNode;
+import Parser.AST.CreateTable.TableNode;
+import Parser.AST.CreateTable.TableTypeNode;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
public class OracleParser {
private OracleLexer lexer;
public OracleParser(OracleLexer lexer) {
this.lexer = lexer;
}
- public ASTNode parse(String input)
+ public ASTNode parse()
{
+ List tokens = lexer.getTokens();
+ // check if the input is a create table statement
+ if ((tokens.get(0).getValue().equalsIgnoreCase("CREATE") && tokens.get(1).getValue().equalsIgnoreCase("TABLE")) ||
+ (tokens.get(0).getValue().equalsIgnoreCase("CREATE") && tokens.get(2).getValue().equalsIgnoreCase("TEMPORARY") && tokens.get(3).getValue().equalsIgnoreCase("TABLE")) ) {
+ return parseCreateTab();
+ }
+ else {
+ throw new ParseFailedException("Parse failed!");
+ }
+ }
- return null;
+ private ASTNode parseCreateTab() {
+ List tokens = new ArrayList<>();
+ tokens.add(lexer.getTokens().get(0));
+ ASTNode root = new CreateTabNode(tokens);
+ ASTNode currentNode = root;
+ for (int i = 1; i < lexer.getTokens().size(); i++) {
+ if (i == 1 && lexer.getTokens().get(i).getValue().equalsIgnoreCase("TABLE")) {
+ tokens.clear();
+ tokens.add(lexer.getTokens().get(i));
+ try {
+ tokens.add(lexer.getTokens().get(i + 1));
+ }
+ catch (ParseFailedException e) {
+ throw new ParseFailedException("Parse failed!");
+ }
+ i++;
+ ASTNode child = new TableNode(tokens);
+ root.addChild(child);
+ currentNode = child;
+ }
+ else if (i == 1 && !lexer.getTokens().get(i).getValue().equalsIgnoreCase("TABLE")){
+ tokens.clear();
+ tokens.add(lexer.getTokens().get(i));
+ for (int j = i + 1; j < lexer.getTokens().size(); j++) {
+ if (lexer.getTokens().get(j).getValue().equalsIgnoreCase("TABLE")) {
+ ASTNode child = new TableTypeNode(tokens);
+ root.addChild(child);
+ currentNode = child;
+ tokens.clear();
+ tokens.add(lexer.getTokens().get(j));
+ try {
+ tokens.add(lexer.getTokens().get(j + 1));
+ }
+ catch (ParseFailedException e) {
+ throw new ParseFailedException("Parse failed!");
+ }
+ i = j + 1;
+ break;
+ }
+ tokens.add(lexer.getTokens().get(j));
+ }
+
+ ASTNode child = new TableNode(tokens);
+ currentNode.addChild(child);
+ currentNode = child;
+ }
+ }
+ return root;
}