You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2023/06/03 01:58:47 UTC

[shardingsphere] branch master updated: Fix sonar issues on Provide multiple methods instead of using boolean value to determine which action to take (#26021)

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

panjuan 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 8bd1c9018a6 Fix sonar issues on Provide multiple methods instead of using boolean value to determine which action to take (#26021)
8bd1c9018a6 is described below

commit 8bd1c9018a65fdc482280314977d1c2bda4d9472
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sat Jun 3 09:58:38 2023 +0800

    Fix sonar issues on Provide multiple methods instead of using boolean value to determine which action to take (#26021)
---
 .../rule/ReadwriteSplittingDataSourceRule.java     | 22 ++++---
 .../rule/ReadwriteSplittingRule.java               |  6 +-
 ...dardReadwriteSplittingDataSourceRouterTest.java |  2 +-
 .../filter/DisabledReadDataSourcesFilterTest.java  | 14 ++--
 .../infra/instance/ComputeNodeInstance.java        |  6 +-
 .../infra/state/instance/InstanceStateContext.java | 20 +++---
 .../infra/state/InstanceStateContextTest.java      | 12 ++--
 .../shardingsphere/metadata/MetaDataFactory.java   | 75 ----------------------
 .../metadata/NewMetaDataFactory.java               | 75 ----------------------
 .../mode/manager/ContextManager.java               | 22 +++++--
 .../mode/metadata/MetaDataContextsFactory.java     | 69 ++++++--------------
 .../mode/metadata/NewMetaDataContextsFactory.java  | 67 ++++++-------------
 .../statement/type/MySQLDDLStatementVisitor.java   | 60 +++++++++--------
 13 files changed, 137 insertions(+), 313 deletions(-)

diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
index ddd6baf4e98..0cee8049a20 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
@@ -65,16 +65,20 @@ public final class ReadwriteSplittingDataSourceRule {
     }
     
     /**
-     * Update disabled data source names.
+     * Enable data source.
      *
-     * @param dataSourceName data source name
-     * @param isDisabled is disabled
+     * @param dataSourceName data source name to be enabled.
      */
-    public void updateDisabledDataSourceNames(final String dataSourceName, final boolean isDisabled) {
-        if (isDisabled) {
-            disabledDataSourceNames.add(dataSourceName);
-        } else {
-            disabledDataSourceNames.remove(dataSourceName);
-        }
+    public void enableDataSource(final String dataSourceName) {
+        disabledDataSourceNames.remove(dataSourceName);
+    }
+    
+    /**
+     * Disable data source.
+     *
+     * @param dataSourceName data source name to be disabled.
+     */
+    public void disableDataSource(final String dataSourceName) {
+        disabledDataSourceNames.add(dataSourceName);
     }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index 5cbb39a35d5..bb294161191 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -161,7 +161,11 @@ public final class ReadwriteSplittingRule implements DatabaseRule, DataSourceCon
         QualifiedDatabase qualifiedDatabase = dataSourceEvent.getQualifiedDatabase();
         ReadwriteSplittingDataSourceRule dataSourceRule = dataSourceRules.get(qualifiedDatabase.getGroupName());
         Preconditions.checkNotNull(dataSourceRule, "Can not find readwrite-splitting data source rule in database `%s`", qualifiedDatabase.getDatabaseName());
-        dataSourceRule.updateDisabledDataSourceNames(dataSourceEvent.getQualifiedDatabase().getDataSourceName(), DataSourceState.DISABLED == dataSourceEvent.getDataSource().getStatus());
+        if (DataSourceState.DISABLED == dataSourceEvent.getDataSource().getStatus()) {
+            dataSourceRule.disableDataSource(dataSourceEvent.getQualifiedDatabase().getDataSourceName());
+        } else {
+            dataSourceRule.enableDataSource(dataSourceEvent.getQualifiedDatabase().getDataSourceName());
+        }
     }
     
     @Override
diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/StandardReadwriteSplittingDataSourceRouterTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/StandardReadwriteSplittingDataSourceRouterTest.java
index 82b7c5e9120..51c9756bcd1 100644
--- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/StandardReadwriteSplittingDataSourceRouterTest.java
+++ b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/StandardReadwriteSplittingDataSourceRouterTest.java
@@ -47,7 +47,7 @@ class StandardReadwriteSplittingDataSourceRouterTest {
     
     @Test
     void assertRouteWithFilter() {
-        rule.updateDisabledDataSourceNames("read_ds_0", true);
+        rule.disableDataSource("read_ds_0");
         assertThat(new StandardReadwriteSplittingDataSourceRouter().route(rule), is("read_ds_1"));
     }
 }
diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/filter/DisabledReadDataSourcesFilterTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/filter/DisabledReadDataSourcesFilterTest.java
index c19122dd819..96e487d8e75 100644
--- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/filter/DisabledReadDataSourcesFilterTest.java
+++ b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/standard/filter/DisabledReadDataSourcesFilterTest.java
@@ -48,26 +48,26 @@ class DisabledReadDataSourcesFilterTest {
     
     @Test
     void assertGetReadDataSourceNamesWithDisabledDataSourceNames() {
-        rule.updateDisabledDataSourceNames("read_ds_0", true);
+        rule.disableDataSource("read_ds_0");
         assertThat(new DisabledReadDataSourcesFilter().filter(rule, Arrays.asList("read_ds_0", "read_ds_1")), is(Collections.singletonList("read_ds_1")));
     }
     
     @Test
-    void assertUpdateDisabledDataSourceNamesForDisabled() {
-        rule.updateDisabledDataSourceNames("read_ds_0", true);
+    void assertDisableDataSource() {
+        rule.disableDataSource("read_ds_0");
         assertThat(new DisabledReadDataSourcesFilter().filter(rule, Arrays.asList("read_ds_0", "read_ds_1")), is(Collections.singletonList("read_ds_1")));
     }
     
     @Test
-    void assertUpdateDisabledDataSourceNamesForEnabled() {
-        rule.updateDisabledDataSourceNames("read_ds_0", true);
-        rule.updateDisabledDataSourceNames("read_ds_0", false);
+    void assertEnableDataSource() {
+        rule.disableDataSource("read_ds_0");
+        rule.enableDataSource("read_ds_0");
         assertThat(new DisabledReadDataSourcesFilter().filter(rule, Arrays.asList("read_ds_0", "read_ds_1")), is(Arrays.asList("read_ds_0", "read_ds_1")));
     }
     
     @Test
     void assertGetEnabledReplicaDataSources() {
-        rule.updateDisabledDataSourceNames("read_ds_0", true);
+        rule.disableDataSource("read_ds_0");
         assertThat(new DisabledReadDataSourcesFilter().filter(rule, Arrays.asList("read_ds_0", "read_ds_1")), is(Collections.singletonList("read_ds_1")));
     }
 }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstance.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstance.java
index 24817cedc67..bb59e5d4f11 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstance.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstance.java
@@ -63,7 +63,11 @@ public final class ComputeNodeInstance {
      * @param status status
      */
     public void switchState(final String status) {
-        state.switchState(InstanceState.CIRCUIT_BREAK, InstanceState.CIRCUIT_BREAK.name().equals(status));
+        if (InstanceState.CIRCUIT_BREAK.name().equals(status)) {
+            state.switchToValidState(InstanceState.CIRCUIT_BREAK);
+        } else {
+            state.switchToInvalidState(InstanceState.CIRCUIT_BREAK);
+        }
     }
     
     /**
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/state/instance/InstanceStateContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/state/instance/InstanceStateContext.java
index 6b53f54e147..aeeb832c298 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/state/instance/InstanceStateContext.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/state/instance/InstanceStateContext.java
@@ -33,15 +33,19 @@ public final class InstanceStateContext {
      * Switch state.
      * 
      * @param state state
-     * @param on true if state is valid, false if not
      */
-    public void switchState(final InstanceState state, final boolean on) {
-        if (on) {
-            currentState.push(state);
-        } else {
-            if (getCurrentState() == state) {
-                recoverState();
-            }
+    public void switchToValidState(final InstanceState state) {
+        currentState.push(state);
+    }
+    
+    /**
+     * Switch state.
+     *
+     * @param state state
+     */
+    public void switchToInvalidState(final InstanceState state) {
+        if (getCurrentState() == state) {
+            recoverState();
         }
     }
     
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/state/InstanceStateContextTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/state/InstanceStateContextTest.java
index 9e841043fbf..15350297f53 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/state/InstanceStateContextTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/state/InstanceStateContextTest.java
@@ -30,23 +30,23 @@ class InstanceStateContextTest {
     
     @Test
     void assertSwitchStateWithCircuitBreakOn() {
-        instanceStateContext.switchState(InstanceState.CIRCUIT_BREAK, true);
+        instanceStateContext.switchToValidState(InstanceState.CIRCUIT_BREAK);
         assertThat(instanceStateContext.getCurrentState(), is(InstanceState.CIRCUIT_BREAK));
-        instanceStateContext.switchState(InstanceState.CIRCUIT_BREAK, false);
+        instanceStateContext.switchToInvalidState(InstanceState.CIRCUIT_BREAK);
     }
     
     @Test
     void assertSwitchStateWithCircuitBreakOff() {
-        instanceStateContext.switchState(InstanceState.CIRCUIT_BREAK, false);
+        instanceStateContext.switchToInvalidState(InstanceState.CIRCUIT_BREAK);
         assertThat(instanceStateContext.getCurrentState(), is(InstanceState.OK));
     }
     
     @Test
     void assertSwitchStateWithMultiState() {
-        instanceStateContext.switchState(InstanceState.CIRCUIT_BREAK, true);
-        instanceStateContext.switchState(InstanceState.LOCK, true);
+        instanceStateContext.switchToValidState(InstanceState.CIRCUIT_BREAK);
+        instanceStateContext.switchToValidState(InstanceState.LOCK);
         assertThat(instanceStateContext.getCurrentState(), is(InstanceState.LOCK));
-        instanceStateContext.switchState(InstanceState.LOCK, false);
+        instanceStateContext.switchToInvalidState(InstanceState.LOCK);
         assertThat(instanceStateContext.getCurrentState(), is(InstanceState.CIRCUIT_BREAK));
     }
 }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
deleted file mode 100644
index 6d160ac5cb5..00000000000
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.metadata;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.instance.InstanceContext;
-import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
-
-import java.sql.SQLException;
-import java.util.Map;
-
-/**
- * Meta data factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class MetaDataFactory {
-    
-    /**
-     * Create database meta data for governance center.
-     *
-     * @param databaseName database name
-     * @param internalLoadMetaData internal load meta data
-     * @param persistService meta data persist service
-     * @param databaseConfig database configuration
-     * @param props configuration properties
-     * @param instanceContext instance context
-     * @return database meta data
-     * @throws SQLException sql exception
-     */
-    public static ShardingSphereDatabase create(final String databaseName, final boolean internalLoadMetaData, final MetaDataBasedPersistService persistService,
-                                                final DatabaseConfiguration databaseConfig, final ConfigurationProperties props, final InstanceContext instanceContext) throws SQLException {
-        return internalLoadMetaData ? InternalMetaDataFactory.create(databaseName, persistService, databaseConfig, props, instanceContext)
-                : ExternalMetaDataFactory.create(databaseName, databaseConfig, props, instanceContext);
-    }
-    
-    /**
-     * Create database meta data for governance center.
-     *
-     * @param internalLoadMetaData internal load meta data
-     * @param persistService meta data persist service
-     * @param databaseConfigMap database configuration
-     * @param props configuration properties
-     * @param instanceContext instance context
-     * @return database meta data
-     * @throws SQLException sql exception
-     */
-    public static Map<String, ShardingSphereDatabase> create(final boolean internalLoadMetaData, final MetaDataPersistService persistService,
-                                                             final Map<String, DatabaseConfiguration> databaseConfigMap, final ConfigurationProperties props,
-                                                             final InstanceContext instanceContext) throws SQLException {
-        return internalLoadMetaData ? InternalMetaDataFactory.create(persistService, databaseConfigMap, props, instanceContext)
-                : ExternalMetaDataFactory.create(databaseConfigMap, props, instanceContext);
-    }
-}
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/NewMetaDataFactory.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/NewMetaDataFactory.java
deleted file mode 100644
index e7e39830398..00000000000
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/NewMetaDataFactory.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.metadata;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.instance.InstanceContext;
-import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.factory.NewInternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
-
-import java.sql.SQLException;
-import java.util.Map;
-
-/**
- * TODO replace the old implementation after meta data refactor completed
- * New meta data factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class NewMetaDataFactory {
-    
-    /**
-     * Create database meta data for governance center.
-     *
-     * @param databaseName database name
-     * @param internalLoadMetaData internal load meta data
-     * @param persistService meta data persist service
-     * @param databaseConfig database configuration
-     * @param props configuration properties
-     * @param instanceContext instance context
-     * @return database meta data
-     * @throws SQLException sql exception
-     */
-    public static ShardingSphereDatabase create(final String databaseName, final boolean internalLoadMetaData, final NewMetaDataPersistService persistService,
-                                                final DatabaseConfiguration databaseConfig, final ConfigurationProperties props, final InstanceContext instanceContext) throws SQLException {
-        return internalLoadMetaData ? NewInternalMetaDataFactory.create(databaseName, persistService, databaseConfig, props, instanceContext)
-                : ExternalMetaDataFactory.create(databaseName, databaseConfig, props, instanceContext);
-    }
-    
-    /**
-     * Create database meta data for governance center.
-     *
-     * @param internalLoadMetaData internal load meta data
-     * @param persistService meta data persist service
-     * @param databaseConfigMap database configuration
-     * @param props configuration properties
-     * @param instanceContext instance context
-     * @return database meta data
-     * @throws SQLException sql exception
-     */
-    public static Map<String, ShardingSphereDatabase> create(final boolean internalLoadMetaData, final NewMetaDataPersistService persistService,
-                                                             final Map<String, DatabaseConfiguration> databaseConfigMap, final ConfigurationProperties props,
-                                                             final InstanceContext instanceContext) throws SQLException {
-        return internalLoadMetaData ? NewInternalMetaDataFactory.create(persistService, databaseConfigMap, props, instanceContext)
-                : ExternalMetaDataFactory.create(databaseConfigMap, props, instanceContext);
-    }
-}
diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index d8268a65c3c..a940cf3b15a 100644
--- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -51,7 +51,8 @@ import org.apache.shardingsphere.infra.state.cluster.ClusterState;
 import org.apache.shardingsphere.infra.state.cluster.ClusterStateContext;
 import org.apache.shardingsphere.infra.yaml.data.pojo.YamlShardingSphereRowData;
 import org.apache.shardingsphere.infra.yaml.data.swapper.YamlShardingSphereRowDataSwapper;
-import org.apache.shardingsphere.metadata.MetaDataFactory;
+import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
 import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource;
@@ -372,6 +373,10 @@ public final class ContextManager implements AutoCloseable {
         return newMetaDataContexts(new ShardingSphereMetaData(changedDatabases, changedGlobalMetaData, props));
     }
     
+    private MetaDataContexts newMetaDataContexts(final ShardingSphereMetaData metaData) {
+        return new MetaDataContexts(metaDataContexts.get().getPersistService(), metaData);
+    }
+    
     /**
      * Create changed databases.
      * 
@@ -382,8 +387,8 @@ public final class ContextManager implements AutoCloseable {
      * @return ShardingSphere databases
      * @throws SQLException SQL exception
      */
-    public synchronized Map<String, ShardingSphereDatabase> createChangedDatabases(final String databaseName, final boolean internalLoadMetaData, final SwitchingResource switchingResource,
-                                                                                   final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
+    public synchronized Map<String, ShardingSphereDatabase> createChangedDatabases(final String databaseName, final boolean internalLoadMetaData,
+                                                                                   final SwitchingResource switchingResource, final Collection<RuleConfiguration> ruleConfigs) throws SQLException {
         if (null != switchingResource && !switchingResource.getNewDataSources().isEmpty()) {
             metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources().putAll(switchingResource.getNewDataSources());
         }
@@ -392,16 +397,19 @@ public final class ContextManager implements AutoCloseable {
                 : ruleConfigs;
         DatabaseConfiguration toBeCreatedDatabaseConfig =
                 new DataSourceProvidedDatabaseConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(), toBeCreatedRuleConfigs);
-        ShardingSphereDatabase changedDatabase = MetaDataFactory.create(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
-                internalLoadMetaData, metaDataContexts.get().getPersistService(), toBeCreatedDatabaseConfig, metaDataContexts.get().getMetaData().getProps(), instanceContext);
+        ShardingSphereDatabase changedDatabase = createChangedDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(), internalLoadMetaData,
+                metaDataContexts.get().getPersistService(), toBeCreatedDatabaseConfig, metaDataContexts.get().getMetaData().getProps(), instanceContext);
         Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(metaDataContexts.get().getMetaData().getDatabases());
         changedDatabase.getSchemas().putAll(newShardingSphereSchemas(changedDatabase));
         result.put(databaseName.toLowerCase(), changedDatabase);
         return result;
     }
     
-    private MetaDataContexts newMetaDataContexts(final ShardingSphereMetaData metaData) {
-        return new MetaDataContexts(metaDataContexts.get().getPersistService(), metaData);
+    private ShardingSphereDatabase createChangedDatabase(final String databaseName, final boolean internalLoadMetaData, final MetaDataBasedPersistService persistService,
+                                                         final DatabaseConfiguration databaseConfig, final ConfigurationProperties props, final InstanceContext instanceContext) throws SQLException {
+        return internalLoadMetaData
+                ? InternalMetaDataFactory.create(databaseName, persistService, databaseConfig, props, instanceContext)
+                : ExternalMetaDataFactory.create(databaseName, databaseConfig, props, instanceContext);
     }
     
     private Map<String, ShardingSphereSchema> newShardingSphereSchemas(final ShardingSphereDatabase database) {
diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
index 34e72b0ba15..51d51bfbc6d 100644
--- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
+++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
@@ -33,10 +33,11 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
-import org.apache.shardingsphere.metadata.MetaDataFactory;
-import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
+import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
+import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
@@ -46,7 +47,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Properties;
 import java.util.stream.Collectors;
 
 /**
@@ -80,37 +80,29 @@ public final class MetaDataContextsFactory {
      */
     public static MetaDataContexts create(final MetaDataPersistService persistService, final ContextManagerBuilderParameter param,
                                           final InstanceContext instanceContext, final Map<String, StorageNodeDataSource> storageNodes) throws SQLException {
-        boolean databaseMetaDataExisted = databaseMetaDataExisted(persistService);
-        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = getDatabaseConfigurations(databaseMetaDataExisted,
-                getDatabaseNames(instanceContext, param.getDatabaseConfigs(), persistService), param.getDatabaseConfigs(), persistService);
+        boolean isDatabaseMetaDataExisted = !persistService.getDatabaseMetaDataService().loadAllDatabaseNames().isEmpty();
+        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = isDatabaseMetaDataExisted
+                ? createEffectiveDatabaseConfigurations(getDatabaseNames(instanceContext, param.getDatabaseConfigs(), persistService), param.getDatabaseConfigs(), persistService)
+                : param.getDatabaseConfigs();
         checkDataSourceStates(effectiveDatabaseConfigs, storageNodes, param.isForce());
-        Collection<RuleConfiguration> globalRuleConfigs = getGlobalRuleConfigs(databaseMetaDataExisted, persistService, param.getGlobalRuleConfigs());
-        ConfigurationProperties props = getConfigurationProperties(databaseMetaDataExisted, persistService, param.getProps());
-        Map<String, ShardingSphereDatabase> databases = getDatabases(databaseMetaDataExisted, persistService, effectiveDatabaseConfigs, props, instanceContext);
+        Collection<RuleConfiguration> globalRuleConfigs = isDatabaseMetaDataExisted ? persistService.getGlobalRuleService().load() : param.getGlobalRuleConfigs();
+        ConfigurationProperties props = isDatabaseMetaDataExisted ? new ConfigurationProperties(persistService.getPropsService().load()) : new ConfigurationProperties(param.getProps());
+        Map<String, ShardingSphereDatabase> databases = isDatabaseMetaDataExisted
+                ? InternalMetaDataFactory.create(persistService, effectiveDatabaseConfigs, props, instanceContext)
+                : ExternalMetaDataFactory.create(effectiveDatabaseConfigs, props, instanceContext);
         ShardingSphereRuleMetaData globalMetaData = new ShardingSphereRuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props));
         MetaDataContexts result = new MetaDataContexts(persistService, new ShardingSphereMetaData(databases, globalMetaData, props));
-        persistDatabaseConfigurations(databaseMetaDataExisted, param, result);
-        persistMetaData(databaseMetaDataExisted, result);
+        if (!isDatabaseMetaDataExisted) {
+            persistDatabaseConfigurations(result, param);
+            persistMetaData(result);
+        }
         return result;
     }
     
-    private static boolean databaseMetaDataExisted(final MetaDataPersistService persistService) {
-        return !persistService.getDatabaseMetaDataService().loadAllDatabaseNames().isEmpty();
-    }
-    
     private static Collection<String> getDatabaseNames(final InstanceContext instanceContext, final Map<String, DatabaseConfiguration> databaseConfigs, final MetaDataPersistService persistService) {
         return instanceContext.getInstance().getMetaData() instanceof JDBCInstanceMetaData ? databaseConfigs.keySet() : persistService.getDatabaseMetaDataService().loadAllDatabaseNames();
     }
     
-    private static ConfigurationProperties getConfigurationProperties(final boolean databaseMetaDataExisted, final MetaDataPersistService persistService, final Properties props) {
-        return databaseMetaDataExisted ? new ConfigurationProperties(persistService.getPropsService().load()) : new ConfigurationProperties(props);
-    }
-    
-    private static Map<String, DatabaseConfiguration> getDatabaseConfigurations(final boolean databaseMetaDataExisted, final Collection<String> databaseNames,
-                                                                                final Map<String, DatabaseConfiguration> databaseConfigs, final MetaDataPersistService persistService) {
-        return databaseMetaDataExisted ? createEffectiveDatabaseConfigurations(databaseNames, databaseConfigs, persistService) : databaseConfigs;
-    }
-    
     private static Map<String, DatabaseConfiguration> createEffectiveDatabaseConfigurations(final Collection<String> databaseNames,
                                                                                             final Map<String, DatabaseConfiguration> databaseConfigs, final MetaDataPersistService persistService) {
         return databaseNames.stream().collect(
@@ -145,23 +137,6 @@ public final class MetaDataContextsFactory {
         return result;
     }
     
-    private static Collection<RuleConfiguration> getGlobalRuleConfigs(final boolean databaseMetaDataExisted, final MetaDataPersistService persistService,
-                                                                      final Collection<RuleConfiguration> globalRuleConfigs) {
-        return databaseMetaDataExisted ? persistService.getGlobalRuleService().load() : globalRuleConfigs;
-    }
-    
-    private static Map<String, ShardingSphereDatabase> getDatabases(final boolean databaseMetaDataExisted, final MetaDataPersistService persistService,
-                                                                    final Map<String, DatabaseConfiguration> databaseConfigMap, final ConfigurationProperties props,
-                                                                    final InstanceContext instanceContext) throws SQLException {
-        return MetaDataFactory.create(databaseMetaDataExisted, persistService, databaseConfigMap, props, instanceContext);
-    }
-    
-    private static void persistDatabaseConfigurations(final boolean databaseMetaDataExisted, final ContextManagerBuilderParameter param, final MetaDataContexts metadataContexts) {
-        if (!databaseMetaDataExisted) {
-            persistDatabaseConfigurations(metadataContexts, param);
-        }
-    }
-    
     private static void persistDatabaseConfigurations(final MetaDataContexts metadataContexts, final ContextManagerBuilderParameter param) {
         metadataContexts.getPersistService().persistGlobalRuleConfiguration(param.getGlobalRuleConfigs(), param.getProps());
         for (Entry<String, ? extends DatabaseConfiguration> entry : param.getDatabaseConfigs().entrySet()) {
@@ -172,12 +147,10 @@ public final class MetaDataContextsFactory {
         }
     }
     
-    private static void persistMetaData(final boolean databaseMetaDataExisted, final MetaDataContexts metaDataContexts) {
-        if (!databaseMetaDataExisted) {
-            metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas()
-                    .forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(each.getName(), schemaName, schema)));
-            metaDataContexts.getShardingSphereData().getDatabaseData().forEach((databaseName, databaseData) -> databaseData.getSchemaData().forEach((schemaName, schemaData) -> metaDataContexts
-                    .getPersistService().getShardingSphereDataPersistService().persist(databaseName, schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
-        }
+    private static void persistMetaData(final MetaDataContexts metaDataContexts) {
+        metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas()
+                .forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(each.getName(), schemaName, schema)));
+        metaDataContexts.getShardingSphereData().getDatabaseData().forEach((databaseName, databaseData) -> databaseData.getSchemaData().forEach((schemaName, schemaData) -> metaDataContexts
+                .getPersistService().getShardingSphereDataPersistService().persist(databaseName, schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
     }
 }
diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
index 82e8bf99b6a..72f9d93c970 100644
--- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
+++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
@@ -33,7 +33,8 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
-import org.apache.shardingsphere.metadata.NewMetaDataFactory;
+import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.factory.NewInternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
@@ -46,7 +47,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Properties;
 import java.util.stream.Collectors;
 
 /**
@@ -81,38 +81,30 @@ public final class NewMetaDataContextsFactory {
      */
     public static MetaDataContexts create(final NewMetaDataPersistService persistService, final ContextManagerBuilderParameter param,
                                           final InstanceContext instanceContext, final Map<String, StorageNodeDataSource> storageNodes) throws SQLException {
-        boolean databaseMetaDataExisted = databaseMetaDataExisted(persistService);
-        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = getDatabaseConfigurations(databaseMetaDataExisted,
-                getDatabaseNames(instanceContext, param.getDatabaseConfigs(), persistService), param.getDatabaseConfigs(), persistService);
+        boolean isDatabaseMetaDataExisted = !persistService.getDatabaseMetaDataService().loadAllDatabaseNames().isEmpty();
+        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = isDatabaseMetaDataExisted
+                ? createEffectiveDatabaseConfigurations(getDatabaseNames(instanceContext, param.getDatabaseConfigs(), persistService), param.getDatabaseConfigs(), persistService)
+                : param.getDatabaseConfigs();
         checkDataSourceStates(effectiveDatabaseConfigs, storageNodes, param.isForce());
-        Collection<RuleConfiguration> globalRuleConfigs = getGlobalRuleConfigs(databaseMetaDataExisted, persistService, param.getGlobalRuleConfigs());
-        ConfigurationProperties props = getConfigurationProperties(databaseMetaDataExisted, persistService, param.getProps());
-        Map<String, ShardingSphereDatabase> databases = getDatabases(databaseMetaDataExisted, persistService, effectiveDatabaseConfigs, props, instanceContext);
+        Collection<RuleConfiguration> globalRuleConfigs = isDatabaseMetaDataExisted ? persistService.getGlobalRuleService().load() : param.getGlobalRuleConfigs();
+        ConfigurationProperties props = isDatabaseMetaDataExisted ? new ConfigurationProperties(persistService.getPropsService().load()) : new ConfigurationProperties(param.getProps());
+        Map<String, ShardingSphereDatabase> databases = isDatabaseMetaDataExisted
+                ? NewInternalMetaDataFactory.create(persistService, effectiveDatabaseConfigs, props, instanceContext)
+                : ExternalMetaDataFactory.create(effectiveDatabaseConfigs, props, instanceContext);
         ShardingSphereRuleMetaData globalMetaData = new ShardingSphereRuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props));
         MetaDataContexts result = new MetaDataContexts(persistService, new ShardingSphereMetaData(databases, globalMetaData, props));
-        persistDatabaseConfigurations(databaseMetaDataExisted, param, result);
-        persistMetaData(databaseMetaDataExisted, result);
+        if (!isDatabaseMetaDataExisted) {
+            persistDatabaseConfigurations(result, param);
+            persistMetaData(result);
+        }
         return result;
     }
     
-    private static boolean databaseMetaDataExisted(final NewMetaDataPersistService persistService) {
-        return !persistService.getDatabaseMetaDataService().loadAllDatabaseNames().isEmpty();
-    }
-    
     private static Collection<String> getDatabaseNames(final InstanceContext instanceContext,
                                                        final Map<String, DatabaseConfiguration> databaseConfigs, final NewMetaDataPersistService persistService) {
         return instanceContext.getInstance().getMetaData() instanceof JDBCInstanceMetaData ? databaseConfigs.keySet() : persistService.getDatabaseMetaDataService().loadAllDatabaseNames();
     }
     
-    private static ConfigurationProperties getConfigurationProperties(final boolean databaseMetaDataExisted, final NewMetaDataPersistService persistService, final Properties props) {
-        return databaseMetaDataExisted ? new ConfigurationProperties(persistService.getPropsService().load()) : new ConfigurationProperties(props);
-    }
-    
-    private static Map<String, DatabaseConfiguration> getDatabaseConfigurations(final boolean databaseMetaDataExisted, final Collection<String> databaseNames,
-                                                                                final Map<String, DatabaseConfiguration> databaseConfigs, final NewMetaDataPersistService persistService) {
-        return databaseMetaDataExisted ? createEffectiveDatabaseConfigurations(databaseNames, databaseConfigs, persistService) : databaseConfigs;
-    }
-    
     private static Map<String, DatabaseConfiguration> createEffectiveDatabaseConfigurations(final Collection<String> databaseNames,
                                                                                             final Map<String, DatabaseConfiguration> databaseConfigs, final NewMetaDataPersistService persistService) {
         return databaseNames.stream().collect(
@@ -147,23 +139,6 @@ public final class NewMetaDataContextsFactory {
         return result;
     }
     
-    private static Collection<RuleConfiguration> getGlobalRuleConfigs(final boolean databaseMetaDataExisted, final NewMetaDataPersistService persistService,
-                                                                      final Collection<RuleConfiguration> globalRuleConfigs) {
-        return databaseMetaDataExisted ? persistService.getGlobalRuleService().load() : globalRuleConfigs;
-    }
-    
-    private static Map<String, ShardingSphereDatabase> getDatabases(final boolean databaseMetaDataExisted, final NewMetaDataPersistService persistService,
-                                                                    final Map<String, DatabaseConfiguration> databaseConfigMap, final ConfigurationProperties props,
-                                                                    final InstanceContext instanceContext) throws SQLException {
-        return NewMetaDataFactory.create(databaseMetaDataExisted, persistService, databaseConfigMap, props, instanceContext);
-    }
-    
-    private static void persistDatabaseConfigurations(final boolean databaseMetaDataExisted, final ContextManagerBuilderParameter param, final MetaDataContexts metadataContexts) {
-        if (!databaseMetaDataExisted) {
-            persistDatabaseConfigurations(metadataContexts, param);
-        }
-    }
-    
     private static void persistDatabaseConfigurations(final MetaDataContexts metadataContexts, final ContextManagerBuilderParameter param) {
         metadataContexts.getPersistService().persistGlobalRuleConfiguration(param.getGlobalRuleConfigs(), param.getProps());
         for (Entry<String, ? extends DatabaseConfiguration> entry : param.getDatabaseConfigs().entrySet()) {
@@ -174,12 +149,10 @@ public final class NewMetaDataContextsFactory {
         }
     }
     
-    private static void persistMetaData(final boolean databaseMetaDataExisted, final MetaDataContexts metaDataContexts) {
-        if (!databaseMetaDataExisted) {
-            metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas()
-                    .forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(each.getName(), schemaName, schema)));
-            metaDataContexts.getShardingSphereData().getDatabaseData().forEach((databaseName, databaseData) -> databaseData.getSchemaData().forEach((schemaName, schemaData) -> metaDataContexts
-                    .getPersistService().getShardingSphereDataPersistService().persist(databaseName, schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
-        }
+    private static void persistMetaData(final MetaDataContexts metaDataContexts) {
+        metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas()
+                .forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(each.getName(), schemaName, schema)));
+        metaDataContexts.getShardingSphereData().getDatabaseData().forEach((databaseName, databaseData) -> databaseData.getSchemaData().forEach((schemaName, schemaData) -> metaDataContexts
+                .getPersistService().getShardingSphereDataPersistService().persist(databaseName, schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
     }
 }
diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
index 388490e2f0e..69a5aa44383 100644
--- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
+++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
@@ -287,35 +287,39 @@ public final class MySQLDDLStatementVisitor extends MySQLStatementVisitor implem
             return result;
         }
         for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterTableActions().alterCommandList().alterList())).getValue()) {
-            if (each instanceof AddColumnDefinitionSegment) {
-                result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
-            } else if (each instanceof ModifyColumnDefinitionSegment) {
-                result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
-            } else if (each instanceof ChangeColumnDefinitionSegment) {
-                result.getChangeColumnDefinitions().add((ChangeColumnDefinitionSegment) each);
-            } else if (each instanceof DropColumnDefinitionSegment) {
-                result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
-            } else if (each instanceof AddConstraintDefinitionSegment) {
-                result.getAddConstraintDefinitions().add((AddConstraintDefinitionSegment) each);
-            } else if (each instanceof DropConstraintDefinitionSegment) {
-                result.getDropConstraintDefinitions().add((DropConstraintDefinitionSegment) each);
-            } else if (each instanceof RenameTableDefinitionSegment) {
-                result.setRenameTable(((RenameTableDefinitionSegment) each).getRenameTable());
-            } else if (each instanceof ConvertTableDefinitionSegment) {
-                result.setConvertTableDefinition((ConvertTableDefinitionSegment) each);
-            } else if (each instanceof DropIndexDefinitionSegment) {
-                result.getDropIndexDefinitions().add((DropIndexDefinitionSegment) each);
-            } else if (each instanceof RenameIndexDefinitionSegment) {
-                result.getRenameIndexDefinitions().add((RenameIndexDefinitionSegment) each);
-            } else if (each instanceof RenameColumnSegment) {
-                result.getRenameColumnDefinitions().add((RenameColumnSegment) each);
-            } else if (each instanceof AlgorithmTypeSegment) {
-                result.setAlgorithmSegment((AlgorithmTypeSegment) each);
-            } else if (each instanceof LockTableSegment) {
-                result.setLockTableSegment((LockTableSegment) each);
-            }
+            setAlterDefinition(result, each);
+        }
+        return result;
+    }
+    
+    private void setAlterDefinition(final MySQLAlterTableStatement alterTableStatement, final AlterDefinitionSegment alterDefinitionSegment) {
+        if (alterDefinitionSegment instanceof AddColumnDefinitionSegment) {
+            alterTableStatement.getAddColumnDefinitions().add((AddColumnDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof ModifyColumnDefinitionSegment) {
+            alterTableStatement.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof ChangeColumnDefinitionSegment) {
+            alterTableStatement.getChangeColumnDefinitions().add((ChangeColumnDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof DropColumnDefinitionSegment) {
+            alterTableStatement.getDropColumnDefinitions().add((DropColumnDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof AddConstraintDefinitionSegment) {
+            alterTableStatement.getAddConstraintDefinitions().add((AddConstraintDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof DropConstraintDefinitionSegment) {
+            alterTableStatement.getDropConstraintDefinitions().add((DropConstraintDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof RenameTableDefinitionSegment) {
+            alterTableStatement.setRenameTable(((RenameTableDefinitionSegment) alterDefinitionSegment).getRenameTable());
+        } else if (alterDefinitionSegment instanceof ConvertTableDefinitionSegment) {
+            alterTableStatement.setConvertTableDefinition((ConvertTableDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof DropIndexDefinitionSegment) {
+            alterTableStatement.getDropIndexDefinitions().add((DropIndexDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof RenameIndexDefinitionSegment) {
+            alterTableStatement.getRenameIndexDefinitions().add((RenameIndexDefinitionSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof RenameColumnSegment) {
+            alterTableStatement.getRenameColumnDefinitions().add((RenameColumnSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof AlgorithmTypeSegment) {
+            alterTableStatement.setAlgorithmSegment((AlgorithmTypeSegment) alterDefinitionSegment);
+        } else if (alterDefinitionSegment instanceof LockTableSegment) {
+            alterTableStatement.setLockTableSegment((LockTableSegment) alterDefinitionSegment);
         }
-        return result;
     }
     
     private ColumnDefinitionSegment generateColumnDefinitionSegment(final ColumnSegment column, final FieldDefinitionContext ctx) {