diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAlterColumn.java b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAlterColumn.java index 594cd585a8..a05c0711ab 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAlterColumn.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAlterColumn.java @@ -23,7 +23,7 @@ public class MySqlAlterTableAlterColumn extends MySqlObjectImpl implements SQLAlterTableItem { private SQLName column; - + private String visibleType; private boolean dropDefault; private SQLExpr defaultExpr; @@ -44,6 +44,14 @@ public void setDropDefault(boolean dropDefault) { this.dropDefault = dropDefault; } + public String getVisibleType() { + return visibleType; + } + + public void setVisibleType(String visibleType) { + this.visibleType = visibleType; + } + public SQLExpr getDefaultExpr() { return defaultExpr; } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 4ebc130323..45345b7b1b 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -6679,8 +6679,13 @@ else if (lexer.identifierEquals(FnvHash.Constants.PARTITIONS)) { alterColumn.setColumn(this.exprParser.name()); if (lexer.token() == Token.SET) { lexer.nextToken(); - accept(Token.DEFAULT); - alterColumn.setDefaultExpr(this.exprParser.expr()); + if (lexer.identifierEquals("VISIBLE") || lexer.identifierEquals("INVISIBLE")) { + alterColumn.setVisibleType(lexer.stringVal()); + lexer.nextToken(); + } else { + accept(Token.DEFAULT); + alterColumn.setDefaultExpr(this.exprParser.expr()); + } } else { accept(Token.DROP); accept(Token.DEFAULT); diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index bacbc311a7..0164c3c623 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -4517,6 +4517,9 @@ public boolean visit(MySqlAlterTableAlterColumn x) { x.getDefaultExpr().accept(this); } else if (x.isDropDefault()) { print0(ucase ? " DROP DEFAULT" : " drop default"); + } else if (x.getVisibleType() != null) { + print0(ucase ? " SET " : " set "); + print0(ucase ? x.getVisibleType().toUpperCase() : x.getVisibleType().toLowerCase()); } return false; } diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/issues/Issue5803.java b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/issues/Issue5803.java new file mode 100644 index 0000000000..876650b7cb --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/issues/Issue5803.java @@ -0,0 +1,57 @@ +package com.alibaba.druid.bvt.sql.mysql.issues; + +import java.util.List; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author lizongbo + * @see Invisible Indexes + * @see ALTER TABLE Statement + */ +public class Issue5803 { + + @Test + public void test_parse_alter_table() { + for (DbType dbType : new DbType[]{ + DbType.mysql, + DbType.mariadb, + + }) { + + for (String sql : new String[]{ + "ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE;", + "ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;", + "ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;", + "ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;", + "alter table tt ALTER COLUMN c1 SET VISIBLE;", + "alter table tt ALTER COLUMN c1 SET INVISIBLE;", + }) { + System.out.println(dbType + "原始的sql===" + sql); + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List statementList = parser.parseStatementList(); + com.alibaba.druid.sql.ast.statement.SQLJoinTableSource ggg; + String sqlGen = statementList.toString(); + System.out.println(dbType + "生成的sql===" + sqlGen); + StringBuilder sb = new StringBuilder(); + for (SQLStatement statement : statementList) { + sb.append(statement.toString()).append(";"); + } + sb.deleteCharAt(sb.length() - 1); + parser = SQLParserUtils.createSQLStatementParser(sb.toString(), dbType); + List statementListNew = parser.parseStatementList(); + String sqlGenNew = statementList.toString(); + System.out.println(dbType + "重新解析再生成的sql===" + sqlGenNew); + assertEquals(statementList.toString(), statementListNew.toString()); + } + } + } +}