diff --git a/sqlTranslate/.idea/workspace.xml b/sqlTranslate/.idea/workspace.xml index f14b0abc..80640972 100644 --- a/sqlTranslate/.idea/workspace.xml +++ b/sqlTranslate/.idea/workspace.xml @@ -5,9 +5,12 @@ + + + - + diff --git a/sqlTranslate/src/main/java/Document/DataType in Oracle b/sqlTranslate/src/main/java/Document/DataType in Oracle new file mode 100644 index 00000000..787d70a8 --- /dev/null +++ b/sqlTranslate/src/main/java/Document/DataType in Oracle @@ -0,0 +1,105 @@ +数值类型 + NUMBER + 用于存储整数或浮点数。 + 可以指定精度(总位数)和小数位数。 + 示例:NUMBER(10, 2) 表示一个最多有 10 位数字的数,其中 2 位是小数位。 + INTEGER + 用于存储整数。 + 等价于 NUMBER 但默认没有精度限制。 + 示例:INTEGER + SMALLINT + 用于存储较小的整数。 + 等价于 INTEGER 但默认范围更小。 + 示例:SMALLINT + BINARY_INTEGER + 用于存储整数。 + 通常用于内部使用,而不是直接在表定义中使用。 + 示例:BINARY_INTEGER + DECIMAL + 等价于 NUMBER。 + 示例:DECIMAL(10, 2) + REAL + 用于存储单精度浮点数。 + 示例:REAL + FLOAT + 用于存储双精度浮点数。 + 可以指定精度。 + 示例:FLOAT(128) + DOUBLE PRECISION + 用于存储双精度浮点数。 + 示例:DOUBLE PRECISION + +字符串类型 + CHAR + 用于存储固定长度的字符串。 + 示例:CHAR(20) + VARCHAR2 + 用于存储可变长度的字符串。 + 最大长度为 4000 字节(在早期版本中)或 32767 字节(从 Oracle 12c 开始)。 + 示例:VARCHAR2(255) + NCHAR + 用于存储固定长度的 Unicode 字符串。 + 示例:NCHAR(20) + NVARCHAR2 + 用于存储可变长度的 Unicode 字符串。 + 示例:NVARCHAR2(255) + CLOB + 用于存储大文本块。 + 示例:CLOB + NCLOB + 用于存储大 Unicode 文本块。 + 示例:NCLOB + +日期/时间类型 + DATE + 用于存储日期和时间信息。 + 包括年、月、日、小时、分钟和秒。 + 示例:DATE + TIMESTAMP + 用于存储日期和时间信息。 + 可以包含毫秒。 + 示例:TIMESTAMP + TIMESTAMP WITH TIME ZONE + 用于存储日期和时间信息,包括时区。 + 示例:TIMESTAMP WITH TIME ZONE + TIMESTAMP WITH LOCAL TIME ZONE + 用于存储日期和时间信息,按照本地时区显示。 + 示例:TIMESTAMP WITH LOCAL TIME ZONE + +二进制类型 + BLOB + 用于存储大二进制对象,如图像或文件。 + 示例:BLOB + RAW + 用于存储固定长度的二进制数据。 + 示例:RAW(2000) + LONG RAW + 用于存储长二进制数据。 + 最大长度为 2GB。 + 示例:LONG RAW + +特殊类型 + BOOLEAN + 用于存储布尔值 TRUE, FALSE 或 NULL。 + 从 Oracle 12c 开始支持。 + INTERVAL YEAR TO MONTH + 用于存储年份到月份的时间间隔。 + 示例:INTERVAL YEAR TO MONTH + INTERVAL DAY TO SECOND + 用于存储天到秒的时间间隔。 + 示例:INTERVAL DAY TO SECOND + ROWID + 用于存储行标识符。 + 示例:ROWID + UROWID + 用于存储统一行标识符。 + 示例:UROWID + REF + 用于存储对另一个表的引用。 + 示例:REF + OBJECT + 用于存储用户定义的对象类型。 + 示例:OBJECT (attr1 NUMBER, attr2 VARCHAR2(50)) + REF CURSOR + 用于存储游标引用。 + 示例:REF CURSOR \ No newline at end of file diff --git a/sqlTranslate/src/main/java/Exception/GenerateFailedException.java b/sqlTranslate/src/main/java/Exception/GenerateFailedException.java new file mode 100644 index 00000000..181b987c --- /dev/null +++ b/sqlTranslate/src/main/java/Exception/GenerateFailedException.java @@ -0,0 +1,8 @@ +package Exception; + +public class GenerateFailedException extends RuntimeException{ + public GenerateFailedException(String message) + { + super(message); + } +} diff --git a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java index fe661260..07e4b15f 100644 --- a/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java +++ b/sqlTranslate/src/main/java/Generator/OpenGaussGenerator.java @@ -1,6 +1,9 @@ package Generator; import Parser.AST.ASTNode; +import Parser.AST.CreateTable.ColumnNode; +import Parser.AST.CreateTable.CreateTabNode; +import Exception.GenerateFailedException; public class OpenGaussGenerator { private ASTNode node; @@ -8,6 +11,32 @@ public class OpenGaussGenerator { this.node = node; } public String generate() { + if (node instanceof CreateTabNode) { + return GenCreatTableSQL(node); + } + else { + throw new GenerateFailedException("Root node:" + node.getClass() + "(Unsupported node type!)"); + } + } + + private String GenCreatTableSQL(ASTNode node) { + // type convert + visit(node); return node.toQueryString(); } + + private void visit(ASTNode node) { + if (node instanceof ColumnNode) { + ColumnTypeConvert((ColumnNode) node); + } + for (ASTNode child : node.getChildren()) { + visit(child); + } + } + + private void ColumnTypeConvert(ColumnNode node) { + if (node.getType().getValue().equalsIgnoreCase("")) { + + } + } } diff --git a/sqlTranslate/src/main/java/Main.java b/sqlTranslate/src/main/java/Main.java index c7211486..b5356333 100644 --- a/sqlTranslate/src/main/java/Main.java +++ b/sqlTranslate/src/main/java/Main.java @@ -1,4 +1,5 @@ +import Generator.OpenGaussGenerator; import Lexer.OracleLexer; import Parser.AST.ASTNode; import Parser.OracleParser; @@ -19,5 +20,7 @@ public class Main { ASTNode root = parser.parse(); System.out.println(root.toQueryString()); System.out.println(root.getASTString()); + OpenGaussGenerator generator = new OpenGaussGenerator(root); + System.out.println(generator.generate()); } } diff --git a/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java b/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java index d5a7d431..bd0155ef 100644 --- a/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java +++ b/sqlTranslate/src/main/java/Parser/AST/CreateTable/ColumnNode.java @@ -3,6 +3,7 @@ package Parser.AST.CreateTable; import Lexer.Token; import Parser.AST.ASTNode; +import java.util.ArrayList; import java.util.List; public class ColumnNode extends ASTNode { @@ -57,4 +58,14 @@ public class ColumnNode extends ASTNode { this.constraint = constraint; } + public void ResetTokensbyNameTypeConstraint() { + List tokens = new ArrayList<>(); + tokens.add(name); + tokens.add(type); + for (Token token : constraint) { + tokens.add(token); + } + setTokens(tokens); + } + }