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());
+ }
+ }
+ }
+}