improved sql parser. add new feature JdbcUtils.getCreateTableScript, for issue #1342

This commit is contained in:
wenshao
2017-07-24 01:16:43 +08:00
parent 2d8ded4f0c
commit 7a241d7da5
28 changed files with 662 additions and 40 deletions
@@ -21,17 +21,17 @@ import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlKey extends SQLUnique implements SQLUniqueConstraint, SQLTableConstraint {
private SQLName indexName;
private String indexType;
private boolean hasConstaint;
public MySqlKey(){
dbType = JdbcConstants.MYSQL;
}
@Override
@@ -45,7 +45,7 @@ public class MySqlKey extends SQLUnique implements SQLUniqueConstraint, SQLTable
if (visitor.visit(this)) {
acceptChild(visitor, this.getName());
acceptChild(visitor, this.getColumns());
acceptChild(visitor, indexName);
acceptChild(visitor, name);
}
visitor.endVisit(this);
}
@@ -58,14 +58,6 @@ public class MySqlKey extends SQLUnique implements SQLUniqueConstraint, SQLTable
this.indexType = indexType;
}
public SQLName getIndexName() {
return indexName;
}
public void setIndexName(SQLName indexName) {
this.indexName = indexName;
}
public boolean isHasConstaint() {
return hasConstaint;
}
@@ -17,11 +17,12 @@ package com.alibaba.druid.sql.dialect.mysql.ast;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class MySqlPrimaryKey extends MySqlKey implements SQLPrimaryKey {
public MySqlPrimaryKey(){
dbType = JdbcConstants.MYSQL;
}
protected void accept0(MySqlASTVisitor visitor) {
@@ -28,7 +28,6 @@ public class MySqlUnique extends MySqlKey implements SQLPrimaryKey {
if (visitor.visit(this)) {
acceptChild(visitor, this.getName());
acceptChild(visitor, this.getColumns());
acceptChild(visitor, this.getIndexName());
}
visitor.endVisit(this);
}
@@ -19,6 +19,7 @@ import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
/**
* @author kiki
@@ -34,6 +35,10 @@ public class MysqlForeignKey extends SQLForeignKeyImpl {
protected Option onUpdate;
protected Option onDelete;
public MysqlForeignKey() {
dbType = JdbcConstants.MYSQL;
}
public SQLName getIndexName() {
return indexName;
}
@@ -165,8 +165,13 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
return tableGroup;
}
public void setTableGroup(SQLName tableGroup) {
this.tableGroup = tableGroup;
}
@Override
public void simplify() {
tableOptions.clear();
super.simplify();
}
}
@@ -774,7 +774,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser {
if (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) {
SQLName indexName = this.exprParser.name();
if (indexName != null) {
key.setIndexName(indexName);
key.setName(indexName);
}
}
@@ -542,6 +542,7 @@ public class MySqlExprParser extends SQLExprParser {
public SQLColumnDefinition parseColumn() {
SQLColumnDefinition column = new SQLColumnDefinition();
column.setDbType(dbType);
column.setName(name());
column.setDataType(parseDataType());
@@ -813,7 +814,7 @@ public class MySqlExprParser extends SQLExprParser {
if (lexer.token() != Token.LPAREN) {
SQLName indexName = name();
unique.setIndexName(indexName);
unique.setName(indexName);
}
//5.5语法 USING BTREE 放在index 名字后
@@ -585,9 +585,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
print0(ucase ? "KEY" : "key");
if (x.getIndexName() != null) {
SQLName name = x.getName();
if (name != null) {
print(' ');
x.getIndexName().accept(this);
name.accept(this);
}
if (x.getIndexType() != null) {
@@ -2844,9 +2845,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
print0(ucase ? "UNIQUE" : "unique");
if (x.getIndexName() != null) {
SQLName name = x.getName();
if (name != null) {
print(' ');
x.getIndexName().accept(this);
name.accept(this);
}
if (x.getIndexType() != null) {
@@ -78,6 +78,29 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen
private SQLName of;
private OIDIndex oidIndex;
private boolean monitoring;
public void simplify() {
tablespace = null;
storage = null;
lobStorage = null;
pctfree = null;
pctused = null;
initrans = null;
maxtrans = null;
pctincrease = null;
logging = null;
compress = null;
compressLevel = null;
compressForOltp = false;
onCommitPreserveRows = false;
onCommitDeleteRows = false;
super.simplify();
}
public OracleCreateTableStatement() {
super (JdbcConstants.ORACLE);
@@ -466,4 +489,5 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen
this.name = name;
}
}
}
@@ -192,6 +192,7 @@ public class SQLServerExprParser extends SQLExprParser {
public SQLColumnDefinition createColumnDefinition() {
SQLColumnDefinition column = new SQLColumnDefinition();
column.setDbType(dbType);
return column;
}