forked from opengaussexamples/examples
add alter
This commit is contained in:
parent
d1a2e1647a
commit
744b277675
|
|
@ -4,9 +4,16 @@
|
|||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="revise">
|
||||
<list default="true" id="d8d12963-4777-48e3-9669-309cf5e41d60" name="更改" comment="add alter">
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/Interface/ColumnType.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Document/Alter table in Oracle" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Document/Alter table in Oracle" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Generator/OpenGaussGenerator.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Lexer/OracleLexer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Lexer/OracleLexer.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Main.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Main.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/AlterTable/AlterAddColumnNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/AlterTable/AlterAddColumnNode.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/AlterTable/AlterModifyColumnNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/AlterTable/AlterModifyColumnNode.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/ColumnNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/AST/CreateTable/ColumnNode.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/Parser/OracleParser.java" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
|
|
@ -17,8 +24,8 @@
|
|||
<component name="FileTemplateManagerImpl">
|
||||
<option name="RECENT_TEMPLATES">
|
||||
<list>
|
||||
<option value="Interface" />
|
||||
<option value="Class" />
|
||||
<option value="Interface" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
|
|
@ -105,13 +112,6 @@
|
|||
<option name="presentableId" value="Default" />
|
||||
<updated>1723106789329</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00006" summary="revise">
|
||||
<created>1724164698153</created>
|
||||
<option name="number" value="00006" />
|
||||
<option name="presentableId" value="LOCAL-00006" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1724164698153</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00007" summary="revise">
|
||||
<created>1724165008682</created>
|
||||
<option name="number" value="00007" />
|
||||
|
|
@ -448,7 +448,14 @@
|
|||
<option name="project" value="LOCAL" />
|
||||
<updated>1726209430619</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="55" />
|
||||
<task id="LOCAL-00055" summary="add alter">
|
||||
<created>1726210280295</created>
|
||||
<option name="number" value="00055" />
|
||||
<option name="presentableId" value="LOCAL-00055" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1726210280296</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="56" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
|
|
@ -463,7 +470,6 @@
|
|||
</option>
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<MESSAGE value="add function" />
|
||||
<MESSAGE value="coding" />
|
||||
<MESSAGE value="finish the framework of sqltranslate (createTab sql is now being supported!)" />
|
||||
<MESSAGE value="add insert sql" />
|
||||
|
|
@ -488,7 +494,8 @@
|
|||
<MESSAGE value="add alter table keywords" />
|
||||
<MESSAGE value="add alter table parser" />
|
||||
<MESSAGE value="revise" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="revise" />
|
||||
<MESSAGE value="add alter" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="add alter" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<watches-manager>
|
||||
|
|
|
|||
|
|
@ -5,4 +5,15 @@ action = ADD column_name data_type [constraint]
|
|||
| RENAME COLUMN old_column_name TO new_column_name
|
||||
| ADD CONSTRAINT constraint_name constraint_definition
|
||||
| DROP CONSTRAINT constraint_name
|
||||
| RENAME old_table_name TO new_table_name
|
||||
| RENAME old_table_name TO new_table_name
|
||||
|
||||
Example:
|
||||
ALTER TABLE employees ADD email VARCHAR2(100);
|
||||
| ALTER TABLE employees ADD email LONG RAW;
|
||||
| ALTER TABLE employees DROP COLUMN middle_name;
|
||||
| ALTER TABLE employees MODIFY salary NUMBER(10,2);
|
||||
| ALTER TABLE employees MODIFY salary ROWID;
|
||||
| ALTER TABLE employees RENAME COLUMN first_name TO given_name;
|
||||
| ALTER TABLE employees ADD CONSTRAINT emp_pk PRIMARY KEY (employee_id);
|
||||
| ALTER TABLE employees DROP CONSTRAINT emp_pk;
|
||||
| ALTER TABLE employees RENAME TO staff;
|
||||
|
|
@ -1,7 +1,11 @@
|
|||
package Generator;
|
||||
|
||||
import Interface.ColumnType;
|
||||
import Lexer.Token;
|
||||
import Parser.AST.ASTNode;
|
||||
import Parser.AST.AlterTable.AlterAddColumnNode;
|
||||
import Parser.AST.AlterTable.AlterModifyColumnNode;
|
||||
import Parser.AST.AlterTable.AlterNode;
|
||||
import Parser.AST.CreateTable.ColumnNode;
|
||||
import Parser.AST.CreateTable.CreateTabNode;
|
||||
import Exception.GenerateFailedException;
|
||||
|
|
@ -52,6 +56,9 @@ public class OpenGaussGenerator {
|
|||
else if (node instanceof DeleteNode) {
|
||||
return GenDeleteSQL(node);
|
||||
}
|
||||
else if (node instanceof AlterNode) {
|
||||
return GenAlterSQL(node);
|
||||
}
|
||||
else {
|
||||
try {
|
||||
throw new GenerateFailedException("Root node:" + node.getClass() + "(Unsupported node type!)");
|
||||
|
|
@ -101,6 +108,12 @@ public class OpenGaussGenerator {
|
|||
return node.toQueryString();
|
||||
}
|
||||
|
||||
private String GenAlterSQL(ASTNode node) {
|
||||
visitAlter(node);
|
||||
// System.out.println(node.getASTString());
|
||||
return node.toQueryString();
|
||||
}
|
||||
|
||||
private void visitCrt(ASTNode node) {
|
||||
if (node instanceof ColumnNode) {
|
||||
ColumnTypeConvert((ColumnNode) node);
|
||||
|
|
@ -176,7 +189,19 @@ public class OpenGaussGenerator {
|
|||
}
|
||||
}
|
||||
|
||||
private void ColumnTypeConvert(ColumnNode node) {
|
||||
private void visitAlter(ASTNode node) {
|
||||
if (node instanceof AlterAddColumnNode) {
|
||||
ColumnTypeConvert((AlterAddColumnNode) node);
|
||||
}
|
||||
else if (node instanceof AlterModifyColumnNode) {
|
||||
ColumnTypeConvert((AlterModifyColumnNode) node);
|
||||
}
|
||||
for (ASTNode child : node.getChildren()) {
|
||||
visitAlter(child);
|
||||
}
|
||||
}
|
||||
|
||||
private void ColumnTypeConvert(ColumnType node) {
|
||||
// type convert
|
||||
if (node.getType().getValue().equalsIgnoreCase("NUMBER")) {
|
||||
node.setType(new Token(Token.TokenType.KEYWORD, "NUMERIC"));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
package Interface;
|
||||
|
||||
import Lexer.Token;
|
||||
|
||||
public interface ColumnType {
|
||||
Token getType();
|
||||
void setType(Token type);
|
||||
void ResetTokensbyNameTypeConstraint();
|
||||
}
|
||||
|
|
@ -24,7 +24,7 @@ public class OracleLexer {
|
|||
// keywords of update
|
||||
, "SET"
|
||||
// keywords of alter table
|
||||
, "ALTER", "ADD", "DROP", "MODIFY", "RENAME", "TO"
|
||||
, "ALTER", "ADD", "DROP", "MODIFY", "RENAME", "TO", "COLUMN"
|
||||
};
|
||||
private static final Pattern TOKEN_PATTERN = Pattern.compile(
|
||||
"(NUMBER\\(.*?\\))|" + // NUMBER() function
|
||||
|
|
|
|||
|
|
@ -7,14 +7,14 @@ import Parser.OracleParser;
|
|||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
// String sql = "CREATE TABLE employees (\n" +
|
||||
// " employee_id NUMBER PRIMARY KEY,\n" +
|
||||
// " first_name VARCHAR2(20) Check(first_name > '221'),\n" +
|
||||
// " last_name VARCHAR2(25),\n" +
|
||||
// " email VARCHAR2(25),\n" +
|
||||
// " hire_date DATE,\n" +
|
||||
// " CONSTRAINT chk_example CHECK (employee_id > 0)" +
|
||||
// ");";
|
||||
String sql = "CREATE TABLE employees (\n" +
|
||||
" employee_id NUMBER PRIMARY KEY,\n" +
|
||||
" first_name VARCHAR2(20) Check(first_name > '221'),\n" +
|
||||
" last_name VARCHAR2(25) Check (last_name != '12813@163.com'),\n" +
|
||||
" email VARCHAR2(25),\n" +
|
||||
" hire_date DATE,\n" +
|
||||
" CONSTRAINT chk_example CHECK (employee_id > 0)" +
|
||||
");";
|
||||
// String sql = "INSERT INTO employees (first_name, last_name, email) VALUES ('Jane', 'Smith', 'janesm@example.com');";
|
||||
// String sql = "DROP TABLE employees CASCADE CONSTRAINTS;";
|
||||
// String sql = "SELECT e.first_name, d.department_name FROM employees e JOIN departments d Using e.department_id = d.department_id;";
|
||||
|
|
@ -30,8 +30,7 @@ public class Main {
|
|||
// " FROM departments d\n" +
|
||||
// " WHERE d.department_name = 'Sales'\n" +
|
||||
// ");";
|
||||
String sql = "ALTER TABLE employees ADD email VARCHAR2(100) Check (email != '12813@163.com');";
|
||||
// String sql = "ALTER TABLE employees ADD CONSTRAINT emp_pk PRIMARY KEY (employee_id);";
|
||||
// String sql = "ALTER TABLE employees ADD email VARCHAR2(100) Check (email != '12813@163.com');";
|
||||
OracleLexer lexer = new OracleLexer(sql);
|
||||
lexer.printTokens();
|
||||
OracleParser parser = new OracleParser(lexer);
|
||||
|
|
|
|||
|
|
@ -1,12 +1,13 @@
|
|||
package Parser.AST.AlterTable;
|
||||
|
||||
import Interface.ColumnType;
|
||||
import Lexer.Token;
|
||||
import Parser.AST.ASTNode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AlterAddColumnNode extends ASTNode {
|
||||
public class AlterAddColumnNode extends ASTNode implements ColumnType {
|
||||
private Token name;
|
||||
private Token type;
|
||||
private List<Token> constraint;
|
||||
|
|
@ -41,10 +42,12 @@ public class AlterAddColumnNode extends ASTNode {
|
|||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Token getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setType(Token type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
|
@ -57,8 +60,10 @@ public class AlterAddColumnNode extends ASTNode {
|
|||
this.constraint = constraint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ResetTokensbyNameTypeConstraint() {
|
||||
List <Token> tokens = new ArrayList<>();
|
||||
tokens.add(new Token(Token.TokenType.KEYWORD, "ADD"));
|
||||
tokens.add(name);
|
||||
tokens.add(type);
|
||||
for (Token token : constraint) {
|
||||
|
|
|
|||
|
|
@ -1,14 +1,15 @@
|
|||
package Parser.AST.AlterTable;
|
||||
|
||||
import Interface.ColumnType;
|
||||
import Lexer.Token;
|
||||
import Parser.AST.ASTNode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AlterModifyColumnNode extends ASTNode {
|
||||
private Token columnName;
|
||||
private Token columnType;
|
||||
public class AlterModifyColumnNode extends ASTNode implements ColumnType {
|
||||
private Token name;
|
||||
private Token type;
|
||||
|
||||
public AlterModifyColumnNode() {
|
||||
super();
|
||||
|
|
@ -22,20 +23,22 @@ public class AlterModifyColumnNode extends ASTNode {
|
|||
super(tokens);
|
||||
}
|
||||
|
||||
public void setColumnType(Token columnType) {
|
||||
this.columnType = columnType;
|
||||
@Override
|
||||
public void setType(Token columnType) {
|
||||
this.type = columnType;
|
||||
}
|
||||
|
||||
public Token getColumnType() {
|
||||
return columnType;
|
||||
@Override
|
||||
public Token getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setColumnName(Token columnName) {
|
||||
this.columnName = columnName;
|
||||
public void setName(Token columnName) {
|
||||
this.name = columnName;
|
||||
}
|
||||
|
||||
public Token getColumnName() {
|
||||
return columnName;
|
||||
public Token getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -46,12 +49,12 @@ public class AlterModifyColumnNode extends ASTNode {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ResetTokensbyNameTypeConstraint() {
|
||||
List <Token> tokens = new ArrayList<>();
|
||||
tokens.add(new Token(Token.TokenType.KEYWORD, "MODIFY"));
|
||||
tokens.add(columnName);
|
||||
tokens.add(columnType);
|
||||
tokens.add(new Token(Token.TokenType.SYMBOL, ";"));
|
||||
tokens.add(name);
|
||||
tokens.add(type);
|
||||
setTokens(tokens);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,13 @@
|
|||
package Parser.AST.CreateTable;
|
||||
|
||||
import Interface.ColumnType;
|
||||
import Lexer.Token;
|
||||
import Parser.AST.ASTNode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ColumnNode extends ASTNode {
|
||||
public class ColumnNode extends ASTNode implements ColumnType {
|
||||
private Token name;
|
||||
private Token type;
|
||||
private List<Token> constraint;
|
||||
|
|
@ -42,10 +43,12 @@ public class ColumnNode extends ASTNode {
|
|||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Token getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setType(Token type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
|
@ -58,6 +61,7 @@ public class ColumnNode extends ASTNode {
|
|||
this.constraint = constraint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ResetTokensbyNameTypeConstraint() {
|
||||
List <Token> tokens = new ArrayList<>();
|
||||
tokens.add(name);
|
||||
|
|
|
|||
|
|
@ -970,6 +970,7 @@ public class OracleParser {
|
|||
(parseTokens.get(j).getValue().equalsIgnoreCase("REFERENCES")
|
||||
|| parseTokens.get(j).getValue().equalsIgnoreCase("CHECK"))) {
|
||||
tokens.add(parseTokens.get(j));
|
||||
constraint.add(parseTokens.get(j));
|
||||
Stack<String> stack = new Stack<>();
|
||||
for (int k = j + 1; k < parseTokens.size(); k++) {
|
||||
tokens.add(parseTokens.get(k));
|
||||
|
|
@ -1001,7 +1002,7 @@ public class OracleParser {
|
|||
}
|
||||
if (!state)
|
||||
tokens.add(parseTokens.get(j));
|
||||
if (j != i + 1) {
|
||||
if (!state && j != i + 1) {
|
||||
constraint.add(parseTokens.get(j));
|
||||
}
|
||||
}
|
||||
|
|
@ -1119,10 +1120,10 @@ public class OracleParser {
|
|||
AlterModifyColumnNode childNode = new AlterModifyColumnNode();
|
||||
for (int j = i + 1; j < parseTokens.size(); j++) {
|
||||
if (j == i + 1) {
|
||||
childNode.setColumnName(parseTokens.get(j));
|
||||
childNode.setName(parseTokens.get(j));
|
||||
}
|
||||
if (j == i + 2) {
|
||||
childNode.setColumnType(parseTokens.get(j));
|
||||
childNode.setType(parseTokens.get(j));
|
||||
}
|
||||
if (j > i + 3) {
|
||||
try {
|
||||
|
|
@ -1158,7 +1159,7 @@ public class OracleParser {
|
|||
currentNode.addChild(childNode);
|
||||
currentNode = childNode;
|
||||
}
|
||||
else if (i + 1 < parseTokens.size() && parseTokens.get(i + 1).hasType(Token.TokenType.IDENTIFIER)) {
|
||||
else if (i + 1 < parseTokens.size() && parseTokens.get(i + 1).hasType(Token.TokenType.KEYWORD) && parseTokens.get(i + 1).getValue().equalsIgnoreCase("TO")) {
|
||||
tokens = new ArrayList<>();
|
||||
tokens.add(parseTokens.get(i));
|
||||
for (int j = i + 1; j < parseTokens.size(); j++) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue