diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml index 1e1f96cea..76fb709cc 100644 --- a/sqlTranslate/.idea/workspace.xml +++ b/sqlTranslate/.idea/workspace.xml @@ -6,6 +6,7 @@ + diff --git a/sqlTranslate/src/main/java/Parser/AST/AlterTable/AlterModifyColumnNode.java b/sqlTranslate/src/main/java/Parser/AST/AlterTable/AlterModifyColumnNode.java index 62ff0fba8..14a70e03c 100644 --- a/sqlTranslate/src/main/java/Parser/AST/AlterTable/AlterModifyColumnNode.java +++ b/sqlTranslate/src/main/java/Parser/AST/AlterTable/AlterModifyColumnNode.java @@ -3,6 +3,7 @@ package Parser.AST.AlterTable; import Lexer.Token; import Parser.AST.ASTNode; +import java.util.ArrayList; import java.util.List; public class AlterModifyColumnNode extends ASTNode { @@ -44,4 +45,13 @@ public class AlterModifyColumnNode extends ASTNode { child.visit(child, queryString); } } + + public void ResetTokensbyNameTypeConstraint() { + List tokens = new ArrayList<>(); + tokens.add(new Token(Token.TokenType.KEYWORD, "MODIFY")); + tokens.add(columnName); + tokens.add(columnType); + tokens.add(new Token(Token.TokenType.SYMBOL, ";")); + setTokens(tokens); + } } diff --git a/sqlTranslate/src/main/java/Parser/OracleParser.java b/sqlTranslate/src/main/java/Parser/OracleParser.java index 411743f10..fd0e360bc 100644 --- a/sqlTranslate/src/main/java/Parser/OracleParser.java +++ b/sqlTranslate/src/main/java/Parser/OracleParser.java @@ -1116,19 +1116,70 @@ public class OracleParser { else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("MODIFY")) { tokens = new ArrayList<>(); tokens.add(parseTokens.get(i)); + AlterModifyColumnNode childNode = new AlterModifyColumnNode(); for (int j = i + 1; j < parseTokens.size(); j++) { + if (j == i + 1) { + childNode.setColumnName(parseTokens.get(j)); + } + if (j == i + 2) { + childNode.setColumnType(parseTokens.get(j)); + } + if (j > i + 3) { + try { + throw new ParseFailedException("Parse failed:There exists syntex error in the input sql!"); + } + catch (ParseFailedException e) { + e.printStackTrace(); + } + break; + } if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equalsIgnoreCase(";")) { i = j - 1; break; } tokens.add(parseTokens.get(j)); } - ASTNode childNode = new AlterModifyColumnNode(tokens); + childNode.setTokens(tokens); currentNode.addChild(childNode); currentNode = childNode; } else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("RENAME")) { - + if (i + 1 < parseTokens.size() && parseTokens.get(i + 1).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i + 1).getValue().equalsIgnoreCase("COLUMN")) { + tokens = new ArrayList<>(); + tokens.add(parseTokens.get(i)); + for (int j = i + 1; j < parseTokens.size(); j++) { + if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equalsIgnoreCase(";")) { + i = j - 1; + break; + } + tokens.add(parseTokens.get(j)); + } + ASTNode childNode = new AlterRenameColumnNode(tokens); + currentNode.addChild(childNode); + currentNode = childNode; + } + else if (i + 1 < parseTokens.size() && parseTokens.get(i + 1).hasType(Token.TokenType.IDENTIFIER)) { + tokens = new ArrayList<>(); + tokens.add(parseTokens.get(i)); + for (int j = i + 1; j < parseTokens.size(); j++) { + if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equalsIgnoreCase(";")) { + i = j - 1; + break; + } + tokens.add(parseTokens.get(j)); + } + ASTNode childNode = new AlterRenameTableNode(tokens); + currentNode.addChild(childNode); + currentNode = childNode; + } + else { + try { + throw new ParseFailedException("Parse failed:There exists syntex error in the input sql!"); + } + catch (ParseFailedException e) { + e.printStackTrace(); + } + } } else if (parseTokens.get(i).hasType(Token.TokenType.SYMBOL) && parseTokens.get(i).getValue().equals(";")) { tokens = new ArrayList<>();