This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 93b4d9f8633 Refactor encrypt rewrite to use 
SubstituteColumnDefinitionToken (#33396)
93b4d9f8633 is described below

commit 93b4d9f86332a88b6bbe02516258627d3f08bfed
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Oct 25 13:48:07 2024 +0800

    Refactor encrypt rewrite to use SubstituteColumnDefinitionToken (#33396)
    
    * Refactor encrypt rewrite to use SubstituteColumnDefinitionToken
    
    * Refactor encrypt rewrite to use SubstituteColumnDefinitionToken
    
    * Refactor encrypt rewrite to use SubstituteColumnDefinitionToken
    
    * Refactor encrypt rewrite to use SubstituteColumnDefinitionToken
---
 .../ddl/EncryptCreateTableTokenGenerator.java      | 31 ++++++------
 .../ddl/EncryptAlterTableTokenGeneratorTest.java   |  6 +--
 .../ddl/EncryptCreateTableTokenGeneratorTest.java  | 38 ++++++++-------
 .../common/pojo/generic/ColumnDefinitionToken.java | 50 +++++++++++++++++++
 .../generic/SubstituteColumnDefinitionToken.java   | 56 ++++++++++++++++++++++
 .../statement/type/DorisDDLStatementVisitor.java   | 10 +++-
 .../statement/type/MySQLDDLStatementVisitor.java   | 10 +++-
 .../type/OpenGaussDDLStatementVisitor.java         | 10 +++-
 .../statement/type/OracleDDLStatementVisitor.java  | 10 +++-
 .../type/PostgreSQLDDLStatementVisitor.java        | 10 +++-
 .../statement/type/PrestoDDLStatementVisitor.java  |  8 +++-
 .../statement/type/SQL92DDLStatementVisitor.java   |  8 +++-
 .../type/SQLServerDDLStatementVisitor.java         | 12 +++--
 .../ddl/column/ColumnDefinitionSegment.java        |  2 +
 .../query-with-cipher/ddl/create/create-table.xml  |  4 +-
 15 files changed, 212 insertions(+), 53 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGenerator.java
index d75f1f426ac..8e21a1b73b7 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGenerator.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.encrypt.rewrite.token.generator.ddl;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.encrypt.constant.EncryptColumnDataType;
-import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptColumnToken;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.encrypt.rule.column.item.CipherColumnItem;
@@ -28,7 +27,8 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateTableStatementContext;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator;
 import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
-import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.RemoveToken;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.ColumnDefinitionToken;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.SubstituteColumnDefinitionToken;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
 
 import java.util.ArrayList;
@@ -60,35 +60,34 @@ public final class EncryptCreateTableTokenGenerator 
implements CollectionSQLToke
             ColumnDefinitionSegment each = columns.get(index);
             String columnName = 
each.getColumnName().getIdentifier().getValue();
             if (encryptTable.isEncryptColumn(columnName)) {
-                
result.addAll(getColumnTokens(encryptTable.getEncryptColumn(columnName), each, 
columns, index));
+                
result.add(getSubstituteColumnToken(encryptTable.getEncryptColumn(columnName), 
each, columns, index));
             }
         }
         return result;
     }
     
