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

jianglongtao 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 8259596  [DistSQL] Add `create/alter database discovery heartbeat` 
statement to support new API. (#14093)
8259596 is described below

commit 8259596456e6c35cd0c71f29d76079e003543193
Author: lanchengx <[email protected]>
AuthorDate: Thu Dec 16 10:20:17 2021 +0800

    [DistSQL] Add `create/alter database discovery heartbeat` statement to 
support new API. (#14093)
    
    * Add `create/alter database discovery heartbeat` statement to support new 
API.
    
    * Add `create/alter database discovery heartbeat` statement to support new 
API.
    
    * Modify the class name.
    
    * Modify comment.
    
    * Modify comment & format.
---
 .../DatabaseDiscoveryRuleStatementConverter.java   | 15 +++-
 ...DatabaseDiscoveryHeartbeatStatementUpdater.java | 90 ++++++++++++++++++++++
 ...DatabaseDiscoveryHeartbeatStatementUpdater.java | 82 ++++++++++++++++++++
 ...here.infra.distsql.update.RuleDefinitionUpdater |  2 +
 ...baseDiscoveryHeartbeatStatementUpdaterTest.java | 81 +++++++++++++++++++
 ...baseDiscoveryHeartbeatStatementUpdaterTest.java | 80 +++++++++++++++++++
 .../antlr4/imports/db-discovery/RDLStatement.g4    | 22 ++++--
 .../autogen/DatabaseDiscoveryDistSQLStatement.g4   |  2 +
 .../DatabaseDiscoveryDistSQLStatementVisitor.java  | 33 ++++++--
 ...java => DatabaseDiscoveryHeartbeatSegment.java} | 11 +--
 .../segment/DatabaseDiscoveryTypeSegment.java      |  2 +-
 .../AlterDatabaseDiscoveryHeartbeatStatement.java} | 16 ++--
 ...CreateDatabaseDiscoveryHeartbeatStatement.java} | 16 ++--
 .../rdl/alter/AlterRuleStatementAssert.java        |  5 ++
 ...rDatabaseDiscoveryHeartbeatStatementAssert.java | 63 +++++++++++++++
 .../rdl/create/CreateRuleStatementAssert.java      |  5 ++
 ...eDatabaseDiscoveryHeartbeatStatementAssert.java | 63 +++++++++++++++
 .../jaxb/cases/domain/SQLParserTestCases.java      | 10 +++
 .../rdl/ExpectedDatabaseDiscoveryHeartbeat.java    | 23 +++---
 ...atabaseDiscoveryHeartbeatStatementTestCase.java | 23 +++---
 ...atabaseDiscoveryHeartbeatStatementTestCase.java | 23 +++---
 .../src/main/resources/case/rdl/alter.xml          |  8 ++
 .../src/main/resources/case/rdl/create.xml         |  9 +++
 .../src/main/resources/sql/supported/rdl/alter.xml |  1 +
 .../main/resources/sql/supported/rdl/create.xml    |  1 +
 25 files changed, 622 insertions(+), 64 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/converter/DatabaseDiscoveryRuleStatementConverter.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/converter/DatabaseDisco
 [...]
