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 94098956652 Refactor constructor of CreateTableStatement to empty 
buildAttributes (#38319)
94098956652 is described below

commit 94098956652dddc9a1bf00501457a5b8c136414b
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Mar 3 21:56:52 2026 +0800

    Refactor constructor of CreateTableStatement to empty buildAttributes 
(#38319)
    
    * Refactor constructor of CreateTableStatement to empty buildAttributes
    
    * Refactor constructor of CreateTableStatement to empty buildAttributes
---
 .../ddl/EncryptCreateTableTokenGeneratorTest.java  | 12 +++---
 ...ShardingCreateFunctionSupportedCheckerTest.java |  3 +-
 ...hardingCreateProcedureSupportedCheckerTest.java |  6 ++-
 .../ShardingCreateTableSupportedCheckerTest.java   | 16 ++++----
 ...ShardingCreateTableRouteContextCheckerTest.java | 27 +++++++------
 .../statement/ddl/CreateTableStatementBinder.java  | 21 +++++-----
 .../single/route/SingleSQLRouterTest.java          | 10 ++---
 .../single/route/engine/SingleRouteEngineTest.java |  4 +-
 .../transaction/util/AutoCommitUtilsTest.java      |  2 +-
 .../CreateTablePushDownMetaDataRefresherTest.java  | 12 ++++--
 .../statement/type/DorisDDLStatementVisitor.java   | 33 +++++++++++-----
 .../type/FirebirdDDLStatementVisitor.java          | 17 +++++---
 .../statement/type/HiveDDLStatementVisitor.java    | 17 +++++---
 .../statement/type/MySQLDDLStatementVisitor.java   | 25 ++++++------
 .../type/OpenGaussDDLStatementVisitor.java         | 17 +++++---
 .../statement/type/OracleDDLStatementVisitor.java  | 15 +++++---
 .../type/PostgreSQLDDLStatementVisitor.java        | 17 +++++---
 .../statement/type/PrestoDDLStatementVisitor.java  | 20 +++++++---
 .../statement/type/SQL92DDLStatementVisitor.java   | 17 +++++---
 .../statement/SQLServerStatementVisitor.java       | 18 ++++-----
 .../type/SQLServerDDLStatementVisitor.java         | 15 +++++---
 .../type/ddl/index/CreateIndexStatement.java       |  3 +-
 .../type/ddl/table/CreateTableStatement.java       | 45 ++++++++++++++--------
 .../backend/connector/ProxySQLExecutorTest.java    |  7 ++--
 24 files changed, 234 insertions(+), 145 deletions(-)

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 4e618a26020..65c69bd489f 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
@@ -41,6 +41,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 
 import static org.hamcrest.Matchers.is;
@@ -108,10 +109,11 @@ class EncryptCreateTableTokenGeneratorTest {
     }
     
     private CreateTableStatement createCreateTableStatement() {
-        CreateTableStatement result = new CreateTableStatement(databaseType);
-        result.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_encrypt"))));
-        result.getColumnDefinitions().add(new ColumnDefinitionSegment(25, 78, 
new ColumnSegment(25, 42, new IdentifierValue("certificate_number")), new 
DataTypeSegment(), false, false, ""));
-        result.buildAttributes();
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_encrypt"))))
+                .columnDefinitions(Collections.singleton(
+                        new ColumnDefinitionSegment(25, 78, new 
ColumnSegment(25, 42, new IdentifierValue("certificate_number")), new 
DataTypeSegment(), false, false, "")))
+                .build();
     }
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
index 5e9ed48959d..2ce0322d354 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
@@ -119,9 +119,8 @@ class ShardingCreateFunctionSupportedCheckerTest {
     
     @Test
     void assertCheckCreateFunctionWithTableExists() {
-        CreateTableStatement createTableStatement = new 
CreateTableStatement(databaseType);
         SimpleTableSegment table = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("foo_tbl")));
-        createTableStatement.setTable(table);
+        CreateTableStatement createTableStatement = 
CreateTableStatement.builder().databaseType(databaseType).table(table).build();
         ValidStatementSegment validStatementSegment = new 
ValidStatementSegment(0, 0);
         validStatementSegment.setSqlStatement(createTableStatement);
         RoutineBodySegment routineBody = new RoutineBodySegment(0, 0);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java
index 0ac6ad8eea0..59adaf94d44 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java
@@ -111,8 +111,10 @@ class ShardingCreateProcedureSupportedCheckerTest {
     
     @Test
     void assertCheckWithTableExists() {
-        CreateTableStatement createTableStatement = new 
CreateTableStatement(databaseType);
-        createTableStatement.setTable(new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("foo_tbl"))));
+        CreateTableStatement createTableStatement = 
CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("foo_tbl"))))
+                .build();
         ValidStatementSegment validStatementSegment = new 
