add insert sql

This commit is contained in:
XudongXie 2024-09-09 20:31:54 +08:00
parent 9b7a3bb85f
commit 12ff94828e
10 changed files with 179 additions and 23 deletions

View File

@ -4,13 +4,17 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="finish the framework of sqltranslate (createTab sql is now being supported!)">
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertDataNode.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertEndNode.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertNode.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertObjNode.java" afterDir="false" />
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add insert sql">
<change afterPath="$PROJECT_DIR$/src/main/java/Document/Select statement in Oracle" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/CreateTabNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/CreateTabNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Lexer/OracleLexer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Lexer/OracleLexer.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Main.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Main.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertDataNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertDataNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertEndNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertEndNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertObjNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/Insert/InsertObjNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -248,7 +252,14 @@
<option name="project" value="LOCAL" />
<updated>1724511620952</updated>
</task>
<option name="localTasksCounter" value="21" />
<task id="LOCAL-00021" summary="add insert sql">
<created>1725117071687</created>
<option name="number" value="00021" />
<option name="presentableId" value="LOCAL-00021" />
<option name="project" value="LOCAL" />
<updated>1725117071687</updated>
</task>
<option name="localTasksCounter" value="22" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -273,7 +284,8 @@
<MESSAGE value="add function" />
<MESSAGE value="coding" />
<MESSAGE value="finish the framework of sqltranslate (createTab sql is now being supported!)" />
<option name="LAST_COMMIT_MESSAGE" value="finish the framework of sqltranslate (createTab sql is now being supported!)" />
<MESSAGE value="add insert sql" />
<option name="LAST_COMMIT_MESSAGE" value="add insert sql" />
</component>
<component name="XDebuggerManager">
<watches-manager>

View File

@ -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');

View File

@ -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);
}
}

View File

@ -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",

View File

@ -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);

View File

@ -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<Token> 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);
}
}
}

View File

@ -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<Token> tokens) {
super(tokens);
}
@Override
public void visit(ASTNode node, StringBuilder queryString) {
queryString.append(toString());
for (ASTNode child : getChildren())
{
child.visit(child, queryString);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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<Token> 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);
}
}
}

View File

@ -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 <Token> 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;
}
}