-    private Collection<SQLToken> getColumnTokens(final EncryptColumn 
encryptColumn, final ColumnDefinitionSegment column, final 
List<ColumnDefinitionSegment> columns, final int index) {
+    private SQLToken getSubstituteColumnToken(final EncryptColumn 
encryptColumn, final ColumnDefinitionSegment column, final 
List<ColumnDefinitionSegment> columns, final int index) {
+        Collection<SQLToken> columnDefinitionTokens = new LinkedList<>();
+        columnDefinitionTokens.add(getCipherColumnToken(encryptColumn, 
column));
+        getAssistedQueryColumnToken(encryptColumn, 
column).ifPresent(columnDefinitionTokens::add);
+        getLikeQueryColumnToken(encryptColumn, 
column).ifPresent(columnDefinitionTokens::add);
         boolean lastColumn = columns.size() - 1 == index;
         int columnStopIndex = lastColumn ? column.getStopIndex() : 
columns.get(index + 1).getStartIndex() - 1;
-        Collection<SQLToken> result = new LinkedList<>();
-        result.add(new RemoveToken(column.getStartIndex(), columnStopIndex));
-        result.add(getCipherColumnToken(encryptColumn, column, 
columnStopIndex));
-        getAssistedQueryColumnToken(encryptColumn, column, columnStopIndex, 
lastColumn).ifPresent(result::add);
-        getLikeQueryColumnToken(encryptColumn, column, columnStopIndex, 
lastColumn).ifPresent(result::add);
-        return result;
+        return new SubstituteColumnDefinitionToken(column.getStartIndex(), 
columnStopIndex, lastColumn, columnDefinitionTokens);
     }
     
-    private SQLToken getCipherColumnToken(final EncryptColumn encryptColumn, 
final ColumnDefinitionSegment column, final int stopIndex) {
+    private SQLToken getCipherColumnToken(final EncryptColumn encryptColumn, 
final ColumnDefinitionSegment column) {
         CipherColumnItem cipherColumnItem = encryptColumn.getCipher();
-        return new EncryptColumnToken(stopIndex + 1, column.getStopIndex(), 
cipherColumnItem.getName(), EncryptColumnDataType.DEFAULT_DATA_TYPE);
+        return new ColumnDefinitionToken(cipherColumnItem.getName(), 
EncryptColumnDataType.DEFAULT_DATA_TYPE, column.getStartIndex());
     }
     
-    private Optional<? extends SQLToken> getAssistedQueryColumnToken(final 
EncryptColumn encryptColumn, final ColumnDefinitionSegment column, final int 
stopIndex, final boolean lastColumn) {
+    private Optional<? extends SQLToken> getAssistedQueryColumnToken(final 
EncryptColumn encryptColumn, final ColumnDefinitionSegment column) {
         return encryptColumn.getAssistedQuery()
-                .map(optional -> new EncryptColumnToken(stopIndex + 1, 
column.getStopIndex(), encryptColumn.getAssistedQuery().get().getName(), 
EncryptColumnDataType.DEFAULT_DATA_TYPE, lastColumn));
+                .map(optional -> new 
ColumnDefinitionToken(encryptColumn.getAssistedQuery().get().getName(), 
EncryptColumnDataType.DEFAULT_DATA_TYPE, column.getStartIndex()));
     }
     
-    private Optional<? extends SQLToken> getLikeQueryColumnToken(final 
EncryptColumn encryptColumn, final ColumnDefinitionSegment column, final int 
stopIndex, final boolean lastColumn) {
+    private Optional<? extends SQLToken> getLikeQueryColumnToken(final 
EncryptColumn encryptColumn, final ColumnDefinitionSegment column) {
         return encryptColumn.getLikeQuery()
-                .map(optional -> new EncryptColumnToken(stopIndex + 1, 
column.getStopIndex(), encryptColumn.getLikeQuery().get().getName(), 
EncryptColumnDataType.DEFAULT_DATA_TYPE, lastColumn));
+                .map(optional -> new 
ColumnDefinitionToken(encryptColumn.getLikeQuery().get().getName(), 
EncryptColumnDataType.DEFAULT_DATA_TYPE, column.getStartIndex()));
     }
 }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptAlterTableTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptAlterTableTokenGeneratorTest.java
index 341e059dfb7..97f4f8f71c7 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptAlterTableTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptAlterTableTokenGeneratorTest.java
@@ -115,7 +115,7 @@ class EncryptAlterTableTokenGeneratorTest {
         AlterTableStatementContext result = 
mock(AlterTableStatementContext.class, RETURNS_DEEP_STUBS);
         
when(result.getSqlStatement().getTable().getTableName().getIdentifier().getValue()).thenReturn("t_encrypt");
         ColumnDefinitionSegment columnDefinitionSegment = new 
ColumnDefinitionSegment(
-                33, 67, new ColumnSegment(33, 50, new 
IdentifierValue("certificate_number")), new DataTypeSegment(), false, false);
+                33, 67, new ColumnSegment(33, 50, new 
IdentifierValue("certificate_number")), new DataTypeSegment(), false, false, 
"");
         
when(result.getSqlStatement().getAddColumnDefinitions()).thenReturn(Collections.singleton(new
 AddColumnDefinitionSegment(22, 67, 
Collections.singleton(columnDefinitionSegment))));
         return result;
     }
@@ -129,7 +129,7 @@ class EncryptAlterTableTokenGeneratorTest {
         AlterTableStatementContext result = 
mock(AlterTableStatementContext.class, RETURNS_DEEP_STUBS);
         
when(result.getSqlStatement().getTable().getTableName().getIdentifier().getValue()).thenReturn("t_encrypt");
         ColumnDefinitionSegment columnDefinitionSegment = new 
ColumnDefinitionSegment(
-                36, 70, new ColumnSegment(36, 53, new 
IdentifierValue("certificate_number")), new DataTypeSegment(), false, false);
+                36, 70, new ColumnSegment(36, 53, new 
IdentifierValue("certificate_number")), new DataTypeSegment(), false, false, 
"");
         
when(result.getSqlStatement().getModifyColumnDefinitions()).thenReturn(Collections.singleton(new
 ModifyColumnDefinitionSegment(22, 70, columnDefinitionSegment)));
         return result;
     }
@@ -143,7 +143,7 @@ class EncryptAlterTableTokenGeneratorTest {
         AlterTableStatementContext result = 
mock(AlterTableStatementContext.class, RETURNS_DEEP_STUBS);
         
when(result.getSqlStatement().getTable().getTableName().getIdentifier().getValue()).thenReturn("t_encrypt");
         ColumnDefinitionSegment columnDefinitionSegment = new 
ColumnDefinitionSegment(
-                55, 93, new ColumnSegment(55, 76, new 
IdentifierValue("certificate_number_new")), new DataTypeSegment(), false, 
false);
+                55, 93, new ColumnSegment(55, 76, new 
IdentifierValue("certificate_number_new")), new DataTypeSegment(), false, 
false, "");
         ChangeColumnDefinitionSegment changeColumnDefinitionSegment = new 
ChangeColumnDefinitionSegment(22, 93, columnDefinitionSegment);
         changeColumnDefinitionSegment.setPreviousColumn(new ColumnSegment(36, 
53, new IdentifierValue("certificate_number")));
         
when(result.getSqlStatement().getChangeColumnDefinitions()).thenReturn(Collections.singleton(changeColumnDefinitionSegment));
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGeneratorTest.java
index cabd35062eb..d2277cb9167 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/ddl/EncryptCreateTableTokenGeneratorTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.encrypt.rewrite.token.generator.ddl;
 
-import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptColumnToken;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import 
org.apache.shardingsphere.encrypt.rule.column.item.AssistedQueryColumnItem;
@@ -27,7 +26,8 @@ import 
org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
 import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
 import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateTableStatementContext;
 import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
-import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.RemoveToken;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.ColumnDefinitionToken;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.SubstituteColumnDefinitionToken;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
@@ -42,6 +42,7 @@ import java.util.Iterator;
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -80,27 +81,30 @@ class EncryptCreateTableTokenGeneratorTest {
     @Test
     void assertGenerateSQLTokens() {
         Collection<SQLToken> actual = 
generator.generateSQLTokens(mockCreateTableStatementContext());
-        assertThat(actual.size(), is(4));
-        Iterator<SQLToken> actualIterator = actual.iterator();
-        assertThat(actualIterator.next(), instanceOf(RemoveToken.class));
-        EncryptColumnToken cipherToken = (EncryptColumnToken) 
actualIterator.next();
+        assertThat(actual.size(), is(1));
+        SQLToken token = actual.iterator().next();
+        assertThat(token, instanceOf(SubstituteColumnDefinitionToken.class));
+        Collection<SQLToken> columnTokens = ((SubstituteColumnDefinitionToken) 
token).getColumnDefinitionTokens();
+        Iterator<SQLToken> actualIterator = columnTokens.iterator();
+        ColumnDefinitionToken cipherToken = (ColumnDefinitionToken) 
actualIterator.next();
         assertThat(cipherToken.toString(), is("cipher_certificate_number 
VARCHAR(4000)"));
-        assertThat(cipherToken.getStartIndex(), is(79));
-        assertThat(cipherToken.getStopIndex(), is(78));
-        EncryptColumnToken assistedToken = (EncryptColumnToken) 
actualIterator.next();
-        assertThat(assistedToken.toString(), is(", assisted_certificate_number 
VARCHAR(4000)"));
-        assertThat(assistedToken.getStartIndex(), is(79));
-        assertThat(assistedToken.getStopIndex(), is(78));
-        EncryptColumnToken likeToken = (EncryptColumnToken) 
actualIterator.next();
-        assertThat(likeToken.toString(), is(", like_certificate_number 
VARCHAR(4000)"));
-        assertThat(likeToken.getStartIndex(), is(79));
-        assertThat(likeToken.getStopIndex(), is(78));
+        assertThat(cipherToken.getStartIndex(), is(25));
+        ColumnDefinitionToken assistedToken = (ColumnDefinitionToken) 
actualIterator.next();
+        assertThat(assistedToken.toString(), is("assisted_certificate_number 
VARCHAR(4000)"));
+        assertThat(assistedToken.getStartIndex(), is(25));
+        ColumnDefinitionToken likeToken = (ColumnDefinitionToken) 
actualIterator.next();
+        assertThat(likeToken.toString(), is("like_certificate_number 
VARCHAR(4000)"));
+        assertThat(likeToken.getStartIndex(), is(25));
+        assertThat(token.toString(), is("cipher_certificate_number 
VARCHAR(4000), assisted_certificate_number VARCHAR(4000), 
like_certificate_number VARCHAR(4000)"));
+        assertThat(token.getStartIndex(), is(25));
+        assertThat(((SubstituteColumnDefinitionToken) token).getStopIndex(), 
is(78));
+        assertTrue(((SubstituteColumnDefinitionToken) token).isLastColumn());
     }
     
     private CreateTableStatementContext mockCreateTableStatementContext() {
         CreateTableStatementContext result = 
mock(CreateTableStatementContext.class, RETURNS_DEEP_STUBS);
         
when(result.getSqlStatement().getTable().getTableName().getIdentifier().getValue()).thenReturn("t_encrypt");
-        ColumnDefinitionSegment segment = new ColumnDefinitionSegment(25, 78, 
new ColumnSegment(25, 42, new IdentifierValue("certificate_number")), new 
DataTypeSegment(), false, false);
+        ColumnDefinitionSegment segment = new ColumnDefinitionSegment(25, 78, 
new ColumnSegment(25, 42, new IdentifierValue("certificate_number")), new 
DataTypeSegment(), false, false, "");
         
when(result.getSqlStatement().getColumnDefinitions()).thenReturn(Collections.singleton(segment));
         return result;
     }
diff --git 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/ColumnDefinitionToken.java
 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/ColumnDefinitionToken.java
new file mode 100644
index 00000000000..bd62611b110
--- /dev/null
+++ 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/ColumnDefinitionToken.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic;
+
+import com.google.common.base.Strings;
+import lombok.Getter;
+import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
+
+/**
+ * Column definition token.
+ */
+@Getter
+public final class ColumnDefinitionToken extends SQLToken {
+    
+    private final String columnName;
+    
+    private final String dataType;
+    
+    public ColumnDefinitionToken(final String columnName, final String 
dataType, final int startIndex) {
+        super(startIndex);
+        this.columnName = columnName;
+        this.dataType = dataType;
+    }
+    
+    @Override
+    public String toString() {
+        if (Strings.isNullOrEmpty(dataType)) {
+            return columnName;
+        }
+        if (Strings.isNullOrEmpty(columnName)) {
+            return dataType;
+        }
+        return columnName + " " + dataType;
+    }
+}
diff --git 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/SubstituteColumnDefinitionToken.java
 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/SubstituteColumnDefinitionToken.java
new file mode 100644
index 00000000000..aac3bc239c8
--- /dev/null
+++ 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/common/pojo/generic/SubstituteColumnDefinitionToken.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic;
+
+import lombok.Getter;
+import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken;
+import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.Substitutable;
+
+import java.util.Collection;
+
+/**
+ * Substitute column definition token.
+ */
+@Getter
+public final class SubstituteColumnDefinitionToken extends SQLToken implements 
Substitutable {
+    
+    private final int stopIndex;
+    
+    private final boolean lastColumn;
+    
+    private final Collection<SQLToken> columnDefinitionTokens;
+    
+    public SubstituteColumnDefinitionToken(final int startIndex, final int 
stopIndex, final boolean lastColumn, final Collection<SQLToken> 
columnDefinitionTokens) {
+        super(startIndex);
+        this.stopIndex = stopIndex;
+        this.lastColumn = lastColumn;
+        this.columnDefinitionTokens = columnDefinitionTokens;
+    }
+    
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        for (SQLToken each : columnDefinitionTokens) {
+            builder.append(each.toString()).append(", ");
+        }
+        if (lastColumn) {
+            builder.delete(builder.length() - 2, builder.length());
+        }
+        return builder.toString();
+    }
+}
diff --git 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
index 288bc0e98f2..aaaee7b0319 100644
--- 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java
@@ -18,6 +18,8 @@
 package org.apache.shardingsphere.sql.parser.doris.visitor.statement.type;
 
 import com.google.common.base.Preconditions;
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.AddColumnContext;
@@ -358,11 +360,15 @@ public final class DorisDDLStatementVisitor extends 
DorisStatementVisitor implem
         boolean isPrimaryKey = ctx.columnAttribute().stream().anyMatch(each -> 
null != each.KEY() && null == each.UNIQUE());
         boolean isAutoIncrement = ctx.columnAttribute().stream().anyMatch(each 
-> null != each.AUTO_INCREMENT());
         // TODO parse not null
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(column.getStartIndex(), ctx.getStop().getStopIndex(), 
column, dataTypeSegment, isPrimaryKey, false);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(column.getStartIndex(), ctx.getStop().getStopIndex(), 
column, dataTypeSegment, isPrimaryKey, false, getText(ctx));
         result.setAutoIncrement(isAutoIncrement);
         return result;
     }
     
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+    }
+    
     @Override
     public ASTNode visitAlterConstraint(final AlterConstraintContext ctx) {
         return new 
ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (ConstraintSegment) visit(ctx.constraintName()));
@@ -579,7 +585,7 @@ public final class DorisDDLStatementVisitor extends 
DorisStatementVisitor implem
         boolean isPrimaryKey = 
ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != 
each.KEY() && null == each.UNIQUE());
         boolean isAutoIncrement = 
ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != 
each.AUTO_INCREMENT());
         boolean isNotNull = 
ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != 
each.NOT() && null != each.NULL());
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey, isNotNull);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey, isNotNull, 
getText(ctx));
         result.getReferencedTables().addAll(getReferencedTables(ctx));
         result.setAutoIncrement(isAutoIncrement);
         return result;
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
index 820ea3b780c..cbad47bb37f 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.mysql.visitor.statement.type;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
@@ -360,11 +362,15 @@ public final class MySQLDDLStatementVisitor extends 
MySQLStatementVisitor implem
         boolean isPrimaryKey = ctx.columnAttribute().stream().anyMatch(each -> 
null != each.KEY() && null == each.UNIQUE());
         boolean isAutoIncrement = ctx.columnAttribute().stream().anyMatch(each 
-> null != each.AUTO_INCREMENT());
         // TODO parse not null
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(column.getStartIndex(), ctx.getStop().getStopIndex(), 
column, dataTypeSegment, isPrimaryKey, false);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(column.getStartIndex(), ctx.getStop().getStopIndex(), 
column, dataTypeSegment, isPrimaryKey, false, getText(ctx));
         result.setAutoIncrement(isAutoIncrement);
         return result;
     }
     
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+    }
+    
     @Override
     public ASTNode visitAlterConstraint(final AlterConstraintContext ctx) {
         return new 
ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (ConstraintSegment) visit(ctx.constraintName()));
@@ -581,7 +587,7 @@ public final class MySQLDDLStatementVisitor extends 
MySQLStatementVisitor implem
         boolean isPrimaryKey = 
ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != 
each.KEY() && null == each.UNIQUE());
         boolean isAutoIncrement = 
ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != 
each.AUTO_INCREMENT());
         boolean isNotNull = 
ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != 
each.NOT() && null != each.NULL());
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey, isNotNull);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey, isNotNull, 
getText(ctx));
         result.getReferencedTables().addAll(getReferencedTables(ctx));
         result.setAutoIncrement(isAutoIncrement);
         if (null != ctx.fieldDefinition().dataType().charsetWithOptBinary()) {
diff --git 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
index 0263ed3fdda..ddc1192fbd2 100644
--- 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.opengauss.visitor.statement.type;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.OpenGaussStatementParser.AbsoluteCountContext;
@@ -445,7 +447,7 @@ public final class OpenGaussDDLStatementVisitor extends 
OpenGaussStatementVisito
         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
         boolean isPrimaryKey = ctx.columnConstraint().stream().anyMatch(each 
-> null != each.columnConstraintOption() && null != 
each.columnConstraintOption().primaryKey());
         // TODO parse not null
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false, 
getText(ctx));
         for (ColumnConstraintContext each : ctx.columnConstraint()) {
             if (null != each.columnConstraintOption().tableName()) {
                 result.getReferencedTables().add((SimpleTableSegment) 
visit(each.columnConstraintOption().tableName()));
@@ -454,6 +456,10 @@ public final class OpenGaussDDLStatementVisitor extends 
OpenGaussStatementVisito
         return result;
     }
     
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+    }
+    
     @Override
     public ASTNode visitTableConstraintUsingIndex(final 
TableConstraintUsingIndexContext ctx) {
         ConstraintDefinitionSegment result = new 
ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex());
@@ -487,7 +493,7 @@ public final class OpenGaussDDLStatementVisitor extends 
OpenGaussStatementVisito
         // TODO visit pk and table ref
         ColumnSegment column = (ColumnSegment) 
