From 7eb3119503c7663b74f7e6ed5401fd9938bcf284 Mon Sep 17 00:00:00 2001 From: XudongXie Date: Fri, 23 Aug 2024 22:36:37 +0800 Subject: [PATCH] add function --- sqlTranslate/.idea/workspace.xml | 30 +++++++---- sqlTranslate/src/main/java/Main.java | 16 +++--- .../src/main/java/Parser/OracleParser.java | 52 +++++++++++++++++-- 3 files changed, 76 insertions(+), 22 deletions(-) diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml index 0e43459d..c3f62bc4 100644 --- a/sqlTranslate/.idea/workspace.xml +++ b/sqlTranslate/.idea/workspace.xml @@ -6,7 +6,7 @@ - + - { - "keyToString": { - "RunOnceActivity.OpenProjectViewOnStart": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "SHARE_PROJECT_CONFIGURATION_FILES": "true", - "last_opened_file_path": "F:/oracle2opengauss/examples/sqlTranslate", - "settings.editor.selected.configurable": "preferences.pluginManager" + +}]]> diff --git a/sqlTranslate/src/main/java/Main.java b/sqlTranslate/src/main/java/Main.java index ff19ccf5..fc8e3791 100644 --- a/sqlTranslate/src/main/java/Main.java +++ b/sqlTranslate/src/main/java/Main.java @@ -1,11 +1,11 @@ -import Lexer.OracleLexer; -import Lexer.Token; -import java.util.List; +import Lexer.OracleLexer; +import Parser.AST.ASTNode; +import Parser.OracleParser; + public class Main { public static void main(String[] args) { -// String sql = "SELECT NuMBER(1,3) Not NULL FROM table WHERE name = 'John Doe';"; String sql = "CREATE TABLE employees (\n" + " employee_id NUMBER(6) PRIMARY KEY,\n" + " first_name VARCHAR2(20),\n" + @@ -15,10 +15,8 @@ public class Main { ");"; OracleLexer lexer = new OracleLexer(sql); lexer.printTokens(); -// List tokens = lexer.tokenize(); -// -// for (Token token : tokens) { -// System.out.println(token); -// } + OracleParser parser = new OracleParser(lexer); + ASTNode root = parser.parse(); + System.out.println(root.toQueryString()); } } diff --git a/sqlTranslate/src/main/java/Parser/OracleParser.java b/sqlTranslate/src/main/java/Parser/OracleParser.java index b514da91..caff544f 100644 --- a/sqlTranslate/src/main/java/Parser/OracleParser.java +++ b/sqlTranslate/src/main/java/Parser/OracleParser.java @@ -95,7 +95,8 @@ public class OracleParser { tokens.add(lexer.getTokens().get(j)); // Check () or REFERENCES other_table(other_column) if (lexer.getTokens().get(j).hasType(Token.TokenType.KEYWORD) && - (lexer.getTokens().get(j).getValue().equalsIgnoreCase("REFERENCES") || lexer.getTokens().get(j).getValue().equalsIgnoreCase("CHECK"))) { + (lexer.getTokens().get(j).getValue().equalsIgnoreCase("REFERENCES") + || lexer.getTokens().get(j).getValue().equalsIgnoreCase("CHECK"))) { Stack stack = new Stack<>(); for (int k = j + 1; k < lexer.getTokens().size(); k++) { tokens.add(lexer.getTokens().get(k)); @@ -124,18 +125,63 @@ public class OracleParser { if ((lexer.getTokens().get(j).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(j).getValue().equals(",")) || (lexer.getTokens().get(j).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(j).getValue().equals(")")) ) { i = j; - child.setConstraint(constraint); break; } } child.setTokens(tokens); + child.setConstraint(constraint); currentNode.addChild(child); currentNode = child; } - else if (lexer.getTokens().get(i).hasType(Token.TokenType.KEYWORD) && lexer.getTokens().get(i).getValue().equalsIgnoreCase("CONSTRAINT")) { + else if (lexer.getTokens().get(i).hasType(Token.TokenType.KEYWORD) + && lexer.getTokens().get(i).getValue().equalsIgnoreCase("CONSTRAINT")) { // Table constraint tokens.clear(); tokens.add(lexer.getTokens().get(i)); + for (int j = i + 1; j < lexer.getTokens().size(); j++) { + tokens.add(lexer.getTokens().get(j)); + /** + * CONSTRAINT pk_example PRIMARY KEY (column1, column2) + * CONSTRAINT uk_example UNIQUE (column1) + * CONSTRAINT fk_example FOREIGN KEY (column1) REFERENCES other_table(column2) + * CONSTRAINT chk_example CHECK (column1 > 0) + */ + if (lexer.getTokens().get(j).hasType(Token.TokenType.KEYWORD) && + (lexer.getTokens().get(j).getValue().equalsIgnoreCase("UNIQUE") + || lexer.getTokens().get(j).getValue().equalsIgnoreCase("CHECK") + || lexer.getTokens().get(j).getValue().equalsIgnoreCase("PRIMARY KEY") + || lexer.getTokens().get(j).getValue().equalsIgnoreCase("FOREIGN KEY") + || lexer.getTokens().get(j).getValue().equalsIgnoreCase("REFERENCES"))) { + Stack stack = new Stack<>(); + for (int k = j + 1; k < lexer.getTokens().size(); k++) { + tokens.add(lexer.getTokens().get(k)); + if (lexer.getTokens().get(k).getValue().equals("(")) { + stack.push("("); + for (int t = k + 1; t < lexer.getTokens().size(); t++) { + tokens.add(lexer.getTokens().get(t)); + if (lexer.getTokens().get(t).getValue().equals("(")) { + stack.push("("); + } + else if (lexer.getTokens().get(t).getValue().equals(")")) { + stack.pop(); + if (stack.empty()) { + i = t; + j = t; + break; + } + } + } + break; + } + } + continue; + } + if ((lexer.getTokens().get(j).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(j).getValue().equals(",")) || + (lexer.getTokens().get(j).hasType(Token.TokenType.SYMBOL) && lexer.getTokens().get(j).getValue().equals(")")) ) { + i = j; + break; + } + } } else {