diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml index 34de1c72c..49395dcc9 100644 --- a/sqlTranslate/.idea/workspace.xml +++ b/sqlTranslate/.idea/workspace.xml @@ -6,6 +6,8 @@ + + diff --git a/sqlTranslate/src/main/java/Parser/AST/ASTNode.java b/sqlTranslate/src/main/java/Parser/AST/ASTNode.java index a68223ee3..ed5bfdc9a 100644 --- a/sqlTranslate/src/main/java/Parser/AST/ASTNode.java +++ b/sqlTranslate/src/main/java/Parser/AST/ASTNode.java @@ -43,6 +43,10 @@ public abstract class ASTNode { return children; } + public boolean hasChild() { + return !children.isEmpty(); + } + public ASTNode getChildByName(String childName) { for (ASTNode child : children) { if (child.toString().equals(childName)) { diff --git a/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java index 39c77014c..d5a7d4313 100644 --- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java +++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java @@ -23,7 +23,10 @@ public class ColumnNode extends ASTNode { public void visit(ASTNode node, StringBuilder queryString) { - queryString.append(toString() + " "); + if (node.hasChild() && !(node.getChildren().get(0) instanceof CRTEndNode) ) + queryString.append(toString() + ", "); + else if (node.hasChild() && (node.getChildren().get(0) instanceof CRTEndNode)) + 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 d10d41260..7c370de08 100644 --- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java +++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/TableConstraintNode.java @@ -17,7 +17,10 @@ public class TableConstraintNode extends ASTNode{ public void visit(ASTNode node, StringBuilder queryString) { - queryString.append(toString() + " "); + if (node.hasChild() && !(node.getChildren().get(0) instanceof CRTEndNode) ) + queryString.append(toString() + ", "); + else if (node.hasChild() && (node.getChildren().get(0) instanceof CRTEndNode)) + 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 8c3c54cb7..61a34e600 100644 --- a/sqlTranslate/src/main/java/Parser/OracleParser.java +++ b/sqlTranslate/src/main/java/Parser/OracleParser.java @@ -4,10 +4,8 @@ import Lexer.OracleLexer; import Lexer.Token; import Parser.AST.ASTNode; import Exception.ParseFailedException; -import Parser.AST.CreateTable.ColumnNode; -import Parser.AST.CreateTable.CreateTabNode; -import Parser.AST.CreateTable.TableNode; -import Parser.AST.CreateTable.TableTypeNode; +import Parser.AST.CreateTable.*; + import java.util.Stack; import java.util.ArrayList; @@ -50,6 +48,7 @@ public class OracleParser { throw new ParseFailedException("Parse failed!"); } i++; + i++; // pass the "(" ASTNode child = new TableNode(tokens); root.addChild(child); currentNode = child; @@ -70,7 +69,7 @@ public class OracleParser { catch (ParseFailedException e) { throw new ParseFailedException("Parse failed!"); } - i = j + 1; + i = j + 2; // pass the "(" break; } tokens.add(lexer.getTokens().get(j)); @@ -94,11 +93,11 @@ public class OracleParser { else { constraint.add(lexer.getTokens().get(j)); } - 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"))) { + tokens.add(lexer.getTokens().get(j)); Stack stack = new Stack<>(); for (int k = j + 1; k < lexer.getTokens().size(); k++) { tokens.add(lexer.getTokens().get(k)); @@ -129,6 +128,7 @@ public class OracleParser { i = j; break; } + tokens.add(lexer.getTokens().get(j)); } child.setTokens(tokens); child.setConstraint(constraint); @@ -141,7 +141,6 @@ public class OracleParser { tokens = new ArrayList<>(); 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) @@ -154,6 +153,7 @@ public class OracleParser { || lexer.getTokens().get(j).getValue().equalsIgnoreCase("PRIMARY KEY") || lexer.getTokens().get(j).getValue().equalsIgnoreCase("FOREIGN KEY") || lexer.getTokens().get(j).getValue().equalsIgnoreCase("REFERENCES"))) { + tokens.add(lexer.getTokens().get(j)); Stack stack = new Stack<>(); for (int k = j + 1; k < lexer.getTokens().size(); k++) { tokens.add(lexer.getTokens().get(k)); @@ -183,11 +183,23 @@ public class OracleParser { i = j; break; } + tokens.add(lexer.getTokens().get(j)); } } + 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 EndNode = new CRTEndNode(tokens); + currentNode.addChild(EndNode); + currentNode = EndNode; + } + else if (lexer.getTokens().get(i).hasType(Token.TokenType.EOF)) { + break; + } else { -// throw new ParseFailedException("Parse failed!"); +// System.out.println("Fail to parse:" + lexer.getTokens().get(i).getValue()); + throw new ParseFailedException("Parse failed!"); } } return root;