index 85ab7c1..7bfe67d 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/converter/DatabaseDiscoveryRuleStatementConverter.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/converter/DatabaseDiscoveryRuleStatementConverter.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryHe
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.AbstractDatabaseDiscoverySegment;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryConstructionSegment;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryDefinitionSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryTypeSegment;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 
@@ -82,7 +83,19 @@ public final class DatabaseDiscoveryRuleStatementConverter {
     }
     
     /**
-     * Convert database discovery type segment to database discovery type 
configuration.
+     * Convert database discovery heartbeat segment to database discovery 
heartbeat configuration.
+     *
+     * @param heartbeatSegments database discovery heartbeat segments
+     * @return database discovery heartbeat configuration
+     */
+    public static DatabaseDiscoveryRuleConfiguration 
convertDiscoveryHeartbeat(final Collection<DatabaseDiscoveryHeartbeatSegment> 
heartbeatSegments) {
+        DatabaseDiscoveryRuleConfiguration result = new 
DatabaseDiscoveryRuleConfiguration(new LinkedList<>(), new LinkedHashMap<>(), 
new LinkedHashMap<>());
+        heartbeatSegments.forEach(each -> 
result.getDiscoveryHeartbeats().put(each.getHeartbeatName(), new 
DatabaseDiscoveryHeartBeatConfiguration(each.getProperties())));
+        return result;
+    }
+    
+    /**
+     * Convert database discovery type segment to database discovery heartbeat 
configuration.
      *
      * @param typeSegment database discovery type segments
      * @return database discovery type configuration
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/AlterDatabaseDiscoveryHeartbeatStatementUpdater.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/AlterDataba
 [...]
new file mode 100644
index 0000000..d59527c
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/AlterDatabaseDiscoveryHeartbeatStatementUpdater.java
@@ -0,0 +1,90 @@
+/*
+ * 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.dbdiscovery.distsql.handler.update;
+
+import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.handler.converter.DatabaseDiscoveryRuleStatementConverter;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.AlterDatabaseDiscoveryHeartbeatStatement;
+import org.apache.shardingsphere.infra.distsql.exception.DistSQLException;
+import 
org.apache.shardingsphere.infra.distsql.exception.rule.DuplicateRuleException;
+import 
org.apache.shardingsphere.infra.distsql.exception.rule.RequiredRuleMissedException;
+import 
org.apache.shardingsphere.infra.distsql.update.RuleDefinitionAlterUpdater;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+public final class AlterDatabaseDiscoveryHeartbeatStatementUpdater implements 
RuleDefinitionAlterUpdater<AlterDatabaseDiscoveryHeartbeatStatement, 
DatabaseDiscoveryRuleConfiguration> {
+    
+    private static final String RULE_TYPE = "database discovery";
+    
+    @Override
+    public DatabaseDiscoveryRuleConfiguration 
buildToBeAlteredRuleConfiguration(final 
AlterDatabaseDiscoveryHeartbeatStatement sqlStatement) {
+        return 
DatabaseDiscoveryRuleStatementConverter.convertDiscoveryHeartbeat(sqlStatement.getHeartbeats());
+    }
+    
+    @Override
+    public void updateCurrentRuleConfiguration(final 
DatabaseDiscoveryRuleConfiguration currentRuleConfig, final 
DatabaseDiscoveryRuleConfiguration toBeCreatedRuleConfig) {
+        if (null != currentRuleConfig) {
+            
currentRuleConfig.getDiscoveryHeartbeats().putAll(toBeCreatedRuleConfig.getDiscoveryHeartbeats());
+        }
+    }
+    
+    @Override
+    public void checkSQLStatement(final ShardingSphereMetaData 
shardingSphereMetaData, final AlterDatabaseDiscoveryHeartbeatStatement 
sqlStatement,
+                                  final DatabaseDiscoveryRuleConfiguration 
currentRuleConfig) throws DistSQLException {
+        String schemaName = shardingSphereMetaData.getName();
+        checkCurrentConfiguration(schemaName, currentRuleConfig);
+        checkDuplicateHeartbeat(schemaName, sqlStatement);
+        checkNotExistHeartbeat(schemaName, sqlStatement, currentRuleConfig);
+    }
+    
+    private void checkCurrentConfiguration(final String schemaName, final 
DatabaseDiscoveryRuleConfiguration currentRuleConfig) throws DistSQLException {
+        DistSQLException.predictionThrow(currentRuleConfig != null, new 
RequiredRuleMissedException(RULE_TYPE, schemaName));
+    }
+    
+    private void checkNotExistHeartbeat(final String schemaName, final 
AlterDatabaseDiscoveryHeartbeatStatement sqlStatement,
+                                        final 
DatabaseDiscoveryRuleConfiguration currentRuleConfig) throws DistSQLException {
+        Collection<String> currentHeartbeats = 
currentRuleConfig.getDiscoveryHeartbeats().keySet();
+        Collection<String> notExistHeartbeats = 
sqlStatement.getHeartbeats().stream().map(DatabaseDiscoveryHeartbeatSegment::getHeartbeatName)
+                .filter(each -> 
!currentHeartbeats.contains(each)).collect(Collectors.toSet());
+        DistSQLException.predictionThrow(notExistHeartbeats.isEmpty(), new 
RequiredRuleMissedException(RULE_TYPE, schemaName, notExistHeartbeats));
+    }
+    
+    private void checkDuplicateHeartbeat(final String schemaName, final 
AlterDatabaseDiscoveryHeartbeatStatement sqlStatement) throws DistSQLException {
+        Collection<String> duplicateRuleNames = 
getToBeCreatedDuplicateRuleNames(sqlStatement);
+        DistSQLException.predictionThrow(duplicateRuleNames.isEmpty(), new 
DuplicateRuleException(RULE_TYPE, schemaName, duplicateRuleNames));
+    }
+    
+    private Collection<String> getToBeCreatedDuplicateRuleNames(final 
AlterDatabaseDiscoveryHeartbeatStatement sqlStatement) {
+        return 
sqlStatement.getHeartbeats().stream().collect(Collectors.toMap(DatabaseDiscoveryHeartbeatSegment::getHeartbeatName,
 e -> 1, Integer::sum))
+                .entrySet().stream().filter(entry -> entry.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
+    }
+    
+    @Override
+    public Class<DatabaseDiscoveryRuleConfiguration> 
getRuleConfigurationClass() {
+        return DatabaseDiscoveryRuleConfiguration.class;
+    }
+    
+    @Override
+    public String getType() {
+        return 
AlterDatabaseDiscoveryHeartbeatStatement.class.getCanonicalName();
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/CreateDatabaseDiscoveryHeartbeatStatementUpdater.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/CreateData
 [...]
new file mode 100644
index 0000000..0635da6
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/CreateDatabaseDiscoveryHeartbeatStatementUpdater.java
@@ -0,0 +1,82 @@
+/*
+ * 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.dbdiscovery.distsql.handler.update;
+
+import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.handler.converter.DatabaseDiscoveryRuleStatementConverter;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryHeartbeatStatement;
+import org.apache.shardingsphere.infra.distsql.exception.DistSQLException;
+import 
org.apache.shardingsphere.infra.distsql.exception.rule.DuplicateRuleException;
+import 
org.apache.shardingsphere.infra.distsql.update.RuleDefinitionCreateUpdater;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+public final class CreateDatabaseDiscoveryHeartbeatStatementUpdater implements 
RuleDefinitionCreateUpdater<CreateDatabaseDiscoveryHeartbeatStatement, 
DatabaseDiscoveryRuleConfiguration> {
+    
+    private static final String RULE_TYPE = "database discovery";
+    
+    @Override
+    public DatabaseDiscoveryRuleConfiguration 
buildToBeCreatedRuleConfiguration(final 
CreateDatabaseDiscoveryHeartbeatStatement sqlStatement) {
+        return 
DatabaseDiscoveryRuleStatementConverter.convertDiscoveryHeartbeat(sqlStatement.getHeartbeats());
+    }
+    
+    @Override
+    public void updateCurrentRuleConfiguration(final 
DatabaseDiscoveryRuleConfiguration currentRuleConfig, final 
DatabaseDiscoveryRuleConfiguration toBeCreatedRuleConfig) {
+        if (null != currentRuleConfig) {
+            
currentRuleConfig.getDiscoveryHeartbeats().putAll(toBeCreatedRuleConfig.getDiscoveryHeartbeats());
+        }
+    }
+    
+    @Override
+    public void checkSQLStatement(final ShardingSphereMetaData 
shardingSphereMetaData, final CreateDatabaseDiscoveryHeartbeatStatement 
sqlStatement,
+                                  final DatabaseDiscoveryRuleConfiguration 
currentRuleConfig) throws DistSQLException {
+        String schemaName = shardingSphereMetaData.getName();
+        checkDuplicateHeartbeat(schemaName, sqlStatement, currentRuleConfig);
+    }
+    
+    private void checkDuplicateHeartbeat(final String schemaName, final 
CreateDatabaseDiscoveryHeartbeatStatement sqlStatement,
+                                         final 
DatabaseDiscoveryRuleConfiguration currentRuleConfig) throws DistSQLException {
+        if (null == currentRuleConfig) {
+            return;
+        }
+        Collection<String> existRuleNames = 
currentRuleConfig.getDiscoveryHeartbeats().keySet();
+        Collection<String> duplicateRuleNames = 
sqlStatement.getHeartbeats().stream().map(DatabaseDiscoveryHeartbeatSegment::getHeartbeatName)
+                .filter(existRuleNames::contains).collect(Collectors.toSet());
+        
duplicateRuleNames.addAll(getToBeCreatedDuplicateRuleNames(sqlStatement));
+        DistSQLException.predictionThrow(duplicateRuleNames.isEmpty(), new 
DuplicateRuleException(RULE_TYPE, schemaName, duplicateRuleNames));
+    }
+    
+    private Collection<String> getToBeCreatedDuplicateRuleNames(final 
CreateDatabaseDiscoveryHeartbeatStatement sqlStatement) {
+        return 
sqlStatement.getHeartbeats().stream().collect(Collectors.toMap(DatabaseDiscoveryHeartbeatSegment::getHeartbeatName,
 e -> 1, Integer::sum))
+                .entrySet().stream().filter(entry -> entry.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
+    }
+    
+    @Override
+    public Class<DatabaseDiscoveryRuleConfiguration> 
getRuleConfigurationClass() {
+        return DatabaseDiscoveryRuleConfiguration.class;
+    }
+    
+    @Override
+    public String getType() {
+        return 
CreateDatabaseDiscoveryHeartbeatStatement.class.getCanonicalName();
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.update.RuleDefinitionUpdater
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.update.RuleDefinitionUpdater
index e07aa92..b45cab8 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.update.RuleDefinitionUpdater
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.update.RuleDefinitionUpdater
@@ -19,3 +19,5 @@ 
org.apache.shardingsphere.dbdiscovery.distsql.handler.update.CreateDatabaseDisco
 
org.apache.shardingsphere.dbdiscovery.distsql.handler.update.AlterDatabaseDiscoveryRuleStatementUpdater
 
org.apache.shardingsphere.dbdiscovery.distsql.handler.update.DropDatabaseDiscoveryRuleStatementUpdater
 
org.apache.shardingsphere.dbdiscovery.distsql.handler.update.CreateDatabaseDiscoveryTypeStatementUpdater
+org.apache.shardingsphere.dbdiscovery.distsql.handler.update.AlterDatabaseDiscoveryHeartbeatStatementUpdater
+org.apache.shardingsphere.dbdiscovery.distsql.handler.update.CreateDatabaseDiscoveryHeartbeatStatementUpdater
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/AlterDatabaseDiscoveryHeartbeatStatementUpdaterTest.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/AlterDa
 [...]
new file mode 100644
index 0000000..f24e501
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/AlterDatabaseDiscoveryHeartbeatStatementUpdaterTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.dbdiscovery.distsql.handler.update;
+
+import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.AlterDatabaseDiscoveryHeartbeatStatement;
+import org.apache.shardingsphere.infra.distsql.exception.DistSQLException;
+import 
org.apache.shardingsphere.infra.distsql.exception.rule.DuplicateRuleException;
+import 
org.apache.shardingsphere.infra.distsql.exception.rule.RequiredRuleMissedException;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(MockitoJUnitRunner.class)
+public final class AlterDatabaseDiscoveryHeartbeatStatementUpdaterTest {
+    
+    @Mock
+    private ShardingSphereMetaData shardingSphereMetaData;
+    
+    private final AlterDatabaseDiscoveryHeartbeatStatementUpdater updater = 
new AlterDatabaseDiscoveryHeartbeatStatementUpdater();
+    
+    @Test(expected = DuplicateRuleException.class)
+    public void assertCheckSQLStatementWithDuplicateHeartbeatNames() throws 
DistSQLException {
+        DatabaseDiscoveryHeartbeatSegment segment1 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat", createProperties("key", 
"value"));
+        DatabaseDiscoveryHeartbeatSegment segment2 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat", createProperties("key", 
"value"));
+        updater.checkSQLStatement(shardingSphereMetaData, new 
AlterDatabaseDiscoveryHeartbeatStatement(Arrays.asList(segment1, segment2)),
+                new 
DatabaseDiscoveryRuleConfiguration(Collections.emptyList(), 
Collections.emptyMap(), Collections.emptyMap()));
+    }
+    
+    @Test(expected = RequiredRuleMissedException.class)
+    public void assertCheckSQLStatementWithNotExistDiscoveryHeartbeatName() 
throws DistSQLException {
+        DatabaseDiscoveryHeartbeatSegment segment = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat", createProperties("key", 
"value"));
+        DatabaseDiscoveryRuleConfiguration configuration = new 
DatabaseDiscoveryRuleConfiguration(Collections.emptyList(), 
Collections.singletonMap("heartbeat1", null), Collections.emptyMap());
+        updater.checkSQLStatement(shardingSphereMetaData, new 
AlterDatabaseDiscoveryHeartbeatStatement(Collections.singleton(segment)), 
configuration);
+    }
+    
+    @Test
+    public void assertUpdate() {
+        DatabaseDiscoveryHeartbeatSegment segment1 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat_1", createProperties("key_1", 
"value_1"));
+        DatabaseDiscoveryHeartbeatSegment segment2 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat_2", createProperties("key_2", 
"value_2"));
+        DatabaseDiscoveryRuleConfiguration ruleConfiguration = 
updater.buildToBeAlteredRuleConfiguration(new 
AlterDatabaseDiscoveryHeartbeatStatement(Arrays.asList(segment1, segment2)));
+        DatabaseDiscoveryRuleConfiguration currentConfiguration = new 
DatabaseDiscoveryRuleConfiguration(new LinkedList<>(), new LinkedHashMap<>(), 
new LinkedHashMap<>());
+        updater.updateCurrentRuleConfiguration(currentConfiguration, 
ruleConfiguration);
+        assertThat(currentConfiguration.getDiscoveryHeartbeats().size(), 
is(2));
+        
assertThat(currentConfiguration.getDiscoveryHeartbeats().get("heartbeat_1").getProps(),
 is(createProperties("key_1", "value_1")));
+        
assertThat(currentConfiguration.getDiscoveryHeartbeats().get("heartbeat_2").getProps(),
 is(createProperties("key_2", "value_2")));
+    }
+    
+    private Properties createProperties(final String key, final String value) {
+        Properties result = new Properties();
+        result.put(key, value);
+        return result;
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/CreateDatabaseDiscoveryHeartbeatStatementUpdaterTest.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/Create
 [...]
new file mode 100644
index 0000000..9a6de0d
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/CreateDatabaseDiscoveryHeartbeatStatementUpdaterTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.dbdiscovery.distsql.handler.update;
+
+import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryHeartbeatStatement;
+import org.apache.shardingsphere.infra.distsql.exception.DistSQLException;
+import 
org.apache.shardingsphere.infra.distsql.exception.rule.DuplicateRuleException;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(MockitoJUnitRunner.class)
+public final class CreateDatabaseDiscoveryHeartbeatStatementUpdaterTest {
+    
+    @Mock
+    private ShardingSphereMetaData shardingSphereMetaData;
+    
+    private final CreateDatabaseDiscoveryHeartbeatStatementUpdater updater = 
new CreateDatabaseDiscoveryHeartbeatStatementUpdater();
+    
+    @Test(expected = DuplicateRuleException.class)
+    public void assertCheckSQLStatementWithDuplicateHeartbeatNames() throws 
DistSQLException {
+        DatabaseDiscoveryHeartbeatSegment segment1 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat", createProperties("key", 
"value"));
+        DatabaseDiscoveryHeartbeatSegment segment2 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat", createProperties("key", 
"value"));
+        updater.checkSQLStatement(shardingSphereMetaData, new 
CreateDatabaseDiscoveryHeartbeatStatement(Arrays.asList(segment1, segment2)),
+                new 
DatabaseDiscoveryRuleConfiguration(Collections.emptyList(), 
Collections.emptyMap(), Collections.emptyMap()));
+    }
+    
+    @Test(expected = DuplicateRuleException.class)
+    public void assertCheckSQLStatementWithExistDiscoveryHeartbeatName() 
throws DistSQLException {
+        DatabaseDiscoveryHeartbeatSegment segment = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat", createProperties("key", 
"value"));
+        DatabaseDiscoveryRuleConfiguration configuration = new 
DatabaseDiscoveryRuleConfiguration(Collections.emptyList(), 
Collections.singletonMap("heartbeat", null), Collections.emptyMap());
+        updater.checkSQLStatement(shardingSphereMetaData, new 
CreateDatabaseDiscoveryHeartbeatStatement(Collections.singleton(segment)), 
configuration);
+    }
+    
+    @Test
+    public void assertUpdate() {
+        DatabaseDiscoveryHeartbeatSegment segment1 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat_1", createProperties("key_1", 
"value_1"));
+        DatabaseDiscoveryHeartbeatSegment segment2 = new 
DatabaseDiscoveryHeartbeatSegment("heartbeat_2", createProperties("key_2", 
"value_2"));
+        DatabaseDiscoveryRuleConfiguration ruleConfiguration = 
updater.buildToBeCreatedRuleConfiguration(new 
CreateDatabaseDiscoveryHeartbeatStatement(Arrays.asList(segment1, segment2)));
+        DatabaseDiscoveryRuleConfiguration currentConfiguration = new 
DatabaseDiscoveryRuleConfiguration(new LinkedList<>(), new LinkedHashMap<>(), 
new LinkedHashMap<>());
+        updater.updateCurrentRuleConfiguration(currentConfiguration, 
ruleConfiguration);
+        assertThat(currentConfiguration.getDiscoveryHeartbeats().size(), 
is(2));
+        
assertThat(currentConfiguration.getDiscoveryHeartbeats().get("heartbeat_1").getProps(),
 is(createProperties("key_1", "value_1")));
+        
assertThat(currentConfiguration.getDiscoveryHeartbeats().get("heartbeat_2").getProps(),
 is(createProperties("key_2", "value_2")));
+    }
+    
+    private Properties createProperties(final String key, final String value) {
+        Properties result = new Properties();
+        result.put(key, value);
+        return result;
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/imports/db-discovery/RDLStatement.g4
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/imports/db-discovery/RDLStatement.g4
index 3cb4151..17ec184 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/imports/db-discovery/RDLStatement.g4
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/imports/db-discovery/RDLStatement.g4
@@ -35,6 +35,14 @@ createDatabaseDiscoveryType
     : CREATE DB_DISCOVERY TYPE databaseDiscoveryTypeDefinition (COMMA 
databaseDiscoveryTypeDefinition)*
     ;
 
+createDatabaseDiscoveryHeartbeat
+    : CREATE DB_DISCOVERY HEARTBEAT heartbeatDefinition (COMMA 
heartbeatDefinition)*
+    ;
+    
+alterDatabaseDiscoveryHeartbeat
+    : ALTER DB_DISCOVERY HEARTBEAT heartbeatDefinition (COMMA 
heartbeatDefinition)*
+    ;
+    
 databaseDiscoveryRule
     : (databaseDiscoveryRuleDefinition | databaseDiscoveryRuleConstruction)
     ;
@@ -51,6 +59,10 @@ databaseDiscoveryTypeDefinition
     : discoveryTypeName LP typeDefinition RP
     ;
 
+heartbeatDefinition
+    : discoveryHeartbeatName LP PROPERTIES LP properties RP RP  
+    ;
+
 ruleName
     : IDENTIFIER
     ;
@@ -64,22 +76,22 @@ resourceName
     ;
 
 typeDefinition
-    : TYPE LP NAME EQ typeName (COMMA PROPERTIES LP typeProperties RP)? RP
+    : TYPE LP NAME EQ typeName (COMMA PROPERTIES LP properties RP)? RP
     ;
 
 discoveryHeartbeat
-    : HEARTBEAT LP PROPERTIES LP typeProperties RP RP
+    : HEARTBEAT LP PROPERTIES LP properties RP RP
     ;
 
 typeName
     : IDENTIFIER
     ;
 
-typeProperties
-    : typeProperty (COMMA typeProperty)*
+properties
+    : property (COMMA property)*
     ;
 
-typeProperty
+property
     : key=(IDENTIFIER | STRING) EQ value=(NUMBER | INT | STRING)
     ;
 
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DatabaseDiscoveryDistSQLStatement.g4
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DatabaseDiscoveryDistSQLStatement.g4
index 17f8397..76a2707 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DatabaseDiscoveryDistSQLStatement.g4
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DatabaseDiscoveryDistSQLStatement.g4
@@ -27,5 +27,7 @@ execute
     | showDatabaseDiscoveryHeartbeats
     | showDatabaseDiscoveryRules
     | createDatabaseDiscoveryType
+    | createDatabaseDiscoveryHeartbeat
+    | alterDatabaseDiscoveryHeartbeat
     ) SEMI?
     ;
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLStatementVisitor.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLSt
 [...]
index 2d9f555..d783b90 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLStatementVisitor.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLStatementVisitor.java
@@ -21,8 +21,11 @@ import org.antlr.v4.runtime.tree.ParseTree;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.AbstractDatabaseDiscoverySegment;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryConstructionSegment;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryDefinitionSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryTypeSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.AlterDatabaseDiscoveryHeartbeatStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.AlterDatabaseDiscoveryRuleStatement;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryHeartbeatStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryRuleStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryTypeStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.DropDatabaseDiscoveryRuleStatement;
@@ -30,7 +33,9 @@ import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.ShowDataba
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.ShowDatabaseDiscoveryRulesStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.ShowDatabaseDiscoveryTypesStatement;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementBaseVisitor;
+import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.AlterDatabaseDiscoveryHeartbeatContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.AlterDatabaseDiscoveryRuleContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.CreateDatabaseDiscoveryHeartbeatContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.CreateDatabaseDiscoveryRuleContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.CreateDatabaseDiscoveryTypeContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.DatabaseDiscoveryRuleConstructionContext;
@@ -38,14 +43,14 @@ import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQL
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.DatabaseDiscoveryRuleDefinitionContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.DatabaseDiscoveryTypeDefinitionContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.DropDatabaseDiscoveryRuleContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.PropertiesContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.PropertyContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.ResourcesContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.SchemaNameContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.ShowDatabaseDiscoveryHeartbeatsContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.ShowDatabaseDiscoveryRulesContext;
-import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.TypeDefinitionContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.ShowDatabaseDiscoveryTypesContext;
-import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.TypePropertiesContext;
-import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.TypePropertyContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.DatabaseDiscoveryDistSQLStatementParser.TypeDefinitionContext;
 import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.visitor.SQLVisitor;
@@ -91,7 +96,7 @@ public final class DatabaseDiscoveryDistSQLStatementVisitor 
extends DatabaseDisc
     @Override
     public ASTNode visitDatabaseDiscoveryRuleDefinition(final 
DatabaseDiscoveryRuleDefinitionContext ctx) {
         return new 
DatabaseDiscoveryDefinitionSegment(getIdentifierValue(ctx.ruleName()), 
buildResources(ctx.resources()),
-                (AlgorithmSegment) visit(ctx.typeDefinition()), 
getProperties(ctx.discoveryHeartbeat().typeProperties()));
+                (AlgorithmSegment) visit(ctx.typeDefinition()), 
getProperties(ctx.discoveryHeartbeat().properties()));
         
     }
     
@@ -110,6 +115,20 @@ public final class 
DatabaseDiscoveryDistSQLStatementVisitor extends DatabaseDisc
     }
     
     @Override
+    public ASTNode visitCreateDatabaseDiscoveryHeartbeat(final 
CreateDatabaseDiscoveryHeartbeatContext ctx) {
+        return new 
CreateDatabaseDiscoveryHeartbeatStatement(ctx.heartbeatDefinition().stream()
+                .map(each -> new 
DatabaseDiscoveryHeartbeatSegment(getIdentifierValue(each.discoveryHeartbeatName()),
 getProperties(each.properties())))
+                .collect(Collectors.toCollection(LinkedList::new)));
+    }
+    
+    @Override
+    public ASTNode visitAlterDatabaseDiscoveryHeartbeat(final 
AlterDatabaseDiscoveryHeartbeatContext ctx) {
+        return new 
AlterDatabaseDiscoveryHeartbeatStatement(ctx.heartbeatDefinition().stream()
+                .map(each -> new 
DatabaseDiscoveryHeartbeatSegment(getIdentifierValue(each.discoveryHeartbeatName()),
 getProperties(each.properties())))
+                .collect(Collectors.toCollection(LinkedList::new)));
+    }
+    
+    @Override
     public ASTNode visitCreateDatabaseDiscoveryType(final 
CreateDatabaseDiscoveryTypeContext ctx) {
         return new 
CreateDatabaseDiscoveryTypeStatement(buildAlgorithmEntry(ctx.databaseDiscoveryTypeDefinition()));
     }
@@ -147,12 +166,12 @@ public final class 
DatabaseDiscoveryDistSQLStatementVisitor extends DatabaseDisc
     
     @Override
     public ASTNode visitTypeDefinition(final TypeDefinitionContext ctx) {
-        return new AlgorithmSegment(getIdentifierValue(ctx.typeName()), null 
== ctx.typeProperties() ? new Properties() : 
getProperties(ctx.typeProperties()));
+        return new AlgorithmSegment(getIdentifierValue(ctx.typeName()), null 
== ctx.properties() ? new Properties() : getProperties(ctx.properties()));
     }
     
-    private Properties getProperties(final TypePropertiesContext ctx) {
+    private Properties getProperties(final PropertiesContext ctx) {
         Properties result = new Properties();
-        for (TypePropertyContext each : ctx.typeProperty()) {
+        for (PropertyContext each : ctx.property()) {
             result.setProperty(new 
IdentifierValue(each.key.getText()).getValue(), new 
IdentifierValue(each.value.getText()).getValue());
         }
         return result;
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryHeartbeat
 [...]
similarity index 79%
copy from 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
copy to 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryHeartbeatSegment.java
index 58c9f22..6e0e9b7 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryHeartbeatSegment.java
@@ -19,17 +19,18 @@ package 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 
+import java.util.Properties;
+
 /**
- * Database discovery type.
+ * Database discovery heartbeat segment.
  */
 @RequiredArgsConstructor
 @Getter