ValidStatementSegment(0, 0);
         validStatementSegment.setSqlStatement(createTableStatement);
         RoutineBodySegment routineBody = new RoutineBodySegment(0, 0);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java
index 59228b7d045..9d5214237f5 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java
@@ -48,9 +48,10 @@ class ShardingCreateTableSupportedCheckerTest {
     
     @Test
     void assertCheck() {
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 
2, new IdentifierValue("foo_tbl"))));
-        sqlStatement.buildAttributes();
+        CreateTableStatement sqlStatement = CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(1, 2, new 
IdentifierValue("foo_tbl"))))
+                .build();
         assertThrows(TableExistsException.class, () -> 
assertCheck(sqlStatement));
     }
     
@@ -64,10 +65,11 @@ class ShardingCreateTableSupportedCheckerTest {
     
     @Test
     void assertCheckIfNotExists() {
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
-        sqlStatement.setIfNotExists(true);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 
2, new IdentifierValue("foo_tbl"))));
-        sqlStatement.buildAttributes();
+        CreateTableStatement sqlStatement = CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .ifNotExists(true)
+                .table(new SimpleTableSegment(new TableNameSegment(1, 2, new 
IdentifierValue("foo_tbl"))))
+                .build();
         assertCheckIfNotExists(sqlStatement);
     }
     
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java
index cc795dc6494..4db6d6845ba 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java
@@ -68,31 +68,33 @@ class ShardingCreateTableRouteContextCheckerTest {
     
     @Test
     void assertCheckWithSameRouteResultShardingTableForPostgreSQL() {
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
-        sqlStatement.setIfNotExists(false);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.buildAttributes();
         when(shardingRule.isShardingTable("t_order")).thenReturn(true);
         when(shardingRule.getShardingTable("t_order")).thenReturn(new 
ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order"));
         Collection<RouteUnit> routeUnits = new LinkedList<>();
         routeUnits.add(new RouteUnit(new RouteMapper("ds_0", "ds_0"), 
Collections.singletonList(new RouteMapper("t_order", "t_order_0"))));
         routeUnits.add(new RouteUnit(new RouteMapper("ds_1", "ds_1"), 
Collections.singletonList(new RouteMapper("t_order", "t_order_0"))));
         when(routeContext.getRouteUnits()).thenReturn(routeUnits);
+        CreateTableStatement sqlStatement = CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .ifNotExists(false)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .build();
         when(queryContext.getSqlStatementContext()).thenReturn(new 
CommonSQLStatementContext(sqlStatement));
         assertDoesNotThrow(() -> new 
ShardingCreateTableRouteContextChecker().check(shardingRule, queryContext, 
database, mock(ConfigurationProperties.class), routeContext));
     }
     
     @Test
     void assertCheckWithDifferentRouteResultShardingTableForPostgreSQL() {
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
-        sqlStatement.setIfNotExists(false);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_order"))));
-        sqlStatement.buildAttributes();
         when(shardingRule.isShardingTable("t_order")).thenReturn(true);
         when(shardingRule.getShardingTable("t_order")).thenReturn(new 
ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order"));
         Collection<RouteUnit> routeUnits = new LinkedList<>();
         routeUnits.add(new RouteUnit(new RouteMapper("ds_0", "ds_0"), 
Collections.singletonList(new RouteMapper("t_order", "t_order_0"))));
         when(routeContext.getRouteUnits()).thenReturn(routeUnits);
+        CreateTableStatement sqlStatement = CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .ifNotExists(false)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .build();
         when(queryContext.getSqlStatementContext()).thenReturn(new 
CommonSQLStatementContext(sqlStatement));
         assertThrows(ShardingDDLRouteException.class,
                 () -> new 
ShardingCreateTableRouteContextChecker().check(shardingRule, queryContext, 
database, mock(ConfigurationProperties.class), routeContext));
@@ -100,10 +102,11 @@ class ShardingCreateTableRouteContextCheckerTest {
     
     @Test
     void assertCheckWithSameRouteResultBroadcastTableForPostgreSQL() {
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
-        sqlStatement.setIfNotExists(false);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("t_config"))));
-        sqlStatement.buildAttributes();
+        CreateTableStatement sqlStatement = CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .ifNotExists(false)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_config"))))
+                .build();
         when(queryContext.getSqlStatementContext()).thenReturn(new 
CommonSQLStatementContext(sqlStatement));
         assertDoesNotThrow(() -> new 
ShardingCreateTableRouteContextChecker().check(shardingRule, queryContext, 
database, mock(ConfigurationProperties.class), routeContext));
     }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java
index 3469fdac576..8ed38d0850f 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java
@@ -52,15 +52,18 @@ public final class CreateTableStatementBinder implements 
SQLStatementBinder<Crea
     
     private CreateTableStatement copy(final CreateTableStatement sqlStatement,
                                       final SimpleTableSegment boundTable, 
final SelectStatement boundSelectStatement, final 
Collection<ColumnDefinitionSegment> boundColumnDefinitions) {
-        CreateTableStatement result = new 
CreateTableStatement(sqlStatement.getDatabaseType());
-        result.setTable(boundTable);
-        result.setSelectStatement(boundSelectStatement);
-        result.getColumnDefinitions().addAll(boundColumnDefinitions);
-        
result.getConstraintDefinitions().addAll(sqlStatement.getConstraintDefinitions());
-        result.setIfNotExists(sqlStatement.isIfNotExists());
-        result.getColumns().addAll(sqlStatement.getColumns());
-        sqlStatement.getLikeTable().ifPresent(result::setLikeTable);
-        
sqlStatement.getCreateTableOption().ifPresent(result::setCreateTableOption);
+        CreateTableStatement result = CreateTableStatement.builder()
+                .databaseType(sqlStatement.getDatabaseType())
+                .table(boundTable)
+                .selectStatement(boundSelectStatement)
+                .ifNotExists(sqlStatement.isIfNotExists())
+                .likeTable(sqlStatement.getLikeTable().orElse(null))
+                
.createTableOption(sqlStatement.getCreateTableOption().orElse(null))
+                .columnDefinitions(boundColumnDefinitions)
+                .constraintDefinitions(sqlStatement.getConstraintDefinitions())
+                .columns(sqlStatement.getColumns())
+                .rollups(sqlStatement.getRollups())
+                .build();
         SQLStatementCopyUtils.copyAttributes(sqlStatement, result);
         return result;
     }
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
index b4d26bcfb83..3b76bcb3211 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
@@ -134,7 +134,7 @@ class SingleSQLRouterTest {
     
     @Test
     void assertCreateRouteContextWithDistributedTable() {
-        QueryContext queryContext = mockQueryContext(new 
CreateTableStatement(databaseType));
+        QueryContext queryContext = 
mockQueryContext(CreateTableStatement.builder().databaseType(databaseType).build());
         ShardingSphereDatabase database = 
mockDatabaseWithDistributedTables(Collections.singleton("foo_tbl"));
         SingleRule rule = mock(SingleRule.class);
         when(rule.getQualifiedTables(queryContext.getSqlStatementContext(), 
database)).thenReturn(Collections.singletonList(new QualifiedTable("foo_db", 
"foo_tbl")));
@@ -205,7 +205,7 @@ class SingleSQLRouterTest {
     
     @Test
     void assertDecorateRouteContextWithDistributedTable() {
-        QueryContext queryContext = mockQueryContext(new 
CreateTableStatement(databaseType));
+        QueryContext queryContext = 
mockQueryContext(CreateTableStatement.builder().databaseType(databaseType).build());
         ShardingSphereDatabase database = 
mockDatabaseWithDistributedTables(Collections.singleton("foo_tbl"));
         SingleRule rule = mock(SingleRule.class);
         SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
@@ -292,16 +292,14 @@ class SingleSQLRouterTest {
     }
     
     private QueryContext createQueryContext() {
-        CreateTableStatement createTableStatement = new 
CreateTableStatement(databaseType);
         TableNameSegment tableNameSegment = new TableNameSegment(1, 2, new 
IdentifierValue("foo_tbl"));
         tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema")));
-        createTableStatement.setTable(new 
SimpleTableSegment(tableNameSegment));
-        createTableStatement.buildAttributes();
         ConnectionContext connectionContext = mock(ConnectionContext.class);
         
when(connectionContext.getCurrentDatabaseName()).thenReturn(Optional.of("foo_db"));
         ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
         when(metaData.containsDatabase("foo_db")).thenReturn(true);
         
when(metaData.getDatabase("foo_db")).thenReturn(mock(ShardingSphereDatabase.class));
-        return new QueryContext(new 
CommonSQLStatementContext(createTableStatement), "CREATE TABLE", 
Collections.emptyList(), new HintValueContext(), connectionContext, metaData);
+        return new QueryContext(new 
CommonSQLStatementContext(CreateTableStatement.builder().databaseType(databaseType).table(new
 SimpleTableSegment(tableNameSegment)).build()),
+                "CREATE TABLE", Collections.emptyList(), new 
HintValueContext(), connectionContext, metaData);
     }
 }
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
index eb012d5dd0f..78a8e44943f 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
@@ -95,7 +95,7 @@ class SingleRouteEngineTest {
     
     @Test
     void assertRouteWithoutSingleRule() throws SQLException {
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
+        CreateTableStatement sqlStatement = 
CreateTableStatement.builder().databaseType(databaseType).build();
         SingleRouteEngine engine = new SingleRouteEngine(Arrays.asList(new 
QualifiedTable("foo_db", "t_order"), new QualifiedTable("foo_db", 
"t_order_item")), sqlStatement, mock());
         SingleRule singleRule = new SingleRule(new SingleRuleConfiguration(), 
"foo_db", mock(), createDataSourceMap(), Collections.emptyList());
         RouteContext routeContext = new RouteContext();
@@ -112,7 +112,7 @@ class SingleRouteEngineTest {
     
     @Test
     void assertRouteWithDefaultSingleRule() throws SQLException {
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
+        CreateTableStatement sqlStatement = 
CreateTableStatement.builder().databaseType(databaseType).build();
         SingleRouteEngine engine = new SingleRouteEngine(Arrays.asList(new 
QualifiedTable("foo_db", "t_order"), new QualifiedTable("foo_db", 
"t_order_item")), sqlStatement, mock());
         SingleRule singleRule = new SingleRule(new 
SingleRuleConfiguration(Collections.emptyList(), "ds_0"), "foo_db", mock(), 
createDataSourceMap(), Collections.emptyList());
         RouteContext routeContext = new RouteContext();
diff --git 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java
 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java
index 4b5a4c65907..a63dc8a47de 100644
--- 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java
+++ 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java
@@ -36,7 +36,7 @@ class AutoCommitUtilsTest {
     
     @Test
     void assertIsNeedStartTransactionWithDDL() {
-        assertTrue(AutoCommitUtils.isNeedStartTransaction(new 
CreateTableStatement(databaseType)));
+        
assertTrue(AutoCommitUtils.isNeedStartTransaction(CreateTableStatement.builder().databaseType(databaseType).build()));
     }
     
     @Test
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/table/CreateTablePushDownMetaDataRefresherTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/table/CreateTablePushDownMetaDataRefresherTest.java
index a1df103f303..655c696c9c8 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/table/CreateTablePushDownMetaDataRefresherTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/type/table/CreateTablePushDownMetaDataRefresherTest.java
@@ -74,8 +74,10 @@ class CreateTablePushDownMetaDataRefresherTest {
         when(rule.getAttributes()).thenReturn(new 
RuleAttributes(mutableDataNodeRuleAttribute));
         ShardingSphereDatabase database = new ShardingSphereDatabase(
                 "foo_db", databaseType, new 
ResourceMetaData(Collections.emptyMap()), new 
RuleMetaData(Collections.singleton(rule)), Collections.emptyList());
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("foo_tbl"))));
+        CreateTableStatement sqlStatement = CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("foo_tbl"))))
+                .build();
         
when(TableRefreshUtils.getTableName(sqlStatement.getTable().getTableName().getIdentifier(),
 databaseType)).thenReturn("foo_tbl");
         when(TableRefreshUtils.isSingleTable("foo_tbl", 
database)).thenReturn(true);
         ShardingSphereTable loadedTable = new ShardingSphereTable("foo_tbl", 
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
@@ -94,8 +96,10 @@ class CreateTablePushDownMetaDataRefresherTest {
                 "foo_schema", new ShardingSphereSchema("foo_schema", 
databaseType, Collections.singleton(loadedTable), Collections.emptyList()));
         ShardingSphereDatabase database = new ShardingSphereDatabase(
                 "foo_db", databaseType, new 
ResourceMetaData(Collections.emptyMap()), new 
RuleMetaData(Collections.emptyList()), Collections.emptyList());
-        CreateTableStatement sqlStatement = new 
CreateTableStatement(databaseType);
-        sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 
0, new IdentifierValue("foo_tbl"))));
+        CreateTableStatement sqlStatement = CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("foo_tbl"))))
+                .build();
         
when(TableRefreshUtils.getTableName(sqlStatement.getTable().getTableName().getIdentifier(),
 databaseType)).thenReturn("foo_tbl");
         
when(GenericSchemaBuilder.build(eq(Collections.singletonList("foo_tbl")), 
eq(database.getProtocolType()), any())).thenReturn(schemas);
         refresher.refresh(metaDataManagerPersistService, database, "logic_ds", 
"foo_schema", databaseType, sqlStatement, new ConfigurationProperties(new 
Properties()));
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 40b7d285778..425fecd80a3 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
@@ -548,34 +548,47 @@ public final class DorisDDLStatementVisitor extends 
DorisStatementVisitor implem
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setIfNotExists(null != ctx.ifNotExists());
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
+        SimpleTableSegment likeTable = null;
+        Collection<RollupSegment> rollups = new LinkedList<>();
         if (null != ctx.createLikeClause()) {
-            result.setLikeTable((SimpleTableSegment) 
visit(ctx.createLikeClause()));
+            likeTable = (SimpleTableSegment) visit(ctx.createLikeClause());
             for (IdentifierContext each : ctx.createLikeClause().identifier()) 
{
-                result.getRollups().add(new 
RollupSegment(each.getStart().getStartIndex(), each.getStop().getStopIndex(), 
new IdentifierValue(each.getText())));
+                rollups.add(new RollupSegment(each.getStart().getStartIndex(), 
each.getStop().getStopIndex(), new IdentifierValue(each.getText())));
             }
         }
+        CreateTableOptionSegment createTableOption = null;
         if (null != ctx.createTableOptions()) {
-            result.setCreateTableOption((CreateTableOptionSegment) 
visit(ctx.createTableOptions()));
+            createTableOption = (CreateTableOptionSegment) 
visit(ctx.createTableOptions());
         }
+        SelectStatement selectStatement = null;
         // DORIS ADDED BEGIN
         if (null != ctx.duplicateAsQueryExpression()) {
-            result.setSelectStatement((SelectStatement) 
visit(ctx.duplicateAsQueryExpression().select()));
+            selectStatement = (SelectStatement) 
visit(ctx.duplicateAsQueryExpression().select());
         }
         // DORIS ADDED END
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .ifNotExists(null != ctx.ifNotExists())
+                .likeTable(likeTable)
+                .createTableOption(createTableOption)
+                .selectStatement(selectStatement)
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .rollups(rollups)
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java
index c7cdde99624..921e6a657e9 100644
--- 
a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/type/FirebirdDDLStatementVisitor.java
@@ -82,7 +82,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tr
 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 Firebird.
@@ -96,19 +98,24 @@ public final class FirebirdDDLStatementVisitor extends 
FirebirdStatementVisitor
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .build();
     }
     
     @Override
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 3e728558e45..427d4a32197 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
@@ -178,20 +178,25 @@ public final class HiveDDLStatementVisitor extends 
HiveStatementVisitor implemen
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) 
visit(ctx.createTableCommonClause().tableNameWithDb()));
-        result.setIfNotExists(null != 
ctx.createTableCommonClause().ifNotExists());
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) 
visit(ctx.createTableCommonClause().tableNameWithDb()))
+                .ifNotExists(null != 
ctx.createTableCommonClause().ifNotExists())
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .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 cf791439253..2b8e07bd73d 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
@@ -271,26 +271,27 @@ public final class MySQLDDLStatementVisitor extends 
MySQLStatementVisitor implem
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setIfNotExists(null != ctx.ifNotExists());
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        if (null != ctx.createLikeClause()) {
-            result.setLikeTable((SimpleTableSegment) 
visit(ctx.createLikeClause()));
-        }
-        if (null != ctx.createTableOptions()) {
-            result.setCreateTableOption((CreateTableOptionSegment) 
visit(ctx.createTableOptions()));
-        }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .ifNotExists(null != ctx.ifNotExists())
+                .likeTable(null == ctx.createLikeClause() ? null : 
(SimpleTableSegment) visit(ctx.createLikeClause()))
+                .createTableOption(null == ctx.createTableOptions() ? null : 
(CreateTableOptionSegment) visit(ctx.createTableOptions()))
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .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 fdf42cbaccf..36ee41aa014 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
@@ -269,20 +269,25 @@ public final class OpenGaussDDLStatementVisitor extends 
OpenGaussStatementVisito
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setIfNotExists(null != ctx.ifNotExists());
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .ifNotExists(null != ctx.ifNotExists())
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .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 ae54a81b4cd..5844f180b22 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
@@ -390,19 +390,24 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .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 61ac1cc8042..724815e666e 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
@@ -346,20 +346,25 @@ public final class PostgreSQLDDLStatementVisitor extends 
PostgreSQLStatementVisi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setIfNotExists(null != ctx.ifNotExists());
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .ifNotExists(null != ctx.ifNotExists())
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
 
b/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
index d29cda81dd9..19907b519f8 100644
--- 
a/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDDLStatementVisitor.java
@@ -49,6 +49,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.LinkedList;
+
 /**
  * DDL statement visitor for Presto.
  */
@@ -80,20 +83,25 @@ public final class PrestoDDLStatementVisitor extends 
PrestoStatementVisitor impl
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
-        result.setIfNotExists(null != ctx.ifNotExists());
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .ifNotExists(null != ctx.ifNotExists())
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
 
b/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
index 01bf4eff3d7..9e4a1ef7868 100644
--- 
a/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/type/SQL92DDLStatementVisitor.java
@@ -58,7 +58,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.ta
 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 SQL92.
@@ -72,19 +74,24 @@ public final class SQL92DDLStatementVisitor extends 
SQL92StatementVisitor implem
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTable(final CreateTableContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         if (null != ctx.createDefinitionClause()) {
             CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
                 if (each instanceof ColumnDefinitionSegment) {
-                    
result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
+                    columnDefinitions.add((ColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
-                    
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                    constraintDefinitions.add((ConstraintDefinitionSegment) 
each);
                 }
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .build();
     }
     
     @Override
diff --git 
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
 
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index 9578e7686f4..531bb9b5c66 100644
--- 
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -2097,21 +2097,21 @@ public abstract class SQLServerStatementVisitor extends 
SQLServerStatementBaseVi
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTableAsSelectClause(final 
CreateTableAsSelectClauseContext ctx) {
-        CreateTableStatement result = new CreateTableStatement(databaseType);
+        SimpleTableSegment table;
+        SelectStatement selectStatement;
+        List<ColumnSegment> columns = new LinkedList<>();
         if (null != ctx.createTableAsSelect()) {
-            result.setTable((SimpleTableSegment) 
visit(ctx.createTableAsSelect().tableName()));
-            result.setSelectStatement((SelectStatement) 
visit(ctx.createTableAsSelect().select()));
+            table = (SimpleTableSegment) 
visit(ctx.createTableAsSelect().tableName());
+            selectStatement = (SelectStatement) 
visit(ctx.createTableAsSelect().select());
             if (null != ctx.createTableAsSelect().columnNames()) {
                 CollectionValue<ColumnSegment> columnSegments = 
(CollectionValue<ColumnSegment>) visit(ctx.createTableAsSelect().columnNames());
-                for (ColumnSegment each : columnSegments.getValue()) {
-                    result.getColumns().add(each);
-                }
+                columns.addAll(columnSegments.getValue());
             }
         } else {
-            result.setTable((SimpleTableSegment) 
visit(ctx.createRemoteTableAsSelect().tableName()));
-            result.setSelectStatement((SelectStatement) 
visit(ctx.createRemoteTableAsSelect().select()));
+            table = (SimpleTableSegment) 
visit(ctx.createRemoteTableAsSelect().tableName());
+            selectStatement = (SelectStatement) 
visit(ctx.createRemoteTableAsSelect().select());
         }
-        return result;
+        return 
CreateTableStatement.builder().databaseType(databaseType).table(table).selectStatement(selectStatement).columns(columns).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 a5a19abba04..3f5d560acaf 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
@@ -142,17 +142,22 @@ public final class SQLServerDDLStatementVisitor extends 
SQLServerStatementVisito
     @SuppressWarnings("unchecked")
     @Override
     public ASTNode visitCreateTableClause(final CreateTableClauseContext ctx) {
-        CreateTableStatement result = new 
CreateTableStatement(getDatabaseType());
-        result.setTable((SimpleTableSegment) visit(ctx.tableName()));
+        Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+        Collection<ConstraintDefinitionSegment> constraintDefinitions = new 
LinkedList<>();
         CollectionValue<CreateDefinitionSegment> createDefinitions = 
(CollectionValue<CreateDefinitionSegment>) 
generateCreateDefinitionSegment(ctx.createDefinitionClause().createTableDefinitions());
         for (CreateDefinitionSegment each : createDefinitions.getValue()) {
             if (each instanceof ColumnDefinitionSegment) {
-                result.getColumnDefinitions().add((ColumnDefinitionSegment) 
each);
+                columnDefinitions.add((ColumnDefinitionSegment) each);
             } else if (each instanceof ConstraintDefinitionSegment) {
-                
result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                constraintDefinitions.add((ConstraintDefinitionSegment) each);
             }
         }
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(getDatabaseType())
+                .table((SimpleTableSegment) visit(ctx.tableName()))
+                .columnDefinitions(columnDefinitions)
+                .constraintDefinitions(constraintDefinitions)
+                .build();
     }
     
     private ASTNode generateCreateDefinitionSegment(final 
CreateTableDefinitionsContext ctx) {
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 2a75813a86a..825b9720798 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
@@ -35,7 +35,6 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.Iden
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -78,7 +77,7 @@ public final class CreateIndexStatement extends DDLStatement {
         this.anonymousIndexStartIndex = anonymousIndexStartIndex;
         this.algorithmType = algorithmType;
         this.lockTable = lockTable;
-        this.columns = null == columns ? new LinkedList<>() : new 
LinkedList<>(columns);
+        this.columns = null == columns ? Collections.emptyList() : columns;
         this.indexType = indexType;
         this.properties = properties;
         this.comment = comment;
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
index eb5e4d2b371..f7d9253b77b 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
@@ -17,8 +17,8 @@
 
 package 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table;
 
+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.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintDefinitionSegment;
@@ -36,6 +36,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DD
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
@@ -45,31 +46,44 @@ import java.util.stream.Collectors;
  * Create table statement.
  */
 @Getter
-@Setter
 public final class CreateTableStatement extends DDLStatement {
     
-    private SimpleTableSegment table;
+    private final SimpleTableSegment table;
     
-    private SelectStatement selectStatement;
+    private final SelectStatement selectStatement;
     
-    private boolean ifNotExists;
+    private final boolean ifNotExists;
     
-    private SimpleTableSegment likeTable;
+    private final SimpleTableSegment likeTable;
     
-    private CreateTableOptionSegment createTableOption;
+    private final CreateTableOptionSegment createTableOption;
     
-    private final Collection<ColumnDefinitionSegment> columnDefinitions = new 
LinkedList<>();
+    private final Collection<ColumnDefinitionSegment> columnDefinitions;
     
-    private final Collection<ConstraintDefinitionSegment> 
constraintDefinitions = new LinkedList<>();
+    private final Collection<ConstraintDefinitionSegment> 
constraintDefinitions;
     
-    private final List<ColumnSegment> columns = new LinkedList<>();
+    private final List<ColumnSegment> columns;
     
-    private final Collection<RollupSegment> rollups = new LinkedList<>();
+    private final Collection<RollupSegment> rollups;
     
-    private SQLStatementAttributes attributes;
+    private final SQLStatementAttributes attributes;
     
-    public CreateTableStatement(final DatabaseType databaseType) {
+    @Builder
+    private CreateTableStatement(final DatabaseType databaseType, final 
SimpleTableSegment table, final SelectStatement selectStatement,
+                                 final boolean ifNotExists, final 
SimpleTableSegment likeTable, final CreateTableOptionSegment createTableOption,
+                                 final Collection<ColumnDefinitionSegment> 
columnDefinitions, final Collection<ConstraintDefinitionSegment> 
constraintDefinitions,
+                                 final List<ColumnSegment> columns, final 
Collection<RollupSegment> rollups) {
         super(databaseType);
+        this.table = table;
+        this.selectStatement = selectStatement;
+        this.ifNotExists = ifNotExists;
+        this.likeTable = likeTable;
+        this.createTableOption = createTableOption;
+        this.columnDefinitions = null == columnDefinitions ? 
Collections.emptyList() : columnDefinitions;
+        this.constraintDefinitions = null == constraintDefinitions ? 
Collections.emptyList() : constraintDefinitions;
+        this.columns = null == columns ? Collections.emptyList() : columns;
+        this.rollups = null == rollups ? Collections.emptyList() : rollups;
+        attributes = new SQLStatementAttributes(new 
TableSQLStatementAttribute(getTables()), new 
CreateTableConstraintSQLStatementAttribute(), new 
CreateTableIndexSQLStatementAttribute());
     }
     
     /**
@@ -101,12 +115,13 @@ public final class CreateTableStatement extends 
DDLStatement {
     
     @Override
     public void buildAttributes() {
-        attributes = new SQLStatementAttributes(new 
TableSQLStatementAttribute(getTables()), new 
CreateTableConstraintSQLStatementAttribute(), new 
CreateTableIndexSQLStatementAttribute());
     }
     
     private Collection<SimpleTableSegment> getTables() {
         Collection<SimpleTableSegment> result = new LinkedList<>();
-        result.add(table);
+        if (null != table) {
+            result.add(table);
+        }
         for (ColumnDefinitionSegment each : columnDefinitions) {
             result.addAll(each.getReferencedTables());
         }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
index 1720c6047f9..fc25c621a20 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
@@ -409,9 +409,10 @@ class ProxySQLExecutorTest {
     }
     
     private CreateTableStatement createCreateTableStatement(final DatabaseType 
databaseType) {
-        CreateTableStatement result = new CreateTableStatement(databaseType);
-        result.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))));
-        return result;
+        return CreateTableStatement.builder()
+                .databaseType(databaseType)
+                .table(new SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))
+                .build();
     }
     
     private TruncateStatement createTruncateStatement(final DatabaseType 
databaseType) {

Reply via email to