visit(ctx.modifyColumn().columnName());
         DataTypeSegment dataType = null == ctx.dataType() ? null : 
(DataTypeSegment) visit(ctx.dataType());
-        ColumnDefinitionSegment columnDefinition = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false);
+        ColumnDefinitionSegment columnDefinition = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false, getText(ctx));
         return new 
ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), columnDefinition);
     }
     
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index f1bb7da89a6..422659d4bd1 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.oracle.visitor.statement.type;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AddColumnSpecificationContext;
@@ -482,7 +484,7 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         DataTypeSegment dataType = null == ctx.dataType() ? null : 
(DataTypeSegment) visit(ctx.dataType());
         boolean isPrimaryKey = ctx.inlineConstraint().stream().anyMatch(each 
-> null != each.primaryKey());
         boolean isNotNull = ctx.inlineConstraint().stream().anyMatch(each -> 
null != each.NOT() && null != each.NULL());
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, isNotNull);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, isNotNull, 
getText(ctx));
         if (null != ctx.REF() && null != ctx.dataType()) {
             result.setRef(true);
         }
@@ -497,6 +499,10 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         return result;
     }
     
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+    }
+    
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitOutOfLineConstraint(final OutOfLineConstraintContext 
ctx) {
@@ -673,7 +679,7 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
         ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
         DataTypeSegment dataType = null == ctx.dataType() ? null : 
(DataTypeSegment) visit(ctx.dataType());
         // TODO visit pk and reference table
-        return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false);
+        return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false, getText(ctx));
     }
     
     @Override
diff --git 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
index f4027b4800b..98a5a5b20ad 100644
--- 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.type;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.AbsoluteCountContext;
@@ -560,7 +562,7 @@ public final class PostgreSQLDDLStatementVisitor extends 
PostgreSQLStatementVisi
         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
         boolean isPrimaryKey = ctx.columnConstraint().stream().anyMatch(each 
-> null != each.columnConstraintOption() && null != 
each.columnConstraintOption().primaryKey());
         // TODO parse not null
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false, 
getText(ctx));
         for (ColumnConstraintContext each : ctx.columnConstraint()) {
             if (null != each.columnConstraintOption().tableName()) {
                 result.getReferencedTables().add((SimpleTableSegment) 
visit(each.columnConstraintOption().tableName()));
@@ -569,6 +571,10 @@ public final class PostgreSQLDDLStatementVisitor extends 
PostgreSQLStatementVisi
         return result;
     }
     
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+    }
+    
     @Override
     public ASTNode visitTableConstraintUsingIndex(final 
TableConstraintUsingIndexContext ctx) {
         ConstraintDefinitionSegment result = new 
ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex());
@@ -602,7 +608,7 @@ public final class PostgreSQLDDLStatementVisitor extends 
PostgreSQLStatementVisi
         // TODO visit pk and table ref
         ColumnSegment column = (ColumnSegment) 
visit(ctx.modifyColumn().columnName());
         DataTypeSegment dataType = null == ctx.dataType() ? null : 
(DataTypeSegment) visit(ctx.dataType());
-        ColumnDefinitionSegment columnDefinition = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false);
+        ColumnDefinitionSegment columnDefinition = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false, getText(ctx));
         return new 
ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), columnDefinition);
     }
     
diff --git 
a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
 
b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
index d970c274014..9aa313d94cf 100644
--- 
a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.presto.visitor.statement.type;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.PrestoStatementParser.CharsetNameContext;
@@ -106,7 +108,11 @@ public final class PrestoDDLStatementVisitor extends 
PrestoStatementVisitor impl
     public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
         ColumnSegment column = new 
ColumnSegment(ctx.column_name.start.getStartIndex(), 
ctx.column_name.stop.getStopIndex(), (IdentifierValue) visit(ctx.column_name));
         DataTypeSegment dataTypeSegment = (DataTypeSegment) 
visit(ctx.fieldDefinition().dataType());
-        return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataTypeSegment, false, false);
+        return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataTypeSegment, false, false, 
getText(ctx));
+    }
+    
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
     }
     
     @SuppressWarnings("unchecked")
diff --git 
a/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
 
b/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
index cde300eaa0d..d3a9f2eff21 100644
--- 
a/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
+++ 
b/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.sql92.visitor.statement.type;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser.AddColumnSpecificationContext;
@@ -103,7 +105,7 @@ public final class SQL92DDLStatementVisitor extends 
SQL92StatementVisitor implem
         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
         boolean isPrimaryKey = ctx.dataTypeOption().stream().anyMatch(each -> 
null != each.primaryKey());
         // TODO parse not null
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false, 
getText(ctx));
         for (DataTypeOptionContext each : ctx.dataTypeOption()) {
             if (null != each.referenceDefinition()) {
                 result.getReferencedTables().add((SimpleTableSegment) 
visit(each.referenceDefinition().tableName()));
@@ -112,6 +114,10 @@ public final class SQL92DDLStatementVisitor extends 
SQL92StatementVisitor implem
         return result;
     }
     
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+    }
+    
     @Override
     public ASTNode visitCheckConstraintDefinition(final 
CheckConstraintDefinitionContext ctx) {
         return new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex());
