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

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


The following commit(s) were added to refs/heads/master by this push:
     new a2661a750be Add FromDatabaseSQLStatementAttribute (#35777)
a2661a750be is described below

commit a2661a750be0301cb221ba8f549504f04cc8a5af
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jun 21 23:26:37 2025 +0800

    Add FromDatabaseSQLStatementAttribute (#35777)
    
    * Add FromDatabaseSQLStatementAttribute
    
    * Add FromDatabaseSQLStatementAttribute
    
    * Add FromDatabaseSQLStatementAttribute
    
    * Add FromDatabaseSQLStatementAttribute
    
    * Add FromDatabaseSQLStatementAttribute
    
    * Add FromDatabaseSQLStatementAttribute
---
 ...adwriteSplittingStorageUnitStatusStatement.java | 11 ++---
 ...StatusFromReadwriteSplittingRulesStatement.java | 15 +++---
 .../distsql/handler/util/DatabaseNameUtils.java    | 11 ++---
 .../handler/util/DatabaseNameUtilsTest.java        | 16 +++---
 .../ExportDatabaseConfigurationStatement.java      |  9 ++--
 .../queryable/show/ShowTableMetaDataStatement.java | 12 ++---
 .../rql/resource/ShowStorageUnitsStatement.java    | 11 +++--
 .../rql/resource/ShowTablesStatement.java          | 11 +++--
 .../rule/database/ShowDatabaseRulesStatement.java  | 13 ++---
 .../type/FromDatabaseSQLStatementAttribute.java}   | 17 ++++---
 .../FromDatabaseAvailableSQLStatement.java         | 35 -------------
 .../statement/dal/ShowTableStatusStatement.java    | 16 ++++--
 .../core/statement/dal/ShowTablesStatement.java    | 14 ++++--
 .../dal/show/column/MySQLShowColumnsStatement.java | 26 +++++-----
 .../dal/show/index/MySQLShowIndexStatement.java    | 18 +++++--
 .../distsql/DistSQLBackendHandlerFactoryTest.java  | 57 ++++++++++++++++------
 .../distsql/DistSQLQueryBackendHandlerTest.java    |  7 +--
 .../ShowTableMetaDataStatementAssert.java          |  4 +-
 ...eSplittingStorageUnitStatusStatementAssert.java |  8 ++-
 .../rql/impl/ShowRulesStatementAssert.java         | 10 ++--
 .../rql/impl/ShowStorageUnitsStatementAssert.java  |  6 +--
 .../rql/impl/ShowTablesStatementAssert.java        |  6 +--
 22 files changed, 173 insertions(+), 160 deletions(-)

diff --git 
a/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/AlterReadwriteSplittingStorageUnitStatusStatement.java
 
b/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/AlterReadwriteSplittingStorageUnitStatusStatement.java
index 62bc3330a11..c0f2029cac8 100644
--- 
a/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/AlterReadwriteSplittingStorageUnitStatusStatement.java
+++ 
b/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/AlterReadwriteSplittingStorageUnitStatusStatement.java
@@ -21,16 +21,15 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.distsql.statement.ral.updatable.UpdatableRALStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
-
-import java.util.Optional;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 /**
  * Set readwrite-splitting status statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class AlterReadwriteSplittingStorageUnitStatusStatement extends 
UpdatableRALStatement implements FromDatabaseAvailableSQLStatement {
+public final class AlterReadwriteSplittingStorageUnitStatusStatement extends 
UpdatableRALStatement {
     
     private final FromDatabaseSegment fromDatabase;
     
@@ -41,7 +40,7 @@ public final class 
AlterReadwriteSplittingStorageUnitStatusStatement extends Upd
     private final boolean enable;
     
     @Override
-    public Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/ShowStatusFromReadwriteSplittingRulesStatement.java
 
b/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/ShowStatusFromReadwriteSplittingRulesStatement.java
index 762ef2e58c1..0c7c0b5752e 100644
--- 
a/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/ShowStatusFromReadwriteSplittingRulesStatement.java
+++ 
b/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/statement/ShowStatusFromReadwriteSplittingRulesStatement.java
@@ -20,7 +20,8 @@ package 
org.apache.shardingsphere.readwritesplitting.distsql.statement;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.distsql.statement.rql.resource.ResourceQueryStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Optional;
 
@@ -28,17 +29,12 @@ import java.util.Optional;
  * Show status from readwrite-splitting rules statement.
  */
 @RequiredArgsConstructor
-public final class ShowStatusFromReadwriteSplittingRulesStatement extends 
ResourceQueryStatement implements FromDatabaseAvailableSQLStatement {
+public final class ShowStatusFromReadwriteSplittingRulesStatement extends 
ResourceQueryStatement {
     
     private final FromDatabaseSegment fromDatabase;
     
     private final String ruleName;
     
-    @Override
-    public Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
-    }
-    
     /**
      * Get rule name.
      *
@@ -47,4 +43,9 @@ public final class 
ShowStatusFromReadwriteSplittingRulesStatement extends Resour
     public Optional<String> getRuleName() {
         return Optional.ofNullable(ruleName);
     }
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
+    }
 }
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtils.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtils.java
index f86f1258cf4..4768f45f89e 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtils.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtils.java
@@ -20,9 +20,8 @@ package org.apache.shardingsphere.distsql.handler.util;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DatabaseSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Optional;
 
@@ -40,9 +39,9 @@ public final class DatabaseNameUtils {
      * @return database name
      */
     public static String getDatabaseName(final SQLStatement sqlStatement, 
final String currentDatabaseName) {
-        Optional<DatabaseSegment> databaseSegment = sqlStatement instanceof 
FromDatabaseAvailableSQLStatement
-                ? ((FromDatabaseAvailableSQLStatement) 
sqlStatement).getFromDatabase().map(FromDatabaseSegment::getDatabase)
-                : Optional.empty();
-        return databaseSegment.map(optional -> 
optional.getIdentifier().getValue()).orElse(currentDatabaseName);
+        Optional<FromDatabaseSQLStatementAttribute> fromDatabaseAttribute = 
sqlStatement.getAttributes().findAttribute(FromDatabaseSQLStatementAttribute.class);
+        return fromDatabaseAttribute.isPresent()
+                ? 
fromDatabaseAttribute.get().getFromDatabase().map(FromDatabaseSegment::getDatabase).map(optional
 -> optional.getIdentifier().getValue()).orElse(currentDatabaseName)
+                : currentDatabaseName;
     }
 }
diff --git 
a/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtilsTest.java
 
b/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtilsTest.java
index b29a8920d40..b8e6d218a3b 100644
--- 
a/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtilsTest.java
+++ 
b/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/util/DatabaseNameUtilsTest.java
@@ -18,32 +18,32 @@
 package org.apache.shardingsphere.distsql.handler.util;
 
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 import org.junit.jupiter.api.Test;
 
-import java.util.Optional;
-
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.withSettings;
 
 class DatabaseNameUtilsTest {
     
     @Test
     void assertDatabaseNameWhenAvailableInSQLStatement() {
-        FromDatabaseAvailableSQLStatement sqlStatement = 
mock(FromDatabaseAvailableSQLStatement.class, 
withSettings().extraInterfaces(SQLStatement.class));
         FromDatabaseSegment databaseSegment = mock(FromDatabaseSegment.class, 
RETURNS_DEEP_STUBS);
         
when(databaseSegment.getDatabase().getIdentifier().getValue()).thenReturn("bar_db");
-        
when(sqlStatement.getFromDatabase()).thenReturn(Optional.of(databaseSegment));
-        assertThat(DatabaseNameUtils.getDatabaseName((SQLStatement) 
sqlStatement, "foo_db"), is("bar_db"));
+        SQLStatement sqlStatement = mock(SQLStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new FromDatabaseSQLStatementAttribute(databaseSegment)));
+        assertThat(DatabaseNameUtils.getDatabaseName(sqlStatement, "foo_db"), 
is("bar_db"));
     }
     
     @Test
     void assertDatabaseNameWhenNotAvailableInSQLStatement() {
-        assertThat(DatabaseNameUtils.getDatabaseName(mock(SQLStatement.class), 
"foo_db"), is("foo_db"));
+        SQLStatement sqlStatement = mock(SQLStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(DatabaseNameUtils.getDatabaseName(sqlStatement, "foo_db"), 
is("foo_db"));
     }
 }
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/export/ExportDatabaseConfigurationStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/export/ExportDatabaseConfigurationStatement.java
index 060d7dcea30..44a5df29fdf 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/export/ExportDatabaseConfigurationStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/export/ExportDatabaseConfigurationStatement.java
@@ -20,7 +20,8 @@ package 
org.apache.shardingsphere.distsql.statement.ral.queryable.export;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.distsql.statement.ral.queryable.QueryableRALStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Optional;
 
@@ -28,7 +29,7 @@ import java.util.Optional;
  * Export database configuration statement.
  */
 @RequiredArgsConstructor
-public final class ExportDatabaseConfigurationStatement extends 
QueryableRALStatement implements FromDatabaseAvailableSQLStatement {
+public final class ExportDatabaseConfigurationStatement extends 
QueryableRALStatement {
     
     private final String filePath;
     
@@ -44,7 +45,7 @@ public final class ExportDatabaseConfigurationStatement 
extends QueryableRALStat
     }
     
     @Override
-    public Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/show/ShowTableMetaDataStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/show/ShowTableMetaDataStatement.java
index 5016f803fed..97951582b4b 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/show/ShowTableMetaDataStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/queryable/show/ShowTableMetaDataStatement.java
@@ -21,24 +21,24 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.distsql.statement.ral.queryable.QueryableRALStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Collection;
-import java.util.Optional;
 
 /**
  * Show table meta data statement.
  */
 @RequiredArgsConstructor
-public final class ShowTableMetaDataStatement extends QueryableRALStatement 
implements FromDatabaseAvailableSQLStatement {
+@Getter
+public final class ShowTableMetaDataStatement extends QueryableRALStatement {
     
-    @Getter
     private final Collection<String> tableNames;
     
     private final FromDatabaseSegment fromDatabase;
     
     @Override
-    public Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
index b5d84668243..d4e3714a1fd 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
@@ -20,16 +20,17 @@ package 
org.apache.shardingsphere.distsql.statement.rql.resource;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Optional;
 
 /**
  * Show storage unit statement.
  */
-@Getter
 @RequiredArgsConstructor
-public final class ShowStorageUnitsStatement extends ResourceQueryStatement 
implements FromDatabaseAvailableSQLStatement {
+@Getter
+public final class ShowStorageUnitsStatement extends ResourceQueryStatement {
     
     private final FromDatabaseSegment fromDatabase;
     
@@ -45,7 +46,7 @@ public final class ShowStorageUnitsStatement extends 
ResourceQueryStatement impl
     }
     
     @Override
-    public Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowTablesStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowTablesStatement.java
index ade7dd19a60..a3237d8e1d3 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowTablesStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowTablesStatement.java
@@ -17,9 +17,11 @@
 
 package org.apache.shardingsphere.distsql.statement.rql.resource;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Optional;
 
@@ -27,7 +29,8 @@ import java.util.Optional;
  * Show tables statement.
  */
 @RequiredArgsConstructor
-public abstract class ShowTablesStatement extends ResourceQueryStatement 
implements FromDatabaseAvailableSQLStatement {
+@Getter
+public abstract class ShowTablesStatement extends ResourceQueryStatement {
     
     private final FromDatabaseSegment fromDatabase;
     
@@ -43,7 +46,7 @@ public abstract class ShowTablesStatement extends 
ResourceQueryStatement impleme
     }
     
     @Override
-    public final Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowDatabaseRulesStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowDatabaseRulesStatement.java
index 80b27c5e8d2..1d3e2b890dc 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowDatabaseRulesStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowDatabaseRulesStatement.java
@@ -17,23 +17,24 @@
 
 package org.apache.shardingsphere.distsql.statement.rql.rule.database;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.distsql.statement.rql.rule.RuleQueryStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
-
-import java.util.Optional;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 /**
  * Show database rules statement.
  */
 @RequiredArgsConstructor
-public abstract class ShowDatabaseRulesStatement extends RuleQueryStatement 
implements FromDatabaseAvailableSQLStatement {
+@Getter
+public abstract class ShowDatabaseRulesStatement extends RuleQueryStatement {
     
     private final FromDatabaseSegment fromDatabase;
     
     @Override
-    public final Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowDatabaseRulesStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/FromDatabaseSQLStatementAttribute.java
similarity index 72%
copy from 
parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowDatabaseRulesStatement.java
copy to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/FromDatabaseSQLStatementAttribute.java
index 80b27c5e8d2..ea213fe343a 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowDatabaseRulesStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/FromDatabaseSQLStatementAttribute.java
@@ -15,25 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.statement.rql.rule.database;
+package 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type;
 
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.statement.rql.rule.RuleQueryStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttribute;
 
 import java.util.Optional;
 
 /**
- * Show database rules statement.
+ * From database SQL statement attribute.
  */
 @RequiredArgsConstructor
-public abstract class ShowDatabaseRulesStatement extends RuleQueryStatement 
implements FromDatabaseAvailableSQLStatement {
+public final class FromDatabaseSQLStatementAttribute implements 
SQLStatementAttribute {
     
     private final FromDatabaseSegment fromDatabase;
     
-    @Override
-    public final Optional<FromDatabaseSegment> getFromDatabase() {
+    /**
+     * Get from database.
+     *
+     * @return from database
+     */
+    public Optional<FromDatabaseSegment> getFromDatabase() {
         return Optional.ofNullable(fromDatabase);
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/FromDatabaseAvailableSQLStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/FromDatabaseAvailableSQLStatement.java
deleted file mode 100644
index c406baac632..00000000000
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/FromDatabaseAvailableSQLStatement.java
+++ /dev/null
@@ -1,35 +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.sql.parser.statement.core.statement.available;
-
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
-
-import java.util.Optional;
-
-/**
- * From database available SQL statement.
- */
-public interface FromDatabaseAvailableSQLStatement {
-    
-    /**
-     * Get from database.
-     *
-     * @return from database
-     */
-    Optional<FromDatabaseSegment> getFromDatabase();
-}
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java
index 2defb542d01..fee7dc4252e 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTableStatusStatement.java
@@ -17,13 +17,14 @@
 
 package org.apache.shardingsphere.sql.parser.statement.core.statement.dal;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.ShowFilterSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.DatabaseSelectRequiredSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.DatabaseSelectRequiredSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Optional;
 
@@ -31,13 +32,18 @@ import java.util.Optional;
  * Show table status statement.
  */
 @RequiredArgsConstructor
-public final class ShowTableStatusStatement extends AbstractSQLStatement 
implements DALStatement, FromDatabaseAvailableSQLStatement {
+@Getter
+public final class ShowTableStatusStatement extends AbstractSQLStatement 
implements DALStatement {
     
     private final FromDatabaseSegment fromDatabase;
     
     private final ShowFilterSegment filter;
     
-    @Override
+    /**
+     * Get from database.
+     *
+     * @return from database
+     */
     public Optional<FromDatabaseSegment> getFromDatabase() {
         return Optional.ofNullable(fromDatabase);
     }
@@ -53,6 +59,6 @@ public final class ShowTableStatusStatement extends 
AbstractSQLStatement impleme
     
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute());
+        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute(), new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java
index e3195334f93..90f07fa1135 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowTablesStatement.java
@@ -22,9 +22,9 @@ import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.ShowFilterSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.DatabaseSelectRequiredSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.DatabaseSelectRequiredSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 
 import java.util.Optional;
 
@@ -33,7 +33,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class ShowTablesStatement extends AbstractSQLStatement implements 
DALStatement, FromDatabaseAvailableSQLStatement {
+public final class ShowTablesStatement extends AbstractSQLStatement implements 
DALStatement {
     
     private final FromDatabaseSegment fromDatabase;
     
@@ -41,7 +41,11 @@ public final class ShowTablesStatement extends 
AbstractSQLStatement implements D
     
     private final boolean containsFull;
     
-    @Override
+    /**
+     * Get from database.
+     *
+     * @return from database
+     */
     public Optional<FromDatabaseSegment> getFromDatabase() {
         return Optional.ofNullable(fromDatabase);
     }
@@ -57,6 +61,6 @@ public final class ShowTablesStatement extends 
AbstractSQLStatement implements D
     
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute());
+        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute(), new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLShowColumnsStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLShowColumnsStatement.java
index 4c6b145d1f2..e3447c6cbf0 100644
--- 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLShowColumnsStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLShowColumnsStatement.java
@@ -23,9 +23,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatab
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.ShowFilterSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.ColumnInResultSetSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.ColumnInResultSetSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
@@ -38,11 +38,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLShowColumnsStatement extends AbstractSQLStatement
-        implements
-            DALStatement,
-            TableAvailableSQLStatement,
-            FromDatabaseAvailableSQLStatement {
+public final class MySQLShowColumnsStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
     
     private final SimpleTableSegment table;
     
@@ -50,6 +46,15 @@ public final class MySQLShowColumnsStatement extends 
AbstractSQLStatement
     
     private final ShowFilterSegment filter;
     
+    /**
+     * Get from database.
+     *
+     * @return from database
+     */
+    public Optional<FromDatabaseSegment> getFromDatabase() {
+        return Optional.ofNullable(fromDatabase);
+    }
+    
     /**
      * Get filter segment.
      *
@@ -64,13 +69,8 @@ public final class MySQLShowColumnsStatement extends 
AbstractSQLStatement
         return Collections.singleton(table);
     }
     
-    @Override
-    public Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
-    }
-    
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
ColumnInResultSetSQLStatementAttribute(1));
+        return new SQLStatementAttributes(new 
ColumnInResultSetSQLStatementAttribute(1), new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/index/MySQLShowIndexStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/index/MySQLShowIndexStatement.java
index d1bb23f52ed..d4eb0bd3eaa 100644
--- 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/index/MySQLShowIndexStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/index/MySQLShowIndexStatement.java
@@ -22,7 +22,8 @@ import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.FromDatabaseSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.FromDatabaseSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
@@ -35,19 +36,28 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLShowIndexStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement, 
FromDatabaseAvailableSQLStatement {
+public final class MySQLShowIndexStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
     
     private final SimpleTableSegment table;
     
     private final FromDatabaseSegment fromDatabase;
     
+    /**
+     * Get from database.
+     *
+     * @return from database
+     */
+    public Optional<FromDatabaseSegment> getFromDatabase() {
+        return Optional.ofNullable(fromDatabase);
+    }
+    
     @Override
     public Collection<SimpleTableSegment> getTables() {
         return Collections.singleton(table);
     }
     
     @Override
-    public Optional<FromDatabaseSegment> getFromDatabase() {
-        return Optional.ofNullable(fromDatabase);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
     }
 }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
index 083072990cf..47c01bf8fbf 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
@@ -17,12 +17,12 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql;
 
-import 
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.MissingRequiredRuleException;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
 import 
org.apache.shardingsphere.distsql.statement.rdl.resource.unit.type.AlterStorageUnitStatement;
 import 
org.apache.shardingsphere.distsql.statement.rdl.resource.unit.type.RegisterStorageUnitStatement;
 import 
org.apache.shardingsphere.distsql.statement.rdl.resource.unit.type.UnregisterStorageUnitStatement;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
+import 
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
@@ -48,6 +48,7 @@ import 
org.apache.shardingsphere.shadow.distsql.statement.ShowShadowRulesStateme
 import 
org.apache.shardingsphere.shadow.distsql.statement.ShowShadowTableRulesStatement;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
 import 
org.apache.shardingsphere.sharding.distsql.statement.CreateShardingTableRuleStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.apache.shardingsphere.test.util.PropertiesBuilder;
@@ -114,41 +115,55 @@ class DistSQLBackendHandlerFactoryTest {
     
     @Test
     void assertExecuteDataSourcesContext() throws SQLException {
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(RegisterStorageUnitStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        RegisterStorageUnitStatement sqlStatement = 
mock(RegisterStorageUnitStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteShardingTableRuleContext() throws SQLException {
         
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db").getRuleMetaData()).thenReturn(new
 RuleMetaData(Collections.emptyList()));
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(CreateShardingTableRuleStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        CreateShardingTableRuleStatement sqlStatement = 
mock(CreateShardingTableRuleStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteAddResourceContext() throws SQLException {
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(RegisterStorageUnitStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        RegisterStorageUnitStatement sqlStatement = 
mock(RegisterStorageUnitStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteAlterResourceContext() throws SQLException {
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(AlterStorageUnitStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        AlterStorageUnitStatement sqlStatement = 
mock(AlterStorageUnitStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteAlterShadowRuleContext() throws SQLException {
         mockRuleMetaData();
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(AlterShadowRuleStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        AlterShadowRuleStatement sqlStatement = 
mock(AlterShadowRuleStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteCreateShadowRuleContext() throws SQLException {
         mockRuleMetaData();
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(CreateShadowRuleStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        CreateShadowRuleStatement sqlStatement = 
mock(CreateShadowRuleStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteDropShadowRuleContext() throws SQLException {
         mockRuleMetaData();
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(DropShadowRuleStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        DropShadowRuleStatement sqlStatement = 
mock(DropShadowRuleStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
@@ -162,45 +177,55 @@ class DistSQLBackendHandlerFactoryTest {
     @Test
     void assertExecuteShowShadowRulesContext() throws SQLException {
         mockRuleMetaData();
-        assertThat(new 
DistSQLQueryBackendHandler(mock(ShowShadowRulesStatement.class), 
connectionSession).execute(), instanceOf(QueryResponseHeader.class));
+        assertThat(new 
DistSQLQueryBackendHandler(mock(ShowShadowRulesStatement.class, 
RETURNS_DEEP_STUBS), connectionSession).execute(), 
instanceOf(QueryResponseHeader.class));
     }
     
     @Test
     void assertExecuteShowShadowTableRulesContext() throws SQLException {
         mockRuleMetaData();
-        assertThat(new 
DistSQLQueryBackendHandler(mock(ShowShadowTableRulesStatement.class), 
connectionSession).execute(), instanceOf(QueryResponseHeader.class));
+        ShowShadowTableRulesStatement sqlStatement = 
mock(ShowShadowTableRulesStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLQueryBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(QueryResponseHeader.class));
     }
     
     @Test
     void assertExecuteShowShadowAlgorithmsContext() throws SQLException {
         mockRuleMetaData();
-        assertThat(new 
DistSQLQueryBackendHandler(mock(ShowShadowAlgorithmsStatement.class), 
connectionSession).execute(), instanceOf(QueryResponseHeader.class));
+        ShowShadowAlgorithmsStatement sqlStatement = 
mock(ShowShadowAlgorithmsStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLQueryBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(QueryResponseHeader.class));
     }
     
     @Test
     void assertExecuteDropShadowAlgorithmContext() throws SQLException {
         mockRuleMetaData();
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(DropShadowAlgorithmStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        DropShadowAlgorithmStatement sqlStatement = 
mock(DropShadowAlgorithmStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteDropResourceContext() throws SQLException {
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(UnregisterStorageUnitStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        UnregisterStorageUnitStatement sqlStatement = 
mock(UnregisterStorageUnitStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteDropReadwriteSplittingRuleContext() {
-        assertThrows(MissingRequiredRuleException.class, () -> new 
DistSQLUpdateBackendHandler(mock(DropReadwriteSplittingRuleStatement.class), 
connectionSession).execute());
+        assertThrows(MissingRequiredRuleException.class, () -> new 
DistSQLUpdateBackendHandler(mock(DropReadwriteSplittingRuleStatement.class, 
RETURNS_DEEP_STUBS), connectionSession).execute());
     }
     
     @Test
     void assertExecuteCreateReadwriteSplittingRuleContext() throws 
SQLException {
-        assertThat(new 
DistSQLUpdateBackendHandler(mock(CreateReadwriteSplittingRuleStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
+        CreateReadwriteSplittingRuleStatement sqlStatement = 
mock(CreateReadwriteSplittingRuleStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        assertThat(new DistSQLUpdateBackendHandler(sqlStatement, 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
     @Test
     void assertExecuteAlterReadwriteSplittingRuleContext() {
-        assertThrows(MissingRequiredRuleException.class, () -> new 
DistSQLUpdateBackendHandler(mock(AlterReadwriteSplittingRuleStatement.class), 
connectionSession).execute());
+        assertThrows(MissingRequiredRuleException.class, () -> new 
DistSQLUpdateBackendHandler(mock(AlterReadwriteSplittingRuleStatement.class, 
RETURNS_DEEP_STUBS), connectionSession).execute());
     }
     
     private void mockRuleMetaData() {
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandlerTest.java
index c52140ad318..63de2257d35 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandlerTest.java
@@ -65,7 +65,7 @@ class DistSQLQueryBackendHandlerTest {
     @Test
     void assertExecuteWithNoDatabase() {
         assertThrows(NoDatabaseSelectedException.class,
-                () -> new 
DistSQLQueryBackendHandler(mock(ExportDatabaseConfigurationStatement.class), 
mock(ConnectionSession.class, RETURNS_DEEP_STUBS)).execute());
+                () -> new 
DistSQLQueryBackendHandler(mock(ExportDatabaseConfigurationStatement.class, 
RETURNS_DEEP_STUBS), mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS)).execute());
     }
     
     @Test
@@ -78,12 +78,13 @@ class DistSQLQueryBackendHandlerTest {
         
when(computeNodeInstanceContext.getModeConfiguration()).thenReturn(mock(ModeConfiguration.class));
         ContextManager contextManager = new ContextManager(metaDataContexts, 
computeNodeInstanceContext, mock(), mock(PersistRepository.class));
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        assertThrows(UnknownDatabaseException.class, () -> new 
DistSQLQueryBackendHandler(mock(ExportDatabaseConfigurationStatement.class), 
connectionSession).execute());
+        assertThrows(UnknownDatabaseException.class, () -> new 
DistSQLQueryBackendHandler(mock(ExportDatabaseConfigurationStatement.class, 
RETURNS_DEEP_STUBS), connectionSession).execute());
     }
     
     @Test
     void assertExecuteWithAbstractStatement() {
-        assertThrows(ServiceProviderNotFoundException.class, () -> new 
DistSQLQueryBackendHandler(mock(QueryableRALStatement.class), 
mock(ConnectionSession.class, RETURNS_DEEP_STUBS)).execute());
+        assertThrows(ServiceProviderNotFoundException.class,
+                () -> new 
DistSQLQueryBackendHandler(mock(QueryableRALStatement.class, 
RETURNS_DEEP_STUBS), mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS)).execute());
     }
     
     @Test
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/queryable/ShowTableMetaDataStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/queryable/ShowTableMetaDataStatementAssert.java
index 0e5b6fea22c..8e545767795 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/queryable/ShowTableMetaDataStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/queryable/ShowTableMetaDataStatementAssert.java
@@ -27,7 +27,6 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Show table meta data statement assert.
@@ -44,8 +43,7 @@ public final class ShowTableMetaDataStatementAssert {
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final ShowTableMetaDataStatement actual, final 
ShowTableMetaDataStatementTestCase expected) {
         if (ExistingAssert.assertIs(assertContext, actual, expected)) {
-            assertTrue(actual.getFromDatabase().isPresent());
-            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().get().getDatabase(), expected.getDatabase());
+            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().getDatabase(), expected.getDatabase());
             assertThat(assertContext.getText("Table assertion error:"), 
actual.getTableNames(), is(expected.getTableNames()));
         }
     }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/updatable/AlterReadwriteSplittingStorageUnitStatusStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/updatable/AlterReadwriteSplittingStorageUnitStatusStatementAssert.java
index 2280a035306..7dff1526dc9 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/updatable/AlterReadwriteSplittingStorageUnitStatusStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/updatable/AlterReadwriteSplittingStorageUnitStatusStatementAssert.java
@@ -28,8 +28,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class AlterReadwriteSplittingStorageUnitStatusStatementAssert {
@@ -53,10 +52,9 @@ public final class 
AlterReadwriteSplittingStorageUnitStatusStatementAssert {
     
     private static void assertIs(final SQLCaseAssertContext assertContext, 
final AlterReadwriteSplittingStorageUnitStatusStatement actual, final 
DatabaseContainedTestCase expected) {
         if (null == expected.getDatabase()) {
-            assertFalse(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should not exist."));
+            assertNull(actual.getFromDatabase(), assertContext.getText("Actual 
database should not exist."));
         } else {
-            assertTrue(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should exist."));
-            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().get().getDatabase(), expected.getDatabase());
+            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().getDatabase(), expected.getDatabase());
         }
     }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowRulesStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowRulesStatementAssert.java
index 2eb496277da..04f561d1800 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowRulesStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowRulesStatementAssert.java
@@ -22,13 +22,12 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.distsql.statement.rql.rule.database.ShowDatabaseRulesStatement;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.database.DatabaseAssert;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.DatabaseContainedTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.DatabaseContainedTestCase;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 /**
  * Show rules statement assert.
@@ -50,10 +49,9 @@ public final class ShowRulesStatementAssert {
     
     private static void assertIs(final SQLCaseAssertContext assertContext, 
final ShowDatabaseRulesStatement actual, final DatabaseContainedTestCase 
expected) {
         if (null == expected.getDatabase()) {
-            assertFalse(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should not exist."));
+            assertNull(actual.getFromDatabase(), assertContext.getText("Actual 
database should not exist."));
         } else {
-            assertTrue(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should exist."));
-            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().get().getDatabase(), expected.getDatabase());
+            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().getDatabase(), expected.getDatabase());
         }
     }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowStorageUnitsStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowStorageUnitsStatementAssert.java
index ba368ae3eee..ec6f3b58b50 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowStorageUnitsStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowStorageUnitsStatementAssert.java
@@ -29,6 +29,7 @@ import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
@@ -51,10 +52,9 @@ public final class ShowStorageUnitsStatementAssert {
     
     private static void assertIs(final SQLCaseAssertContext assertContext, 
final ShowStorageUnitsStatement actual, final ShowStorageUnitsStatementTestCase 
expected) {
         if (null == expected.getDatabase()) {
-            assertFalse(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should not exist."));
+            assertNull(actual.getFromDatabase(), assertContext.getText("Actual 
database should not exist."));
         } else {
-            assertTrue(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should exist."));
-            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().get().getDatabase(), expected.getDatabase());
+            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().getDatabase(), expected.getDatabase());
         }
         if (null == expected.getLikePattern()) {
             assertFalse(actual.getLikePattern().isPresent(), 
assertContext.getText("Actual like pattern should not exist."));
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowTablesStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowTablesStatementAssert.java
index 5d67cbca684..a5efb5eeacc 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowTablesStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rql/impl/ShowTablesStatementAssert.java
@@ -29,6 +29,7 @@ import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
@@ -51,10 +52,9 @@ public final class ShowTablesStatementAssert {
     
     private static void assertIs(final SQLCaseAssertContext assertContext, 
final ShowTablesStatement actual, final ShowTableStatementTestCase expected) {
         if (null == expected.getDatabase()) {
-            assertFalse(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should not exist."));
+            assertNull(actual.getFromDatabase(), assertContext.getText("Actual 
database should not exist."));
         } else {
-            assertTrue(actual.getFromDatabase().isPresent(), 
assertContext.getText("Actual database should exist."));
-            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().get().getDatabase(), expected.getDatabase());
+            DatabaseAssert.assertIs(assertContext, 
actual.getFromDatabase().getDatabase(), expected.getDatabase());
         }
         if (null == expected.getLikePattern()) {
             assertFalse(actual.getLikePattern().isPresent(), 
assertContext.getText("Actual like pattern should not exist."));

Reply via email to