diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml
index 5cca5ada6..13d755352 100644
--- a/sqlTranslate/.idea/workspace.xml
+++ b/sqlTranslate/.idea/workspace.xml
@@ -8,32 +8,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -66,58 +41,55 @@
- {
- "keyToString": {
- "Application.Main.executor": "Run",
- "JUnit.testAlterTable.executor": "Run",
- "JUnit.testAlterTable.testAlterTable.executor": "Run",
- "JUnit.testCaseWhen.test.executor": "Run",
- "JUnit.testCommitRollbackExec.test.executor": "Run",
- "JUnit.testCreateTable.executor": "Run",
- "JUnit.testCreateTable.test.executor": "Run",
- "JUnit.testDelete.test.executor": "Run",
- "JUnit.testDropTable.test.executor": "Run",
- "JUnit.testException.executor": "Run",
- "JUnit.testException.test.executor": "Run",
- "JUnit.testFunction.test.executor": "Run",
- "JUnit.testIfElse.test.executor": "Run",
- "JUnit.testInsert.test.executor": "Run",
- "JUnit.testJoin.executor": "Run",
- "JUnit.testJoin.test.executor": "Run",
- "JUnit.testLoop.test.executor": "Run",
- "JUnit.testPL.executor": "Run",
- "JUnit.testProcedure.test.executor": "Run",
- "JUnit.testSelect.executor": "Run",
- "JUnit.testSelect.test.executor": "Run",
- "JUnit.testTrigger.executor": "Run",
- "JUnit.testTrigger.test.executor": "Run",
- "JUnit.testUpdate.executor": "Run",
- "JUnit.testView.executor": "Run",
- "RunOnceActivity.OpenProjectViewOnStart": "true",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "git-widget-placeholder": "master",
- "kotlin-language-version-configured": "true",
- "last_opened_file_path": "F:/oracle2opengauss/examples/sqlTranslate",
- "project.structure.last.edited": "Project",
- "project.structure.proportion": "0.0",
- "project.structure.side.proportion": "0.0",
- "settings.editor.selected.configurable": "preferences.pluginManager"
+
-
-
-
-
-
-
-
-
-
+}]]>
+
+
-
-
-
+
+
@@ -132,11 +104,22 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -152,19 +135,19 @@
-
-
+
+
+
-
-
-
+
-
-
+
+
+
@@ -520,7 +503,7 @@
1726633703475
-
+
diff --git a/sqlTranslate/src/main/java/generator/OpenGaussGenerator.java b/sqlTranslate/src/main/java/generator/OpenGaussGenerator.java
index 88c2a5626..a43bc50f9 100644
--- a/sqlTranslate/src/main/java/generator/OpenGaussGenerator.java
+++ b/sqlTranslate/src/main/java/generator/OpenGaussGenerator.java
@@ -463,7 +463,7 @@ public class OpenGaussGenerator {
String output = "";
List outputObj = new ArrayList<>();
for (Token token: lexer.getTokens()) {
- if (token.hasType(Token.TokenType.STRING)) {
+ if (token.hasType(Token.TokenType.STRING) || token.hasType(Token.TokenType.NUMBER)) {
output += token.getValue().replace("'", "");
}
else if (token.hasType(Token.TokenType.IDENTIFIER) || token.hasType(Token.TokenType.KEYWORD)) {
@@ -657,6 +657,9 @@ public class OpenGaussGenerator {
CommonConvert(currentNode);
break;
}
+ else {
+ CommonConvert(currentNode);
+ }
currentNode = currentNode.getFirstChild();
}
}
diff --git a/sqlTranslate/src/main/java/parser/OracleParser.java b/sqlTranslate/src/main/java/parser/OracleParser.java
index fe3797a61..5ecd5602e 100644
--- a/sqlTranslate/src/main/java/parser/OracleParser.java
+++ b/sqlTranslate/src/main/java/parser/OracleParser.java
@@ -44,9 +44,13 @@ import java.util.List;
public class OracleParser {
private OracleLexer lexer;
+ public OracleParser() {}
public OracleParser(OracleLexer lexer) {
this.lexer = lexer;
}
+ public void setLexer(OracleLexer lexer) {
+ this.lexer = lexer;
+ }
public ASTNode parse()
{
try {
@@ -113,6 +117,35 @@ public class OracleParser {
return null;
}
+ public ASTNode parseTokens(List parseTokens) {
+ try {
+ if ((parseTokens.get(0).getValue().equalsIgnoreCase("CREATE") && parseTokens.get(1).getValue().equalsIgnoreCase("TABLE")) ||
+ (parseTokens.get(0).getValue().equalsIgnoreCase("CREATE") && parseTokens.get(2).getValue().equalsIgnoreCase("TEMPORARY") && parseTokens.get(3).getValue().equalsIgnoreCase("TABLE"))) {
+ return parseCreateTab(parseTokens);
+ } else if (parseTokens.get(0).getValue().equalsIgnoreCase("INSERT")) {
+ return parseInsert(parseTokens);
+ } else if (parseTokens.get(0).getValue().equalsIgnoreCase("DROP")) {
+ return parseDrop(parseTokens);
+ } else if (parseTokens.get(0).getValue().equalsIgnoreCase("SELECT")) {
+ return parseSelect(parseTokens);
+ } else if (parseTokens.get(0).getValue().equalsIgnoreCase("UPDATE")) {
+ return parseUpdate(parseTokens);
+ } else if (parseTokens.get(0).getValue().equalsIgnoreCase("DELETE")) {
+ return parseDelete(parseTokens);
+ } else if (parseTokens.get(0).getValue().equalsIgnoreCase("ALTER")) {
+ return parseAlterTable(parseTokens);
+ } else if (
+ (parseTokens.get(0).getValue().equalsIgnoreCase("CREATE") && parseTokens.get(1).getValue().equalsIgnoreCase("OR") && parseTokens.get(2).getValue().equalsIgnoreCase("REPLACE") && parseTokens.get(3).getValue().equalsIgnoreCase("VIEW"))
+ || (parseTokens.get(0).getValue().equalsIgnoreCase("CREATE") && parseTokens.get(1).getValue().equalsIgnoreCase("VIEW"))
+ ) {
+ return parseCreateView(parseTokens);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
/**
* CREATE TEMPORARY? TABLE _table ( (_column _type column_constraint), (_column _type column_constraint)* table_constraint?)
*/
@@ -1894,8 +1927,18 @@ public class OracleParser {
break;
}
}
- currentNode.addChild(childNode);
- currentNode = childNode;
+ ASTNode bodystatementNode = parseTokens(childNode.getTokens());
+ if (bodystatementNode != null) {
+ currentNode.addChild(bodystatementNode);
+ currentNode = bodystatementNode.getDeepestChild();
+ ASTNode bodystatementEndNode = new ProcedurePLStatementNode();
+ currentNode.addChild(bodystatementEndNode);
+ currentNode = bodystatementEndNode;
+ }
+ else {
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ }
}
}
}
@@ -2201,11 +2244,52 @@ public class OracleParser {
break;
}
}
- currentNode.addChild(childNode);
- currentNode = childNode;
+ ASTNode bodystatementNode = parseTokens(childNode.getTokens());
+ if (bodystatementNode != null) {
+ currentNode.addChild(bodystatementNode);
+ currentNode = bodystatementNode.getDeepestChild();
+ ASTNode bodystatementEndNode = new FunctionBodyNode();
+ currentNode.addChild(bodystatementEndNode);
+ currentNode = bodystatementEndNode;
+ }
+ else {
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ }
}
}
}
+ // match exception
+ else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("EXCEPTION")) {
+ int index = -1;
+ for (int j = i; j < parseTokens.size(); j++) {
+ if (parseTokens.get(j).hasType(Token.TokenType.KEYWORD) && parseTokens.get(j).getValue().equalsIgnoreCase("END")) {
+ index = j;
+ break;
+ }
+ }
+ if (index == -1) {
+ try {
+ throw new ParseFailedException("There exists syntax error and no END block is found!");
+ } catch (ParseFailedException e) {
+ e.printStackTrace();
+ }
+ }
+ ASTNode childNode = parseException(parseTokens.subList(i, index + 1));
+ currentNode.addChild(childNode);
+ currentNode = childNode.getDeepestChild();
+ childNode = new FunctionEndNode();
+ for (int j = index; j < parseTokens.size(); j++) {
+ childNode.addToken(parseTokens.get(j));
+ if (parseTokens.get(j).hasType(Token.TokenType.SYMBOL) && parseTokens.get(j).getValue().equals(";")) {
+ i = j;
+ break;
+ }
+ }
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ break;
+ }
// match function end
else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("END")) {
ASTNode childNode = new FunctionEndNode();
@@ -2427,8 +2511,18 @@ public class OracleParser {
}
childNode.addToken(parseTokens.get(j));
}
- currentNode.addChild(childNode);
- currentNode = childNode;
+ ASTNode bodystatementNode = parseTokens(childNode.getTokens());
+ if (bodystatementNode != null) {
+ currentNode.addChild(bodystatementNode);
+ currentNode = bodystatementNode.getDeepestChild();
+ ASTNode bodystatementEndNode = new TriggerBodyNode();
+ currentNode.addChild(bodystatementEndNode);
+ currentNode = bodystatementEndNode;
+ }
+ else {
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ }
}
else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("END")) {
ASTNode childNode = new TriggerEndNode();
@@ -2529,8 +2623,18 @@ public class OracleParser {
}
childNode.addToken(parseTokens.get(j));
}
- currentNode.addChild(childNode);
- currentNode = childNode;
+ ASTNode bodystatementNode = parseTokens(childNode.getTokens());
+ if (bodystatementNode != null) {
+ currentNode.addChild(bodystatementNode);
+ currentNode = bodystatementNode.getDeepestChild();
+ ASTNode bodystatementEndNode = new PLBodyNode();
+ currentNode.addChild(bodystatementEndNode);
+ currentNode = bodystatementEndNode;
+ }
+ else {
+ currentNode.addChild(childNode);
+ currentNode = childNode;
+ }
}
// match end
else if (parseTokens.get(i).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i).getValue().equalsIgnoreCase("END")) {
diff --git a/sqlTranslate/src/test/java/TestFunction.java b/sqlTranslate/src/test/java/TestFunction.java
index 0c9a79479..001e1a076 100644
--- a/sqlTranslate/src/test/java/TestFunction.java
+++ b/sqlTranslate/src/test/java/TestFunction.java
@@ -18,7 +18,11 @@ public class TestFunction {
" input_string VARCHAR2\n" +
" ) RETURN NUMBER IS\n" +
" BEGIN\n" +
+ " SELECT name, salary INTO v_name, v_salary FROM employees WHERE employee_id = 100;\n" +
" RETURN LENGTH(input_string);\n" +
+ " EXCEPTION\n" +
+ " WHEN OTHERS THEN\n" +
+ " DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);\n" +
" END;");
System.out.println("===== test of Function =====");
System.out.println("The source DBMS is: " + CommonConfig.getSourceDB());