forked from opengaussexamples/examples
add insert sql
This commit is contained in:
parent
9b7a3bb85f
commit
12ff94828e
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue