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

zhangliang 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 3ac84715ffb Refactor constructor of CreateIndexStatement to empty 
buildAttributes (#38314)
3ac84715ffb is described below

commit 3ac84715ffbc9231fe696b94736fb0286d55f60b
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Mar 3 16:28:08 2026 +0800

    Refactor constructor of CreateIndexStatement to empty buildAttributes 
(#38314)
    
    * Refactor DorisCreateFunctionStatement and OracleCreateFunctionStatement
    
    * Refactor constructor of CreateIndexStatement to empty buildAttributes
    
    * Refactor constructor of CreateIndexStatement to empty buildAttributes
---
 .../ShardingCreateIndexSupportedCheckerTest.java   | 62 ++++++++++++----------
 .../rewrite/token/pojo/IndexTokenTest.java         |  3 +-
 .../statement/ddl/CreateIndexStatementBinder.java  | 21 +++++---
 .../CreateIndexPushDownMetaDataRefresherTest.java  | 15 +++---
 .../statement/type/DorisDDLStatementVisitor.java   | 39 +++++++-------
 .../statement/type/HiveDDLStatementVisitor.java    | 19 ++++---
 .../statement/type/MySQLDDLStatementVisitor.java   | 22 +++++---
 .../type/OpenGaussDDLStatementVisitor.java         | 24 ++++++---
 .../statement/type/OracleDDLStatementVisitor.java  | 13 ++---
 .../type/PostgreSQLDDLStatementVisitor.java        | 26 +++++----
 .../type/SQLServerDDLStatementVisitor.java         | 11 ++--
 .../type/ddl/index/CreateIndexStatement.java       | 42 +++++++++------
 12 files changed, 175 insertions(+), 122 deletions(-)

diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java
index 639f8eb9e77..325082fa81b 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java
@@ -38,6 +38,8 @@ import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Collections;
+
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
@@ -56,10 +58,11 @@ class ShardingCreateIndexSupportedCheckerTest {
     
     @Test
     void assertCheckWhenTableExistIndexNotExistForPostgreSQL() {
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 
0, new IdentifierValue("t_order_index"))));
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = CreateIndexStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .index(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new 
IdentifierValue("t_order_index"))))
+                .build();
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         when(schema.containsTable("t_order")).thenReturn(true);
         assertDoesNotThrow(() -> new 
ShardingCreateIndexSupportedChecker().check(rule, database, schema, new 
CommonSQLStatementContext(sqlStatement)));
@@ -67,10 +70,11 @@ class ShardingCreateIndexSupportedCheckerTest {
     
     @Test
     void assertCheckWhenTableNotExistIndexNotExistForPostgreSQL() {
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 
0, new IdentifierValue("t_order_index"))));
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = CreateIndexStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .index(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new 
IdentifierValue("t_order_index"))))
+                .build();
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         when(schema.containsTable("t_order")).thenReturn(false);
         assertThrows(NoSuchTableException.class, () -> new 
ShardingCreateIndexSupportedChecker().check(rule, database, schema, new 
CommonSQLStatementContext(sqlStatement)));
@@ -78,10 +82,11 @@ class ShardingCreateIndexSupportedCheckerTest {
     
     @Test
     void assertCheckWhenTableExistIndexExistForPostgreSQL() {
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 
0, new IdentifierValue("t_order_index"))));
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = CreateIndexStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .index(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new 
IdentifierValue("t_order_index"))))
+                .build();
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         when(schema.containsTable("t_order")).thenReturn(true);
         when(schema.containsIndex("t_order", 
"t_order_index")).thenReturn(true);
@@ -90,11 +95,12 @@ class ShardingCreateIndexSupportedCheckerTest {
     
     @Test
     void assertCheckWithoutIndexNameWhenTableExistIndexNotExistForPostgreSQL() 
{
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.getColumns().add(new ColumnSegment(0, 0, new 
IdentifierValue("content")));
-        sqlStatement.setAnonymousIndexStartIndex(10);
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = CreateIndexStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .columns(Collections.singleton(new ColumnSegment(0, 0, new 
IdentifierValue("content"))))
+                .anonymousIndexStartIndex(10)
+                .build();
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         when(schema.containsTable("t_order")).thenReturn(true);
         assertDoesNotThrow(() -> new 
ShardingCreateIndexSupportedChecker().check(rule, database, schema, new 
CommonSQLStatementContext(sqlStatement)));
@@ -102,11 +108,12 @@ class ShardingCreateIndexSupportedCheckerTest {
     
     @Test
     void 
assertCheckWithoutIndexNameWhenTableNotExistIndexNotExistForPostgreSQL() {
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.getColumns().add(new ColumnSegment(0, 0, new 
IdentifierValue("content")));
-        sqlStatement.setAnonymousIndexStartIndex(10);
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = CreateIndexStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .columns(Collections.singleton(new ColumnSegment(0, 0, new 
IdentifierValue("content"))))
+                .anonymousIndexStartIndex(10)
+                .build();
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         when(schema.containsTable("t_order")).thenReturn(false);
         assertThrows(NoSuchTableException.class, () -> new 
ShardingCreateIndexSupportedChecker().check(rule, database, schema, new 
CommonSQLStatementContext(sqlStatement)));
@@ -114,11 +121,12 @@ class ShardingCreateIndexSupportedCheckerTest {
     
     @Test
     void assertCheckWithoutIndexNameWhenTableExistIndexExistForPostgreSQL() {
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.getColumns().add(new ColumnSegment(0, 0, new 
IdentifierValue("content")));
-        sqlStatement.setAnonymousIndexStartIndex(10);
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = CreateIndexStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .columns(Collections.singleton(new ColumnSegment(0, 0, new 
IdentifierValue("content"))))
+                .anonymousIndexStartIndex(10)
+                .build();
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         when(schema.containsTable("t_order")).thenReturn(true);
         when(schema.containsIndex("t_order", "content_idx")).thenReturn(true);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexTokenTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexTokenTest.java
index eb4310e7f2e..1488e493606 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexTokenTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexTokenTest.java
@@ -63,8 +63,7 @@ class IndexTokenTest {
     
     @Test
     void assertToStringWithShardingTableAndGeneratedIndex() {
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = 
CreateIndexStatement.builder().databaseType(databaseType).build();
         CommonSQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(sqlStatement);
         IndexToken indexToken = new IndexToken(0, 0, new 
IdentifierValue("bar_idx"), sqlStatementContext, mock(ShardingRule.class), 
mockSchema());
         assertThat(indexToken.toString(mockRouteUnit()), is(" 
bar_idx_foo_tbl_0 "));
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java
index 5470c91c47d..abeedb10905 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java
@@ -49,14 +49,19 @@ public final class CreateIndexStatementBinder implements 
SQLStatementBinder<Crea
     }
     
     private CreateIndexStatement copy(final CreateIndexStatement sqlStatement, 
final SimpleTableSegment boundTable, final Collection<ColumnSegment> 
boundColumns) {
-        CreateIndexStatement result = new 
CreateIndexStatement(sqlStatement.getDatabaseType());
-        result.setTable(boundTable);
-        result.getColumns().addAll(boundColumns);
-        result.setIndex(sqlStatement.getIndex());
-        
sqlStatement.getAnonymousIndexStartIndex().ifPresent(result::setAnonymousIndexStartIndex);
-        result.setIfNotExists(sqlStatement.isIfNotExists());
-        sqlStatement.getAlgorithmType().ifPresent(result::setAlgorithmType);
-        sqlStatement.getLockTable().ifPresent(result::setLockTable);
+        CreateIndexStatement result = CreateIndexStatement.builder()
+                .databaseType(sqlStatement.getDatabaseType())
+                .index(sqlStatement.getIndex())
+                .table(boundTable)
+                .ifNotExists(sqlStatement.isIfNotExists())
+                
.anonymousIndexStartIndex(sqlStatement.getAnonymousIndexStartIndex().orElse(null))
+                .algorithmType(sqlStatement.getAlgorithmType().orElse(null))
+                .lockTable(sqlStatement.getLockTable().orElse(null))
+                .columns(boundColumns)
+                .indexType(sqlStatement.getIndexType())
+                .properties(sqlStatement.getProperties())
+                .comment(sqlStatement.getComment())
+                .build();
         SQLStatementCopyUtils.copyAttributes(sqlStatement, result);
         return result;
     }
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/index/CreateIndexPushDownMetaDataRefresherTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/index/CreateIndexPushDownMetaDataRefresherTest.java
index fbcca89d0ca..388b61c591e 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/index/CreateIndexPushDownMetaDataRefresherTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/index/CreateIndexPushDownMetaDataRefresherTest.java
@@ -79,18 +79,17 @@ class CreateIndexPushDownMetaDataRefresherTest {
     }
     
     private CreateIndexStatement createCreateIndexStatement() {
-        CreateIndexStatement result = new CreateIndexStatement(databaseType);
-        result.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("foo_tbl"))));
-        result.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new 
IdentifierValue("idx_foo"))));
-        result.getColumns().add(new ColumnSegment(0, 0, new 
IdentifierValue("order_id")));
-        result.buildAttributes();
-        return result;
+        return CreateIndexStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("foo_tbl"))))
+                .index(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new 
IdentifierValue("idx_foo"))))
+                .columns(Collections.singleton(new ColumnSegment(0, 0, new 
IdentifierValue("order_id"))))
+                .build();
     }
     
     @Test
     void assertRefreshThrowsWhenIndexCountInvalid() {
-        CreateIndexStatement sqlStatement = new 
CreateIndexStatement(databaseType);
-        sqlStatement.buildAttributes();
+        CreateIndexStatement sqlStatement = 
CreateIndexStatement.builder().databaseType(databaseType).build();
         assertThrows(IllegalArgumentException.class, () -> 
refresher.refresh(metaDataManagerPersistService,
                 createDatabase(Collections.emptyList()), "logic_ds", 
"foo_schema", databaseType, sqlStatement, new ConfigurationProperties(new 
Properties())));
         verifyNoInteractions(metaDataManagerPersistService);
diff --git 
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
index 80cf0587175..40b7d285778 100644
--- 
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
@@ -1146,32 +1146,33 @@ public final class DorisDDLStatementVisitor extends 
DorisStatementVisitor implem
     @SuppressWarnings({"unchecked", "rawtypes"})
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
-        CreateIndexStatement result = new 
CreateIndexStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setIfNotExists(null != ctx.ifNotExists());
         IndexNameSegment indexName = new 
IndexNameSegment(ctx.indexName().start.getStartIndex(), 
ctx.indexName().stop.getStopIndex(), new 
IdentifierValue(ctx.indexName().getText()));
-        result.setIndex(new 
IndexSegment(ctx.indexName().start.getStartIndex(), 
ctx.indexName().stop.getStopIndex(), indexName));
-        result.getColumns().addAll(((CollectionValue) 
visit(ctx.keyListWithExpression())).getValue());
-        if (null != ctx.dorisIndexTypeClause()) {
-            
result.setIndexType(ctx.dorisIndexTypeClause().getStop().getText());
-        }
-        if (null != ctx.propertiesClause()) {
-            
result.setProperties(extractPropertiesSegment(ctx.propertiesClause()));
-        }
-        if (null != ctx.commentClause() && null != 
ctx.commentClause().literals()) {
-            String commentText = 
SQLUtils.getExactlyValue(ctx.commentClause().literals().getText());
-            result.setComment(commentText);
-            CommentSegment commentSegment = new CommentSegment(commentText, 
ctx.commentClause().literals().getStart().getStartIndex(), 
ctx.commentClause().literals().getStop().getStopIndex());
-            result.getComments().add(commentSegment);
-        }
+        String comment = null == ctx.commentClause() || null == 
ctx.commentClause().literals() ? null : 
SQLUtils.getExactlyValue(ctx.commentClause().literals().getText());
+        AlgorithmTypeSegment algorithmType = null;
+        LockTableSegment lockTable = null;
         if (null != ctx.algorithmOptionAndLockOption()) {
             if (null != 
ctx.algorithmOptionAndLockOption().alterAlgorithmOption()) {
-                result.setAlgorithmType((AlgorithmTypeSegment) 
visit(ctx.algorithmOptionAndLockOption().alterAlgorithmOption()));
+                algorithmType = (AlgorithmTypeSegment) 
visit(ctx.algorithmOptionAndLockOption().alterAlgorithmOption());
             }
             if (null != ctx.algorithmOptionAndLockOption().alterLockOption()) {
-                result.setLockTable((LockTableSegment) 
visit(ctx.algorithmOptionAndLockOption().alterLockOption()));
+                lockTable = (LockTableSegment) 
visit(ctx.algorithmOptionAndLockOption().alterLockOption());
             }
         }
+        CreateIndexStatement result = CreateIndexStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .ifNotExists(null != ctx.ifNotExists())
+                .index(new IndexSegment(ctx.indexName().start.getStartIndex(), 
ctx.indexName().stop.getStopIndex(), indexName))
+                .columns(((CollectionValue) 
visit(ctx.keyListWithExpression())).getValue())
+                .indexType(null == ctx.dorisIndexTypeClause() ? null : 
ctx.dorisIndexTypeClause().getStop().getText())
+                .properties(null == ctx.propertiesClause() ? null : 
extractPropertiesSegment(ctx.propertiesClause()))
+                .comment(comment)
+                .algorithmType(algorithmType)
+                .lockTable(lockTable)
+                .build();
+        if (null != ctx.commentClause() && null != 
ctx.commentClause().literals()) {
+            result.getComments().add(new CommentSegment(comment, 
ctx.commentClause().literals().getStart().getStartIndex(), 
ctx.commentClause().literals().getStop().getStopIndex()));
+        }
         return result;
     }
     
diff --git 
a/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDDLStatementVisitor.java
index 87ecb79631b..3e728558e45 100644
--- 
a/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDDLStatementVisitor.java
@@ -94,7 +94,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.Se
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.collection.CollectionValue;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
+import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 
 /**
  * DDL statement visitor for Hive.
@@ -371,17 +373,20 @@ public final class HiveDDLStatementVisitor extends 
HiveStatementVisitor implemen
     
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
-        CreateIndexStatement result = new 
CreateIndexStatement(getDatabaseType());
-        result.setIndex(new 
IndexSegment(ctx.indexName().getStart().getStartIndex(), 
ctx.indexName().getStop().getStopIndex(),
-                new 
IndexNameSegment(ctx.indexName().getStart().getStartIndex(), 
ctx.indexName().getStop().getStopIndex(),
-                        new IdentifierValue(ctx.indexName().getText()))));
-        result.setTable((SimpleTableSegment) visit(ctx.tableNameWithDb()));
+        Collection<ColumnSegment> columns = new LinkedList<>();
         if (null != ctx.columnNamesCommonClause()) {
             for (ColumnNameContext each : 
ctx.columnNamesCommonClause().columnNames().columnName()) {
-                result.getColumns().add(new 
ColumnSegment(each.getStart().getStartIndex(), each.getStop().getStopIndex(), 
new IdentifierValue(each.getText())));
+                columns.add(new ColumnSegment(each.getStart().getStartIndex(), 
each.getStop().getStopIndex(), new IdentifierValue(each.getText())));
             }
         }
-        return result;
+        return CreateIndexStatement.builder()
+                .databaseType(getDatabaseType())
+                .index(new 
IndexSegment(ctx.indexName().getStart().getStartIndex(), 
ctx.indexName().getStop().getStopIndex(),
+                        new 
IndexNameSegment(ctx.indexName().getStart().getStartIndex(), 
ctx.indexName().getStop().getStopIndex(),
+                                new 
IdentifierValue(ctx.indexName().getText()))))
+                .table((SimpleTableSegment) visit(ctx.tableNameWithDb()))
+                .columns(columns)
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
index a536d30b987..cf791439253 100644
--- 
a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
@@ -706,23 +706,29 @@ public final class MySQLDDLStatementVisitor extends 
MySQLStatementVisitor implem
     @SuppressWarnings({"unchecked", "rawtypes"})
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
-        CreateIndexStatement result = new 
CreateIndexStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
         IndexNameSegment indexName = new 
IndexNameSegment(ctx.indexName().start.getStartIndex(), 
ctx.indexName().stop.getStopIndex(), new 
IdentifierValue(ctx.indexName().getText()));
-        result.setIndex(new 
IndexSegment(ctx.indexName().start.getStartIndex(), 
ctx.indexName().stop.getStopIndex(), indexName));
-        result.getColumns().addAll(((CollectionValue) 
visit(ctx.keyListWithExpression())).getValue());
+        IndexSegment index = new 
IndexSegment(ctx.indexName().start.getStartIndex(), 
ctx.indexName().stop.getStopIndex(), indexName);
         if (null != ctx.createIndexSpecification() && null != 
ctx.createIndexSpecification().UNIQUE()) {
-            result.getIndex().setUniqueKey(true);
+            index.setUniqueKey(true);
         }
+        AlgorithmTypeSegment algorithmType = null;
+        LockTableSegment lockTable = null;
         if (null != ctx.algorithmOptionAndLockOption()) {
             if (null != 
ctx.algorithmOptionAndLockOption().alterAlgorithmOption()) {
-                result.setAlgorithmType((AlgorithmTypeSegment) 
visit(ctx.algorithmOptionAndLockOption().alterAlgorithmOption()));
+                algorithmType = (AlgorithmTypeSegment) 
visit(ctx.algorithmOptionAndLockOption().alterAlgorithmOption());
             }
             if (null != ctx.algorithmOptionAndLockOption().alterLockOption()) {
-                result.setLockTable((LockTableSegment) 
visit(ctx.algorithmOptionAndLockOption().alterLockOption()));
+                lockTable = (LockTableSegment) 
visit(ctx.algorithmOptionAndLockOption().alterLockOption());
             }
         }
-        return result;
+        return CreateIndexStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .index(index)
+                .columns(((CollectionValue) 
visit(ctx.keyListWithExpression())).getValue())
+                .algorithmType(algorithmType)
+                .lockTable(lockTable)
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
index aeaae3a78f7..fdf42cbaccf 100644
--- 
a/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/engine/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java
@@ -532,16 +532,24 @@ public final class OpenGaussDDLStatementVisitor extends 
OpenGaussStatementVisito
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
-        CreateIndexStatement result = new 
CreateIndexStatement(getDatabaseType());
-        result.setIfNotExists(null != ctx.ifNotExists());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.getColumns().addAll(((CollectionValue<ColumnSegment>) 
visit(ctx.indexParams())).getValue());
+        SimpleTableSegment table = (SimpleTableSegment) visit(ctx.tableName());
+        Collection<ColumnSegment> columns = ((CollectionValue<ColumnSegment>) 
visit(ctx.indexParams())).getValue();
         if (null == ctx.indexName()) {
-            
result.setAnonymousIndexStartIndex(ctx.ON().getSymbol().getStartIndex() - 1);
-        } else {
-            result.setIndex((IndexSegment) visit(ctx.indexName()));
+            return CreateIndexStatement.builder()
+                    .databaseType(getDatabaseType())
+                    .ifNotExists(null != ctx.ifNotExists())
+                    .table(table)
+                    .columns(columns)
+                    
.anonymousIndexStartIndex(ctx.ON().getSymbol().getStartIndex() - 1)
+                    .build();
         }
-        return result;
+        return CreateIndexStatement.builder()
+                .databaseType(getDatabaseType())
+                .ifNotExists(null != ctx.ifNotExists())
+                .table(table)
+                .columns(columns)
+                .index((IndexSegment) visit(ctx.indexName()))
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index 99c03b51f0e..ae54a81b4cd 100644
--- 
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -829,16 +829,17 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     @SuppressWarnings({"rawtypes", "unchecked"})
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
-        CreateIndexStatement result = new 
CreateIndexStatement(getDatabaseType());
+        SimpleTableSegment table = null;
+        Collection<ColumnSegment> columns = Collections.emptyList();
         if (null != ctx.createIndexDefinitionClause().tableIndexClause()) {
-            result.setTable((SimpleTableSegment) 
visit(ctx.createIndexDefinitionClause().tableIndexClause().tableName()));
-            result.getColumns().addAll(((CollectionValue) 
visit(ctx.createIndexDefinitionClause().tableIndexClause().indexExpressions())).getValue());
+            table = (SimpleTableSegment) 
visit(ctx.createIndexDefinitionClause().tableIndexClause().tableName());
+            columns = ((CollectionValue) 
visit(ctx.createIndexDefinitionClause().tableIndexClause().indexExpressions())).getValue();
         }
-        result.setIndex((IndexSegment) visit(ctx.indexName()));
+        IndexSegment index = (IndexSegment) visit(ctx.indexName());
         if (null != ctx.createIndexSpecification() && null != 
ctx.createIndexSpecification().UNIQUE()) {
-            result.getIndex().setUniqueKey(true);
+            index.setUniqueKey(true);
         }
-        return result;
+        return 
CreateIndexStatement.builder().databaseType(getDatabaseType()).table(table).columns(columns).index(index).build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
index 768b864623c..61ac1cc8042 100644
--- 
a/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java
@@ -674,16 +674,24 @@ public final class PostgreSQLDDLStatementVisitor extends 
PostgreSQLStatementVisi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
-        CreateIndexStatement result = new 
CreateIndexStatement(getDatabaseType());
-        result.setIfNotExists(null != ctx.ifNotExists());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.getColumns().addAll(((CollectionValue<ColumnSegment>) 
visit(ctx.indexParams())).getValue());
-        if (null != ctx.indexName()) {
-            result.setIndex((IndexSegment) visit(ctx.indexName()));
-        } else {
-            
result.setAnonymousIndexStartIndex(ctx.ON().getSymbol().getStartIndex() - 1);
+        SimpleTableSegment table = (SimpleTableSegment) visit(ctx.tableName());
+        Collection<ColumnSegment> columns = ((CollectionValue<ColumnSegment>) 
visit(ctx.indexParams())).getValue();
+        if (null == ctx.indexName()) {
+            return CreateIndexStatement.builder()
+                    .databaseType(getDatabaseType())
+                    .ifNotExists(null != ctx.ifNotExists())
+                    .table(table)
+                    .columns(columns)
+                    
.anonymousIndexStartIndex(ctx.ON().getSymbol().getStartIndex() - 1)
+                    .build();
         }
-        return result;
+        return CreateIndexStatement.builder()
+                .databaseType(getDatabaseType())
+                .ifNotExists(null != ctx.ifNotExists())
+                .table(table)
+                .columns(columns)
+                .index((IndexSegment) visit(ctx.indexName()))
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
index a9137d08bd2..a5a19abba04 100644
--- 
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java
@@ -328,11 +328,12 @@ public final class SQLServerDDLStatementVisitor extends 
SQLServerStatementVisito
     @SuppressWarnings({"rawtypes", "unchecked"})
     @Override
     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
-        CreateIndexStatement result = new 
CreateIndexStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setIndex((IndexSegment) visit(ctx.indexName()));
-        result.getColumns().addAll(((CollectionValue) 
visit(ctx.columnNamesWithSort())).getValue());
-        return result;
+        return CreateIndexStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .index((IndexSegment) visit(ctx.indexName()))
+                .columns(((CollectionValue) 
visit(ctx.columnNamesWithSort())).getValue())
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/index/CreateIndexStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/index/CreateIndexStatement.java
index 621959c10ce..2a75813a86a 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/index/CreateIndexStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/index/CreateIndexStatement.java
@@ -17,8 +17,8 @@
 
 package 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index;
 
+import lombok.Builder;
 import lombok.Getter;
-import lombok.Setter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
@@ -43,33 +43,46 @@ import java.util.stream.Collectors;
  * Create index statement.
  */
 @Getter
-@Setter
 public final class CreateIndexStatement extends DDLStatement {
     
-    private IndexSegment index;
+    private final IndexSegment index;
     
-    private SimpleTableSegment table;
+    private final SimpleTableSegment table;
     
-    private boolean ifNotExists;
+    private final boolean ifNotExists;
     
-    private Integer anonymousIndexStartIndex;
+    private final Integer anonymousIndexStartIndex;
     
-    private AlgorithmTypeSegment algorithmType;
+    private final AlgorithmTypeSegment algorithmType;
     
-    private LockTableSegment lockTable;
+    private final LockTableSegment lockTable;
     
-    private final Collection<ColumnSegment> columns = new LinkedList<>();
+    private final Collection<ColumnSegment> columns;
     
-    private String indexType;
+    private final String indexType;
     
-    private PropertiesSegment properties;
+    private final PropertiesSegment properties;
     
-    private String comment;
+    private final String comment;
     
-    private SQLStatementAttributes attributes;
+    private final SQLStatementAttributes attributes;
     
-    public CreateIndexStatement(final DatabaseType databaseType) {
+    @Builder
+    private CreateIndexStatement(final DatabaseType databaseType, final 
IndexSegment index, final SimpleTableSegment table, final boolean ifNotExists,
+                                 final Integer anonymousIndexStartIndex, final 
AlgorithmTypeSegment algorithmType, final LockTableSegment lockTable,
+                                 final Collection<ColumnSegment> columns, 
final String indexType, final PropertiesSegment properties, final String 
comment) {
         super(databaseType);
+        this.index = index;
+        this.table = table;
+        this.ifNotExists = ifNotExists;
+        this.anonymousIndexStartIndex = anonymousIndexStartIndex;
+        this.algorithmType = algorithmType;
+        this.lockTable = lockTable;
+        this.columns = null == columns ? new LinkedList<>() : new 
LinkedList<>(columns);
+        this.indexType = indexType;
+        this.properties = properties;
+        this.comment = comment;
+        attributes = new SQLStatementAttributes(new 
TableSQLStatementAttribute(table), new CreateIndexIndexSQLStatementAttribute());
     }
     
     /**
@@ -101,7 +114,6 @@ public final class CreateIndexStatement extends 
DDLStatement {
     
     @Override
     public void buildAttributes() {
-        attributes = new SQLStatementAttributes(new 
TableSQLStatementAttribute(table), new CreateIndexIndexSQLStatementAttribute());
     }
     
     private class CreateIndexIndexSQLStatementAttribute implements 
IndexSQLStatementAttribute {


Reply via email to