diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java b/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java index 6e97bf854c..0e843e941a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java @@ -20,8 +20,13 @@ public class SQLIndexOptions extends SQLObjectImpl { private SQLExpr comment; private String algorithm; private String lock; + private boolean invisible; private List otherOptions = new ArrayList(); + public SQLIndexOptions() { + + } + public String getIndexType() { return indexType; } @@ -120,6 +125,14 @@ public class SQLIndexOptions extends SQLObjectImpl { } } + public boolean isInvisible() { + return invisible; + } + + public void setInvisible(boolean invisible) { + this.invisible = invisible; + } + public List getOtherOptions() { return otherOptions; } @@ -154,5 +167,7 @@ public class SQLIndexOptions extends SQLObjectImpl { item1.setParent(parent); options.otherOptions.add(item1); } + + options.invisible = invisible; } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index cb80b5ce08..aee668cf23 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -348,6 +348,10 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { stmt.getTableElementList().add(column); } + if (lexer.token() == Token.HINT) { + lexer.nextToken(); + } + if (lexer.token() != Token.COMMA) { break; } else { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index aa1c35e963..1c660d41c7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -701,6 +701,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } print(')'); + if (x.getIndexDefinition().hasOptions()) { + x.getIndexDefinition().getOptions().accept(this); + } + SQLExpr comment = x.getComment(); if (comment != null) { print0(ucase ? " COMMENT " : " comment "); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index ad06b024ce..680f85efe9 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -4776,6 +4776,14 @@ public class SQLExprParser extends SQLParser { if (lexer.token() == Token.COMMENT) { lexer.nextToken(); indexDefinition.getOptions().setComment(primary()); + } else if ((DbType.mysql == dbType) && + lexer.identifierEquals("INVISIBLE")) { + lexer.nextToken(); + indexDefinition.getOptions().setInvisible(true); + } else if ((DbType.mysql == dbType) && + lexer.token == Token.HINT && lexer.stringVal().trim().equals("!80000 INVISIBLE")) { + lexer.nextToken(); + indexDefinition.getOptions().setInvisible(true); } else if (DbType.mysql == dbType) { switch (lexer.token()) { case WITH: diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 24d7a59935..7d5200eac4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -6033,6 +6033,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } */ + if (x.isInvisible()) { + print0(ucase ? " INVISIBLE" : " invisible"); + } + SQLExpr keyBlockSize = x.getKeyBlockSize(); if (keyBlockSize != null) { print0(ucase ? " KEY_BLOCK_SIZE = " : " key_block_size = ");