diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml
index be8738ec..f6da9c59 100644
--- a/sqlTranslate/.idea/workspace.xml
+++ b/sqlTranslate/.idea/workspace.xml
@@ -4,13 +4,17 @@
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
+
@@ -248,7 +252,14 @@
1724511620952
-
+
+ 1725117071687
+
+
+
+ 1725117071687
+
+
@@ -273,7 +284,8 @@
-
+
+
diff --git a/sqlTranslate/src/main/java/Document/Select statement in Oracle b/sqlTranslate/src/main/java/Document/Select statement in Oracle
new file mode 100644
index 00000000..d45fb273
--- /dev/null
+++ b/sqlTranslate/src/main/java/Document/Select statement in Oracle
@@ -0,0 +1,2 @@
+INSERT INTO employees (first_name, last_name, email) VALUES ('Jane', 'Smith', 'janesm@example.com');
+INSERT INTO employees VALUES ('Jane', 'Smith', 'janesm@example.com');
\ 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 d9eac9a3..49fa52e1 100644
--- a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java
+++ b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java
@@ -5,6 +5,7 @@ import Parser.AST.ASTNode;
import Parser.AST.CreateTable.ColumnNode;
import Parser.AST.CreateTable.CreateTabNode;
import Exception.GenerateFailedException;
+import Parser.AST.Insert.InsertNode;
public class OpenGaussGenerator {
private ASTNode node;
@@ -15,6 +16,9 @@ public class OpenGaussGenerator {
if (node instanceof CreateTabNode) {
return GenCreatTableSQL(node);
}
+ else if (node instanceof InsertNode) {
+ return GenInsertSQL(node);
+ }
else {
throw new GenerateFailedException("Root node:" + node.getClass() + "(Unsupported node type!)");
}
@@ -22,16 +26,21 @@ public class OpenGaussGenerator {
private String GenCreatTableSQL(ASTNode node) {
// type convert
- visit(node);
+ visitCrt(node);
return node.toQueryString();
}
- private void visit(ASTNode node) {
+ private String GenInsertSQL(ASTNode node) {
+ // Insert statements do not need to be converted for the time being
+ return node.toQueryString();
+ }
+
+ private void visitCrt(ASTNode node) {
if (node instanceof ColumnNode) {
ColumnTypeConvert((ColumnNode) node);
}
for (ASTNode child : node.getChildren()) {
- visit(child);
+ visitCrt(child);
}
}
diff --git a/sqlTranslate/src/main/java/Lexer/OracleLexer.java b/sqlTranslate/src/main/java/Lexer/OracleLexer.java
index 70fdcaaa..b684e1ba 100644
--- a/sqlTranslate/src/main/java/Lexer/OracleLexer.java
+++ b/sqlTranslate/src/main/java/Lexer/OracleLexer.java
@@ -8,7 +8,7 @@ import java.util.regex.Pattern;
public class OracleLexer {
- public static final String[] keywords = {"SELECT", "FROM", "WHERE", "AND", "OR", "INSERT", "UPDATE", "DELETE",
+ public static final String[] keywords = {"SELECT", "FROM", "WHERE", "AND", "OR", "INSERT", "UPDATE", "DELETE", "VALUES",
// keywords of creating table
"CREATE", "TABLE", "TEMPORARY", "GLOBAL",
"NUMBER", "INTEGER", "SMALLIN", "BINARY_INTEGER", "DECIMAL", "REAL", "FLOAT", "DOUBLE PRECISION", "CHAR", "VARCHAR2",
diff --git a/sqlTranslate/src/main/java/Main.java b/sqlTranslate/src/main/java/Main.java
index f7097627..4e64423f 100644
--- a/sqlTranslate/src/main/java/Main.java
+++ b/sqlTranslate/src/main/java/Main.java
@@ -7,13 +7,14 @@ import Parser.OracleParser;
public class Main {
public static void main(String[] args) {
- String sql = "CREATE TABLE employees (\n" +
- " employee_id NUMBER PRIMARY KEY,\n" +
- " first_name VARCHAR2(20),\n" +
- " last_name VARCHAR2(25),\n" +
- " email VARCHAR2(25),\n" +
- " hire_date DATE\n" +
- ");";
+// String sql = "CREATE TABLE employees (\n" +
+// " employee_id NUMBER PRIMARY KEY,\n" +
+// " first_name VARCHAR2(20),\n" +
+// " last_name VARCHAR2(25),\n" +
+// " email VARCHAR2(25),\n" +
+// " hire_date DATE\n" +
+// ");";
+ String sql = "INSERT INTO employees (first_name, last_name, email) VALUES ('Jane', 'Smith', 'janesm@example.com');";
OracleLexer lexer = new OracleLexer(sql);
lexer.printTokens();
OracleParser parser = new OracleParser(lexer);
diff --git a/sqlTranslate/src/main/java/Parser/AST/Insert/InsertDataNode.java b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertDataNode.java
index ac8d7e68..79bfef1a 100644
--- a/sqlTranslate/src/main/java/Parser/AST/Insert/InsertDataNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertDataNode.java
@@ -1,4 +1,23 @@
package Parser.AST.Insert;
-public class InsertDataNode {
+import Lexer.Token;
+import Parser.AST.ASTNode;
+import java.util.List;
+
+public class InsertDataNode extends ASTNode {
+ public InsertDataNode(List tokens) {
+ super(tokens);
+ }
+
+ public InsertDataNode(ASTNode node) {
+ super(node);
+ }
+
+ @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/Insert/InsertEndNode.java b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertEndNode.java
index bc50d6ae..855800d8 100644
--- a/sqlTranslate/src/main/java/Parser/AST/Insert/InsertEndNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertEndNode.java
@@ -1,4 +1,24 @@
package Parser.AST.Insert;
-public class InsertEndNode {
+import Lexer.Token;
+import Parser.AST.ASTNode;
+import java.util.List;
+
+public class InsertEndNode extends ASTNode {
+ public InsertEndNode(ASTNode node) {
+ super(node);
+ }
+
+ public InsertEndNode(List tokens) {
+ super(tokens);
+ }
+
+ @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/Insert/InsertNode.java b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertNode.java
index ea961887..fec1b697 100644
--- a/sqlTranslate/src/main/java/Parser/AST/Insert/InsertNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertNode.java
@@ -15,9 +15,14 @@ public class InsertNode extends ASTNode {
super(node);
}
+ @Override
public void visit(ASTNode node, StringBuilder queryString)
{
- queryString.append("INSERT INTO ");
+ queryString.append(toString() + " ");
+ for (ASTNode child : getChildren())
+ {
+ child.visit(child, queryString);
+ }
}
}
diff --git a/sqlTranslate/src/main/java/Parser/AST/Insert/InsertObjNode.java b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertObjNode.java
index 9bf37ad8..da42b78b 100644
--- a/sqlTranslate/src/main/java/Parser/AST/Insert/InsertObjNode.java
+++ b/sqlTranslate/src/main/java/Parser/AST/Insert/InsertObjNode.java
@@ -1,4 +1,23 @@
package Parser.AST.Insert;
-public class InsertObjNode {
+import Lexer.Token;
+import Parser.AST.ASTNode;
+import java.util.List;
+
+public class InsertObjNode extends ASTNode{
+ public InsertObjNode(List tokens) {
+ super(tokens);
+ }
+
+ public InsertObjNode(ASTNode node) {
+ super(node);
+ }
+
+ @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 472b62f4..b85a5475 100644
--- a/sqlTranslate/src/main/java/Parser/OracleParser.java
+++ b/sqlTranslate/src/main/java/Parser/OracleParser.java
@@ -5,6 +5,10 @@ import Lexer.Token;
import Parser.AST.ASTNode;
import Exception.ParseFailedException;
import Parser.AST.CreateTable.*;
+import Parser.AST.Insert.InsertDataNode;
+import Parser.AST.Insert.InsertEndNode;
+import Parser.AST.Insert.InsertNode;
+import Parser.AST.Insert.InsertObjNode;
import java.util.Stack;
@@ -25,6 +29,9 @@ public class OracleParser {
(tokens.get(0).getValue().equalsIgnoreCase("CREATE") && tokens.get(2).getValue().equalsIgnoreCase("TEMPORARY") && tokens.get(3).getValue().equalsIgnoreCase("TABLE")) ) {
return parseCreateTab();
}
+ else if (tokens.get(0).getValue().equalsIgnoreCase("INSERT")) {
+ return parseInsert();
+ }
else {
throw new ParseFailedException("Parse failed!");
}
@@ -205,5 +212,67 @@ public class OracleParser {
return root;
}
+ private ASTNode parseInsert() {
+ List tokens = new ArrayList<>();
+ tokens.add(lexer.getTokens().get(0));
+ try {
+ tokens.add(lexer.getTokens().get(1));
+ }
+ catch (ParseFailedException e) {
+ throw new ParseFailedException("Parse failed!");
+ }
+ ASTNode root = new InsertNode(tokens);
+ ASTNode currentNode = root;
+
+ for (int i = 2; i < lexer.getTokens().size(); i++) {
+ if (lexer.getTokens().get(i).hasType(Token.TokenType.IDENTIFIER)) { // table name
+ tokens = new ArrayList<>();
+ tokens.add(lexer.getTokens().get(i));
+ if (i + 1 < lexer.getTokens().size() && ! (lexer.getTokens().get(i + 1).hasType(Token.TokenType.KEYWORD) && lexer.getTokens().get(i + 1).getValue().equalsIgnoreCase("VALUES"))) {
+ for (int j = i + 1; j < lexer.getTokens().size(); j++) {
+ tokens.add(lexer.getTokens().get(j));
+ if (lexer.getTokens().get(j).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(j).getValue().equals(")")) {
+ i = j;
+ break;
+ }
+ }
+ }
+ ASTNode childNode = new InsertObjNode(tokens);
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ }
+ else if (lexer.getTokens().get(i).hasType(Token.TokenType.KEYWORD) && lexer.getTokens().get(i).getValue().equalsIgnoreCase("VALUES")) {
+ tokens = new ArrayList<>();
+ tokens.add(lexer.getTokens().get(i));
+ for (int j = i + 1; j < lexer.getTokens().size(); j++) {
+ if (lexer.getTokens().get(j).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(j).getValue().equals(";")) {
+ i = j - 1;
+ break;
+ }
+ tokens.add(lexer.getTokens().get(j));
+ }
+ ASTNode childNode = new InsertDataNode(tokens);
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ }
+ else if (lexer.getTokens().get(i).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(i).getValue().equals(";")) {
+ tokens = new ArrayList<>();
+ tokens.add(lexer.getTokens().get(i));
+ ASTNode childNode = new InsertEndNode(tokens);
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ }
+ else if (lexer.getTokens().get(i).hasType(Token.TokenType.EOF)) {
+ break;
+ }
+ else {
+ throw new ParseFailedException("Parse failed!");
+ }
+
+ }
+
+ return root;
+ }
+
}