-public final class DatabaseDiscoveryTypeSegment implements ASTNode {
+public final class DatabaseDiscoveryHeartbeatSegment implements ASTNode {
     
-    private final String discoveryTypeName;
+    private final String heartbeatName;
     
-    private final AlgorithmSegment algorithmSegment;
+    private final Properties properties;
 }
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
index 58c9f22..917654d 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 
 /**
- * Database discovery type.
+ * Database discovery type segment.
  */
 @RequiredArgsConstructor
 @Getter
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/AlterDatabaseDiscoveryHe
 [...]
similarity index 64%
copy from 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
copy to 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/AlterDatabaseDiscoveryHeartbeatStatement.java
index 58c9f22..cf5531c 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/AlterDatabaseDiscoveryHeartbeatStatement.java
@@ -15,21 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.dbdiscovery.distsql.parser.segment;
+package org.apache.shardingsphere.dbdiscovery.distsql.parser.statement;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterRuleStatement;
+
+import java.util.Collection;
 
 /**
- * Database discovery type.
+ * Alter database discovery heartbeat statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class DatabaseDiscoveryTypeSegment implements ASTNode {
-    
-    private final String discoveryTypeName;
+public final class AlterDatabaseDiscoveryHeartbeatStatement extends 
AlterRuleStatement {
     
-    private final AlgorithmSegment algorithmSegment;
+    private final Collection<DatabaseDiscoveryHeartbeatSegment> heartbeats;
 }
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/CreateDatabaseDiscoveryH
 [...]
similarity index 64%
copy from 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
copy to 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/CreateDatabaseDiscoveryHeartbeatStatement.java
index 58c9f22..1a215d9 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/CreateDatabaseDiscoveryHeartbeatStatement.java
@@ -15,21 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.dbdiscovery.distsql.parser.segment;
+package org.apache.shardingsphere.dbdiscovery.distsql.parser.statement;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateRuleStatement;
+
+import java.util.Collection;
 
 /**
- * Database discovery type.
+ * Create database discovery heartbeat statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class DatabaseDiscoveryTypeSegment implements ASTNode {
-    
-    private final String discoveryTypeName;
+public final class CreateDatabaseDiscoveryHeartbeatStatement extends 
CreateRuleStatement {
     
-    private final AlgorithmSegment algorithmSegment;
+    private final Collection<DatabaseDiscoveryHeartbeatSegment> heartbeats;
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/alter/AlterRuleStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/alter/AlterRuleStatementAssert.java
index 148ee4e..a13dcf8 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/alter/AlterRuleStatementAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/alter/AlterRuleStatementAssert.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter;
 
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.AlterDatabaseDiscoveryHeartbeatStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.AlterDatabaseDiscoveryRuleStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterRuleStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.create.AlterDefaultSingleTableRuleStatement;
@@ -30,6 +31,7 @@ import 
org.apache.shardingsphere.sharding.distsql.parser.statement.AlterSharding
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.AlterShardingTableRuleStatement;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl.AlterDatabaseDiscoveryRuleStatementAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl.AlterDatabaseDiscoveryHeartbeatStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl.AlterDefaultSingleTableRuleStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl.AlterEncryptRuleStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl.AlterReadwriteSplittingRuleStatementAssert;
@@ -40,6 +42,7 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl.AlterShardingKeyGeneratorStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl.AlterShardingTableRuleStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterDatabaseDiscoveryHeartbeatStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterDefaultSingleTableRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterEncryptRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterReadwriteSplittingRuleStatementTestCase;
@@ -64,6 +67,8 @@ public final class AlterRuleStatementAssert {
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final AlterRuleStatement actual, final SQLParserTestCase expected) {
         if (actual instanceof AlterDatabaseDiscoveryRuleStatement) {
             AlterDatabaseDiscoveryRuleStatementAssert.assertIs(assertContext, 
(AlterDatabaseDiscoveryRuleStatement) actual, expected);
+        } else if (actual instanceof AlterDatabaseDiscoveryHeartbeatStatement) 
{
+            
AlterDatabaseDiscoveryHeartbeatStatementAssert.assertIs(assertContext, 
(AlterDatabaseDiscoveryHeartbeatStatement) actual, 
(AlterDatabaseDiscoveryHeartbeatStatementTestCase) expected);
         } else if (actual instanceof AlterEncryptRuleStatement) {
             AlterEncryptRuleStatementAssert.assertIs(assertContext, 
(AlterEncryptRuleStatement) actual, (AlterEncryptRuleStatementTestCase) 
expected);
         } else if (actual instanceof AlterReadwriteSplittingRuleStatement) {
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/alter/impl/AlterDatabaseDiscoveryHeartbeatStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/alter/impl/AlterDatabaseDiscoveryHeartbeatStatementAssert.java
new file mode 100644
index 0000000..c880cb6
--- /dev/null
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/alter/impl/AlterDatabaseDiscoveryHeartbeatStatementAssert.java
@@ -0,0 +1,63 @@
+/*
+ * 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.test.sql.parser.parameterized.asserts.statement.distsql.rdl.alter.impl;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.AlterDatabaseDiscoveryHeartbeatStatement;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.distsql.PropertiesAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterDatabaseDiscoveryHeartbeatStatementTestCase;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Alter database discovery heartbeat statement assert.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class AlterDatabaseDiscoveryHeartbeatStatementAssert {
+    
+    /**
+     * Assert alter database discovery heartbeat statement is correct with 
expected parser result.
+     *
+     * @param assertContext assert context
+     * @param actual actual alter database discovery heartbeat statement
+     * @param expected expected alter database discovery heartbeat statement 
test case
+     */
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final AlterDatabaseDiscoveryHeartbeatStatement actual, final 
AlterDatabaseDiscoveryHeartbeatStatementTestCase expected) {
+        if (null == expected) {
+            assertNull(assertContext.getText("Actual statement should not 
exist."), actual);
+        } else {
+            assertNotNull(assertContext.getText("Actual statement should 
exist."), actual);
+            Map<String, DatabaseDiscoveryHeartbeatSegment> actualMap = 
actual.getHeartbeats().stream().collect(Collectors.toMap(DatabaseDiscoveryHeartbeatSegment::getHeartbeatName,
 each -> each));
+            expected.getHeartbeats().forEach(each -> {
+                DatabaseDiscoveryHeartbeatSegment actualSegment = 
actualMap.get(each.getName());
+                assertNotNull(actualSegment);
+                assertThat(actualSegment.getHeartbeatName(), 
is(each.getName()));
+                PropertiesAssert.assertIs(assertContext, 
actualSegment.getProperties(), each.getProperties());
+            });
+        }
+    }
+}
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/create/CreateRuleStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/create/CreateRuleStatementAssert.java
index 30da112..1fa7a49 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/create/CreateRuleStatementAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/create/CreateRuleStatementAssert.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statemen
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryHeartbeatStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryRuleStatement;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryTypeStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateDefaultSingleTableRuleStatement;
@@ -35,6 +36,7 @@ import 
org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardin
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardingKeyGeneratorStatement;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardingTableRuleStatement;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.create.impl.CreateDatabaseDiscoveryHeartbeatStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.create.impl.CreateDatabaseDiscoveryRuleStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.create.impl.CreateDatabaseDiscoveryTypeStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.create.impl.CreateDefaultShadowAlgorithmStatementAssert;
@@ -50,6 +52,7 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.create.impl.CreateShardingKeyGeneratorStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.distsql.rdl.create.impl.CreateShardingTableRuleStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDatabaseDiscoveryHeartbeatStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDatabaseDiscoveryTypeStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDefaultShadowAlgorithmStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDefaultShardingStrategyStatementTestCase;
@@ -81,6 +84,8 @@ public final class CreateRuleStatementAssert {
             CreateDatabaseDiscoveryRuleStatementAssert.assertIs(assertContext, 
(CreateDatabaseDiscoveryRuleStatement) actual, expected);
         } else if (actual instanceof CreateDatabaseDiscoveryTypeStatement) {
             CreateDatabaseDiscoveryTypeStatementAssert.assertIs(assertContext, 
(CreateDatabaseDiscoveryTypeStatement) actual, 
(CreateDatabaseDiscoveryTypeStatementTestCase) expected);
+        } else if (actual instanceof 
CreateDatabaseDiscoveryHeartbeatStatement) {
+            
CreateDatabaseDiscoveryHeartbeatStatementAssert.assertIs(assertContext, 
(CreateDatabaseDiscoveryHeartbeatStatement) actual, 
(CreateDatabaseDiscoveryHeartbeatStatementTestCase) expected);
         } else if (actual instanceof CreateEncryptRuleStatement) {
             CreateEncryptRuleStatementAssert.assertIs(assertContext, 
(CreateEncryptRuleStatement) actual, (CreateEncryptRuleStatementTestCase) 
expected);
         } else if (actual instanceof CreateReadwriteSplittingRuleStatement) {
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/create/impl/CreateDatabaseDiscoveryHeartbeatStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/create/impl/CreateDatabaseDiscoveryHeartbeatStatementAssert.java
new file mode 100644
index 0000000..af256b1
--- /dev/null
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/distsql/rdl/create/impl/CreateDatabaseDiscoveryHeartbeatStatementAssert.java
@@ -0,0 +1,63 @@
+/*
+ * 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.test.sql.parser.parameterized.asserts.statement.distsql.rdl.create.impl;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.segment.DatabaseDiscoveryHeartbeatSegment;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.CreateDatabaseDiscoveryHeartbeatStatement;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.distsql.PropertiesAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDatabaseDiscoveryHeartbeatStatementTestCase;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Create database discovery heartbeat statement assert.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class CreateDatabaseDiscoveryHeartbeatStatementAssert {
+    
+    /**
+     * Assert create database discovery heartbeat statement is correct with 
expected parser result.
+     *
+     * @param assertContext assert context
+     * @param actual actual create database discovery heartbeat statement
+     * @param expected expected create database discovery heartbeat statement 
test case
+     */
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final CreateDatabaseDiscoveryHeartbeatStatement actual, final 
CreateDatabaseDiscoveryHeartbeatStatementTestCase expected) {
+        if (null == expected) {
+            assertNull(assertContext.getText("Actual statement should not 
exist."), actual);
+        } else {
+            assertNotNull(assertContext.getText("Actual statement should 
exist."), actual);
+            Map<String, DatabaseDiscoveryHeartbeatSegment> actualMap = 
actual.getHeartbeats().stream().collect(Collectors.toMap(DatabaseDiscoveryHeartbeatSegment::getHeartbeatName,
 each -> each));
+            expected.getHeartbeats().forEach(each -> {
+                DatabaseDiscoveryHeartbeatSegment actualSegment = 
actualMap.get(each.getName());
+                assertNotNull(actualSegment);
+                assertThat(actualSegment.getHeartbeatName(), 
is(each.getName()));
+                PropertiesAssert.assertIs(assertContext, 
actualSegment.getProperties(), each.getProperties());
+            });
+        }
+    }
+}
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/SQLParserTestCases.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/SQLParserTestCases.java
index 6b55854..1b09b16 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/SQLParserTestCases.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/SQLParserTestCases.java
@@ -155,6 +155,7 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.ral.scaling.StopScalingSourceWritingStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterDatabaseDiscoveryConstructionRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterDatabaseDiscoveryDefinitionRuleStatementTestCase;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterDatabaseDiscoveryHeartbeatStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterDefaultSingleTableRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterEncryptRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter.AlterReadwriteSplittingRuleStatementTestCase;
@@ -171,6 +172,7 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDatabaseDiscoveryConstructionRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDatabaseDiscoveryDefinitionRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDatabaseDiscoveryTypeStatementTestCase;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDatabaseDiscoveryHeartbeatStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDefaultShadowAlgorithmStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDefaultShardingStrategyStatementTestCase;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create.CreateDefaultSingleTableRuleStatementTestCase;
@@ -560,6 +562,12 @@ public final class SQLParserTestCases {
     @XmlElement(name = "create-database-discovery-type")
     private final List<CreateDatabaseDiscoveryTypeStatementTestCase> 
createDatabaseDiscoveryTypeTestCases = new LinkedList<>();
     
+    @XmlElement(name = "create-database-discovery-heartbeat")
+    private final List<CreateDatabaseDiscoveryHeartbeatStatementTestCase> 
createDatabaseDiscoveryHeartbeatTestCases = new LinkedList<>();
+    
+    @XmlElement(name = "alter-database-discovery-heartbeat")
+    private final List<AlterDatabaseDiscoveryHeartbeatStatementTestCase> 
alterDatabaseDiscoveryHeartbeatTestCases = new LinkedList<>();
+    
     @XmlElement(name = "create-encrypt-rule")
     private final List<CreateEncryptRuleStatementTestCase> 
createEncryptRuleTestCase = new LinkedList<>();
     
@@ -958,6 +966,8 @@ public final class SQLParserTestCases {
         putAll(createDatabaseDiscoveryDefinitionRuleTestCases, result);
         putAll(createDataBaseDiscoveryConstructionRuleTestCase, result);
         putAll(createDatabaseDiscoveryTypeTestCases, result);
+        putAll(createDatabaseDiscoveryHeartbeatTestCases, result);
+        putAll(alterDatabaseDiscoveryHeartbeatTestCases, result);
         putAll(createEncryptRuleTestCase, result);
         putAll(createReadwriteSplittingRuleTestCase, result);
         putAll(createShardingBindingTableRulesTestCase, result);
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/distsql/rdl/ExpectedDatabaseDiscoveryHeartbeat.java
similarity index 52%
copy from 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
copy to 
shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/distsql/rdl/ExpectedDatabaseDiscoveryHeartbeat.java
index 58c9f22..23eac66 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/distsql/rdl/ExpectedDatabaseDiscoveryHeartbeat.java
@@ -15,21 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.dbdiscovery.distsql.parser.segment;
+package 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.distsql.rdl;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import lombok.Setter;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.AbstractExpectedIdentifierSQLSegment;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.distsql.ExpectedProperties;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
 
 /**
- * Database discovery type.
+ * Expected database discovery heartbeat.
  */
-@RequiredArgsConstructor
 @Getter
-public final class DatabaseDiscoveryTypeSegment implements ASTNode {
+@Setter
+public final class ExpectedDatabaseDiscoveryHeartbeat extends 
AbstractExpectedIdentifierSQLSegment {
     
-    private final String discoveryTypeName;
+    @XmlAttribute(name = "heartbeat-name")
+    private String name;
     
-    private final AlgorithmSegment algorithmSegment;
+    @XmlElement(name = "properties")
+    private ExpectedProperties properties;
 }
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/distsql/rdl/alter/AlterDatabaseDiscoveryHeartbeatStatementTestCase.java
similarity index 52%
copy from 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
copy to 
shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/distsql/rdl/alter/AlterDatabaseDiscoveryHeartbeatStatementTestCase.java
index 58c9f22..01b3185 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/distsql/rdl/alter/AlterDatabaseDiscoveryHeartbeatStatementTestCase.java
@@ -15,21 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.dbdiscovery.distsql.parser.segment;
+package 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.alter;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import lombok.Setter;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.distsql.rdl.ExpectedDatabaseDiscoveryHeartbeat;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
+
+import javax.xml.bind.annotation.XmlElement;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
- * Database discovery type.
+ * Alter database discovery heartbeat statement test case.
  */
-@RequiredArgsConstructor
 @Getter
-public final class DatabaseDiscoveryTypeSegment implements ASTNode {
-    
-    private final String discoveryTypeName;
+@Setter
+public final class AlterDatabaseDiscoveryHeartbeatStatementTestCase extends 
SQLParserTestCase {
     
-    private final AlgorithmSegment algorithmSegment;
+    @XmlElement(name = "heartbeat")
+    private final List<ExpectedDatabaseDiscoveryHeartbeat> heartbeats = new 
LinkedList<>();
 }
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/distsql/rdl/create/CreateDatabaseDiscoveryHeartbeatStatementTestCase.java
similarity index 52%
copy from 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
copy to 
shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/distsql/rdl/create/CreateDatabaseDiscoveryHeartbeatStatementTestCase.java
index 58c9f22..9a4e6ce 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/segment/DatabaseDiscoveryTypeSegment.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/distsql/rdl/create/CreateDatabaseDiscoveryHeartbeatStatementTestCase.java
@@ -15,21 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.dbdiscovery.distsql.parser.segment;
+package 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.distsql.rdl.create;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import lombok.Setter;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.distsql.rdl.ExpectedDatabaseDiscoveryHeartbeat;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
+
+import javax.xml.bind.annotation.XmlElement;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
- * Database discovery type.
+ * Create database discovery heartbeat statement test case.
  */
-@RequiredArgsConstructor
 @Getter
-public final class DatabaseDiscoveryTypeSegment implements ASTNode {
-    
-    private final String discoveryTypeName;
+@Setter
+public final class CreateDatabaseDiscoveryHeartbeatStatementTestCase extends 
SQLParserTestCase {
     
-    private final AlgorithmSegment algorithmSegment;
+    @XmlElement(name = "heartbeat")
+    private final List<ExpectedDatabaseDiscoveryHeartbeat> heartbeats = new 
LinkedList<>();
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
index d9bec03..3ddb437 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/alter.xml
@@ -165,6 +165,14 @@
         </rule>
     </alter-database-discovery-construction-rule>
 
+    <alter-database-discovery-heartbeat 
sql-case-id="alter-database-discovery-heartbeat">
+        <rule heartbeat-name="mgr_heartbeat" >
+            <properties>
+                <property key="keepAliveCron" value="0/5 * * * * ?"/>
+            </properties>
+        </rule>
+    </alter-database-discovery-heartbeat>
+    
     <alter-encrypt-rule sql-case-id="alter-encrypt-rule">
         <rule name="t_encrypt">
             <column name="user_id" plain-column="user_plain" 
cipher-column="user_cipher">
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
index 98fca92..7c7735a 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/rdl/create.xml
@@ -224,6 +224,15 @@
         </type>
     </create-database-discovery-type>
 
+
+    <create-database-discovery-heartbeat 
sql-case-id="create-database-discovery-heartbeat">
+        <rule heartbeat-name="mgr_heartbeat" >
+            <properties>
+                <property key="keepAliveCron" value="0/5 * * * * ?"/>
+            </properties>
+        </rule>
+    </create-database-discovery-heartbeat>
+
     <create-database-discovery-definition-rule 
sql-case-id="create-database-discovery-rule-with-quota">
         <rule rule-name="ha_group_0" type="mgr">
             <data-source>resource0</data-source>
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
index 3e74625..24153ab 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/alter.xml
@@ -33,6 +33,7 @@
     <distsql-case id="alter-readwrite-splitting-rule" value="ALTER 
READWRITE_SPLITTING RULE ms_group_0 (AUTO_AWARE_RESOURCE=group_0, 
TYPE(NAME=random,PROPERTIES(read_weight='2:1'))), ms_group_1 
(WRITE_RESOURCE=primary_ds, 
READ_RESOURCES(replica_ds_0,replica_ds_1),TYPE(NAME=random))" />
     <distsql-case id="alter-database-discovery-definition-rule" value="ALTER 
DB_DISCOVERY RULE ha_group_0 (RESOURCES(resource0,resource1), 
TYPE(NAME=mgr,PROPERTIES(groupName='92504d5b-6dec')),HEARTBEAT(PROPERTIES('keepAliveCron'='0/5
 * * * * ?'))), ha_group_1 (RESOURCES(resource2,resource3), 
TYPE(NAME=mgr2,PROPERTIES(groupName='92504d5b-6dec-2')),HEARTBEAT(PROPERTIES('keepAliveCron'='0/6
 * * * * ?')))" />
     <distsql-case id="alter-database-discovery-construction-rule" value="ALTER 
DB_DISCOVERY RULE ha_group_0 (RESOURCES(resource0,resource1), 
TYPE=ha_group_0_mgr,HEARTBEAT=ha_group_0_heartbeat)" />
+    <distsql-case id="alter-database-discovery-heartbeat" value="ALTER 
DB_DISCOVERY HEARTBEAT mgr_heartbeat(PROPERTIES('keepAliveCron'='0/5 * * * * 
?'))" />
     <distsql-case id="alter-encrypt-rule" value="ALTER ENCRYPT RULE t_encrypt 
(RESOURCE=ds_1, 
COLUMNS((NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))),
 (NAME=order_id, CIPHER =order_cipher,TYPE(NAME=MD5))))" />
     <distsql-case id="alter-encrypt-rule-with-assisted-query-column" 
value="ALTER ENCRYPT RULE t_encrypt (RESOURCE=ds_1, 
COLUMNS((NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,ASSISTED_QUERY_COLUMN=assisted_column,
 TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))), (NAME=order_id, 
CIPHER =order_cipher,TYPE(NAME=MD5))))" />
     <distsql-case id="alter-encrypt-rule-with-query-with-cipher-column" 
value="ALTER ENCRYPT RULE t_encrypt (RESOURCE=ds_1, 
COLUMNS((NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher, 
TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))), (NAME=order_id, CIPHER 
=order_cipher,TYPE(NAME=MD5))), QUERY_WITH_CIPHER_COLUMN=false)" />
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
index a95ebad..4d1f178 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/rdl/create.xml
@@ -35,6 +35,7 @@
     <distsql-case id="create-database-discovery-definition-rule" value="CREATE 
DB_DISCOVERY RULE ha_group_0 (RESOURCES(resource0,resource1), 
TYPE(NAME=mgr,PROPERTIES(groupName='92504d5b-6dec')),HEARTBEAT(PROPERTIES('keepAliveCron'='0/5
 * * * * ?'))), ha_group_1 (RESOURCES(resource2,resource3), 
TYPE(NAME=mgr2,PROPERTIES(groupName='92504d5b-6dec-2')),HEARTBEAT(PROPERTIES('keepAliveCron'='0/6
 * * * * ?')))" />
     <distsql-case id="create-database-discovery-construction-rule" 
value="CREATE DB_DISCOVERY RULE ha_group_0 (RESOURCES(resource0,resource1), 
TYPE=ha_group_0_mgr,HEARTBEAT=ha_group_0_heartbeat)" />
     <distsql-case id="create-database-discovery-type" value="CREATE 
DB_DISCOVERY TYPE 
primary_replica_ds_mgr(TYPE(NAME=mgr,PROPERTIES('groupName'='92504d5b-6dec'))),primary_replica_ds_mgr_2(TYPE(NAME=mgr))"
 />
+    <distsql-case id="create-database-discovery-heartbeat" value="CREATE 
DB_DISCOVERY HEARTBEAT mgr_heartbeat(PROPERTIES('keepAliveCron'='0/5 * * * * 
?'))" />
     <distsql-case id="create-encrypt-rule" value="CREATE ENCRYPT RULE 
t_encrypt (RESOURCE=ds_1, 
COLUMNS((NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))),
 (NAME=order_id, CIPHER =order_cipher,TYPE(NAME=MD5))))" />
     <distsql-case id="create-encrypt-rule-with-assisted-query-column" 
value="CREATE ENCRYPT RULE t_encrypt (RESOURCE=ds_1, 
COLUMNS((NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,ASSISTED_QUERY_COLUMN=assisted_column,
 TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))), (NAME=order_id, 
CIPHER =order_cipher,TYPE(NAME=MD5))))" />
     <distsql-case id="create-shadow-rule" value="CREATE SHADOW RULE 
shadow_rule(SOURCE=demo_ds,SHADOW=demo_ds_shadow,t_order((TYPE(NAME=COLUMN_REGEX_MATCH,PROPERTIES('operation'='insert','column'='user_id','regex'='[1]'))),(simple_note_algorithm,TYPE(NAME=SIMPLE_NOTE,PROPERTIES('shadow'='true',foo='bar')))))"
 />

Reply via email to