diff --git 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
index 277bd5de6be..0180b750bf3 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.type;
 
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.misc.Interval;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AddColumnSpecificationContext;
@@ -68,6 +70,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Mod
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableConstraintContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TruncateTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ViewNameContext;
+import 
org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.SQLServerStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.AlterDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.CreateDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
@@ -116,7 +119,6 @@ import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.SQLServerDro
 import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.SQLServerDropViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.SQLServerTruncateStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.sqlserver.dml.SQLServerSelectStatement;
-import 
org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.SQLServerStatementVisitor;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -166,7 +168,7 @@ public final class SQLServerDDLStatementVisitor extends 
SQLServerStatementVisito
         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
         boolean isPrimaryKey = isPrimaryKey(ctx);
         // TODO parse not null
-        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false);
+        ColumnDefinitionSegment result = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false, 
getText(ctx));
         for (ColumnDefinitionOptionContext each : 
ctx.columnDefinitionOption()) {
             for (ColumnConstraintContext columnConstraint : 
each.columnConstraint()) {
                 if (null != columnConstraint.columnForeignKeyConstraint()) {
@@ -182,6 +184,10 @@ public final class SQLServerDDLStatementVisitor extends 
SQLServerStatementVisito
         return result;
     }
     
+    private String getText(final ParserRuleContext ctx) {
+        return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
+    }
+    
     private boolean isPrimaryKey(final ColumnDefinitionContext ctx) {
         for (ColumnDefinitionOptionContext each : 
ctx.columnDefinitionOption()) {
             for (ColumnConstraintContext columnConstraint : 
each.columnConstraint()) {
@@ -287,7 +293,7 @@ public final class SQLServerDDLStatementVisitor extends 
SQLServerStatementVisito
         // TODO visit pk and table ref
         ColumnSegment column = (ColumnSegment) 
visit(ctx.alterColumnOperation().columnName());
         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
-        ColumnDefinitionSegment columnDefinition = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false);
+        ColumnDefinitionSegment columnDefinition = new 
ColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, dataType, false, false, getText(ctx));
         return new 
ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), columnDefinition);
     }
     
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
index 867ef9c242d..b9acd5d4673 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/column/ColumnDefinitionSegment.java
@@ -50,6 +50,8 @@ public final class ColumnDefinitionSegment implements 
CreateDefinitionSegment {
     
     private final boolean notNull;
     
+    private final String text;
+    
     private final Collection<SimpleTableSegment> referencedTables = new 
LinkedList<>();
     
     @Setter
diff --git 
a/test/it/rewriter/src/test/resources/scenario/mix/case/query-with-cipher/ddl/create/create-table.xml
 
b/test/it/rewriter/src/test/resources/scenario/mix/case/query-with-cipher/ddl/create/create-table.xml
index c2fc464fea8..b4c612ac812 100644
--- 
a/test/it/rewriter/src/test/resources/scenario/mix/case/query-with-cipher/ddl/create/create-table.xml
+++ 
b/test/it/rewriter/src/test/resources/scenario/mix/case/query-with-cipher/ddl/create/create-table.xml
@@ -37,7 +37,7 @@
     
     <rewrite-assertion id="create_table_with_random_blank_cipher_column" 
db-types="MySQL">
         <input sql="CREATE TABLE t_account_detail_new( account_id INT  , 
password VARCHAR(100) ,  amount VARCHAR(100)); " />
-        <output sql="CREATE TABLE t_account_detail_new_0( account_id INT  , 
cipher_password VARCHAR(4000) ,  assisted_query_password VARCHAR(4000) ,  
cipher_amount VARCHAR(4000)); " />
-        <output sql="CREATE TABLE t_account_detail_new_1( account_id INT  , 
cipher_password VARCHAR(4000) ,  assisted_query_password VARCHAR(4000) ,  
cipher_amount VARCHAR(4000)); " />
+        <output sql="CREATE TABLE t_account_detail_new_0( account_id INT  , 
cipher_password VARCHAR(4000), assisted_query_password VARCHAR(4000), 
cipher_amount VARCHAR(4000)); " />
+        <output sql="CREATE TABLE t_account_detail_new_1( account_id INT  , 
cipher_password VARCHAR(4000), assisted_query_password VARCHAR(4000), 
cipher_amount VARCHAR(4000)); " />
     </rewrite-assertion>
 </rewrite-assertions>

Reply via email to