support parsing mysql 8 check related DDL statement #4089

This commit is contained in:
WillsonYip
2020-12-25 09:11:50 +08:00
parent fa57d18724
commit 7ca0a33c78
5 changed files with 111 additions and 13 deletions
@@ -0,0 +1,38 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MysqlAlterTableAlterCheck extends MySqlObjectImpl implements SQLAlterTableItem {
private SQLName name;
private Boolean enforced;
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
if (getName() != null) {
getName().accept(visitor);
}
}
visitor.endVisit(this);
}
public SQLName getName() {
return name;
}
public void setName(SQLName name) {
this.name = name;
}
public Boolean getEnforced() {
return enforced;
}
public void setEnforced(Boolean enforced) {
this.enforced = enforced;
}
}
@@ -1550,6 +1550,9 @@ public class MySqlCreateTableParser extends SQLCreateTableParser {
check.setExpr(expr);
constraint = check;
boolean enforce = true;
//should find Token.NOT to recognize "NOT ENFORCED"
//but somehow Token.NOT eaten by "this.exprParser.expr()" in above code
if (lexer.token() == Token.HINT) {
String hintText = lexer.stringVal();
if (hintText != null) {
@@ -1564,6 +1567,9 @@ public class MySqlCreateTableParser extends SQLCreateTableParser {
}
lexer.nextToken();
}
} else if (lexer.stringVal().equalsIgnoreCase("ENFORCED")) {
check.setEnforced(enforce);
lexer.nextToken();
}
}
@@ -6021,13 +6021,14 @@ public class MySqlStatementParser extends SQLStatementParser {
lexer.nextToken();
if (lexer.token() == Token.IDENTIFIER) {
constraintSymbol = this.exprParser.name();
if (lexer.token() != Token.PRIMARY && lexer.token() != Token.UNIQUE && lexer.token() != Token.FOREIGN) {
if (lexer.token() != Token.PRIMARY && lexer.token() != Token.UNIQUE && lexer.token() != Token.FOREIGN && lexer.token() != CHECK) {
throw new ParserException("syntax error, expect PRIMARY, UNIQUE or FOREIGN, actual " + lexer.token() + ", " + lexer.info());
}
}
case PRIMARY:
case UNIQUE:
case FOREIGN:
case CHECK:
// Constraint.
if (lexer.token() == Token.FOREIGN) {
MysqlForeignKey fk = this.getExprParser().parseForeignKey();
@@ -6054,21 +6055,29 @@ public class MySqlStatementParser extends SQLStatementParser {
this.exprParser.parseIndex(uk.getIndexDefinition());
SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(uk);
stmt.addItem(item);
} else if (lexer.token() == Token.CHECK) { // ADD CHECK (expr)
lexer.nextToken();
accept(Token.LPAREN);
SQLCheck check = new SQLCheck();
if (null != constraintSymbol) {
check.setName(constraintSymbol);
}
check.setExpr(this.exprParser.expr());
accept(Token.RPAREN);
boolean enforce = true;
if (lexer.token() == Token.NOT) {
enforce = false;
lexer.nextToken();
}
if (lexer.stringVal().equalsIgnoreCase("ENFORCED")) {
check.setEnforced(enforce);
lexer.nextToken();
}
SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(check);
stmt.addItem(item);
}
return true;
// ADD CHECK (expr)
case CHECK: {
lexer.nextToken();
accept(Token.LPAREN);
SQLCheck check = new SQLCheck();
check.setExpr(this.exprParser.expr());
accept(Token.RPAREN);
SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(check);
stmt.addItem(item);
return true;
}
// ADD PARTITION (partition_definition)
case PARTITION: {
lexer.nextToken();
@@ -6525,6 +6534,20 @@ public class MySqlStatementParser extends SQLStatementParser {
alterIndex.setAnalyzerName(this.exprParser.name());
stmt.addItem(alterIndex);
} else if (lexer.token() == Token.CHECK || lexer.token() == Token.CONSTRAINT) {
lexer.nextToken();
MysqlAlterTableAlterCheck check = new MysqlAlterTableAlterCheck();
check.setName(this.exprParser.name());
boolean enforce = true;
if (lexer.token() == Token.NOT) {
enforce = false;
lexer.nextToken();
}
if (lexer.stringVal().equalsIgnoreCase("ENFORCED")) {
check.setEnforced(enforce);
lexer.nextToken();
}
stmt.addItem(check);
} else {
// ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
if (lexer.token() == Token.COLUMN) {
@@ -1443,4 +1443,12 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
default void endVisit(MySqlJSONTableExpr.Column x) {
}
default boolean visit(MysqlAlterTableAlterCheck x) {
return true;
}
default void endVisit(MysqlAlterTableAlterCheck x) {
}
} //
@@ -5519,4 +5519,27 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
// return false;
// }
public boolean visit(MysqlAlterTableAlterCheck x) {
print0(ucase ? "ALTER CONSTRAINT " : "alter constraint ");
SQLName name = x.getName();
if (name != null) {
name.accept(this);
print(' ');
}
Boolean enforced = x.getEnforced();
if (enforced != null) {
if (enforced) {
print0(ucase ? " ENFORCED" : " enforced");
} else {
print0(ucase ? " NOT ENFORCED" : " not enforced");
}
}
return false;
}
public void endVisit(MysqlAlterTableAlterCheck x) {
}
} //