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 1a3f3497774 Add TableSQLStatementAttribute (#35778)
1a3f3497774 is described below

commit 1a3f3497774abbcbeae8fb6e9198f909b2ad3802
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Jun 22 00:36:27 2025 +0800

    Add TableSQLStatementAttribute (#35778)
    
    * Add TableSQLStatementAttribute
    
    * Add TableSQLStatementAttribute
    
    * Add TableSQLStatementAttribute
    
    * Add TableSQLStatementAttribute
    
    * Add TableSQLStatementAttribute
    
    * Add TableSQLStatementAttribute
---
 ...ShardingCreateFunctionSupportedCheckerTest.java | 13 ++++----
 .../ShardingRenameTableSupportedCheckerTest.java   |  4 ++-
 .../sql/dml/ShardingCopySupportedCheckerTest.java  |  3 ++
 .../dml/ShardingLoadDataSupportedCheckerTest.java  |  8 ++---
 .../dml/ShardingLoadXmlSupportedCheckerTest.java   |  8 ++---
 .../merge/ShardingResultMergerEngineTest.java      | 12 ++++++--
 ...ShardingRenameTableRouteContextCheckerTest.java |  4 ++-
 .../binder/context/SQLStatementContextFactory.java | 10 +++----
 .../statement/type/CommonSQLStatementContext.java  |  4 +--
 .../type/dal/ExplainStatementContext.java          |  4 ++-
 .../statement/SQLStatementContextFactoryTest.java  |  2 ++
 .../sql/SingleDropSchemaSupportedCheckerTest.java  |  2 ++
 .../sql/SingleDropTableSupportedCheckerTest.java   |  2 ++
 .../type/TableSQLStatementAttribute.java}          | 14 +++++----
 .../available/TableAvailableSQLStatement.java      | 35 ----------------------
 .../core/statement/dal/AnalyzeTableStatement.java  | 12 +++++---
 .../core/statement/dal/ExplainStatement.java       | 12 ++++----
 .../statement/dal/ShowCreateTableStatement.java    | 16 +++-------
 .../core/statement/dcl/DenyUserStatement.java      | 10 +++----
 .../core/statement/dcl/GrantStatement.java         | 10 +++++--
 .../core/statement/dcl/RevokeStatement.java        | 10 +++++--
 .../core/statement/ddl/CommentStatement.java       | 10 +++----
 .../statement/ddl/CreateFunctionStatement.java     | 12 ++++----
 .../core/statement/ddl/DropTableStatement.java     | 10 +++++--
 .../core/statement/ddl/DropViewStatement.java      |  9 +++---
 .../core/statement/ddl/PrepareStatement.java       | 12 ++++----
 .../core/statement/ddl/RenameTableStatement.java   | 15 +++++-----
 .../core/statement/ddl/TruncateStatement.java      | 10 +++++--
 .../core/statement/dml/CopyStatement.java          |  9 +++---
 .../core/statement/dml/LoadDataStatement.java      | 12 ++++----
 .../core/statement/dml/LoadXMLStatement.java       | 12 ++++----
 .../statement/mysql/dal/MySQLFlushStatement.java   | 10 +++++--
 .../mysql/dal/MySQLOptimizeTableStatement.java     | 10 +++++--
 .../dal/show/column/MySQLDescribeStatement.java    | 15 +++-------
 .../dal/show/column/MySQLShowColumnsStatement.java | 13 ++------
 .../dal/show/index/MySQLShowIndexStatement.java    | 13 ++------
 .../backend/connector/ProxySQLExecutorTest.java    |  4 ++-
 37 files changed, 184 insertions(+), 187 deletions(-)

diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
index 57dbb4bf362..7bb7cd0761a 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.sharding.checker.sql.ddl;
 
-import 
org.apache.shardingsphere.infra.binder.context.statement.type.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.type.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.TableExistsException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -29,6 +29,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.R
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.ValidStatementSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateFunctionStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
@@ -38,7 +40,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
-import java.util.Collections;
 import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@@ -69,7 +70,7 @@ class ShardingCreateFunctionSupportedCheckerTest {
         routineBody.getValidStatements().add(selectValidStatementSegment);
         CreateFunctionStatement sqlStatement = 
mock(CreateFunctionStatement.class);
         
when(sqlStatement.getRoutineBody()).thenReturn(Optional.of(routineBody));
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(fromTable));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(fromTable)));
         SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(mock(), sqlStatement);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
@@ -88,7 +89,7 @@ class ShardingCreateFunctionSupportedCheckerTest {
         routineBody.getValidStatements().add(validStatementSegment);
         CreateFunctionStatement sqlStatement = 
mock(CreateFunctionStatement.class);
         
when(sqlStatement.getRoutineBody()).thenReturn(Optional.of(routineBody));
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(fromTable));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(fromTable)));
         SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(mock(), sqlStatement);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(rule.isShardingTable("foo_tbl")).thenReturn(true);
@@ -106,7 +107,7 @@ class ShardingCreateFunctionSupportedCheckerTest {
         routineBody.getValidStatements().add(validStatementSegment);
         CreateFunctionStatement sqlStatement = 
mock(CreateFunctionStatement.class);
         
when(sqlStatement.getRoutineBody()).thenReturn(Optional.of(routineBody));
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(fromTable));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(fromTable)));
         SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(mock(), sqlStatement);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         assertThrows(NoSuchTableException.class, () -> new 
ShardingCreateFunctionSupportedChecker().check(rule, database, mock(), 
sqlStatementContext));
@@ -123,7 +124,7 @@ class ShardingCreateFunctionSupportedCheckerTest {
         routineBody.getValidStatements().add(validStatementSegment);
         CreateFunctionStatement sqlStatement = 
mock(CreateFunctionStatement.class);
         
when(sqlStatement.getRoutineBody()).thenReturn(Optional.of(routineBody));
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(table));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(table)));
         SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(mock(), sqlStatement);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingRenameTableSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingRenameTableSupportedCheckerTest.java
index 5e5d0c34d40..b5d032633d4 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingRenameTableSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingRenameTableSupportedCheckerTest.java
@@ -24,6 +24,8 @@ import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
@@ -67,7 +69,7 @@ class ShardingRenameTableSupportedCheckerTest {
         renameTableDefinitionSegment.setTable(table);
         renameTableDefinitionSegment.setRenameTable(renameTable);
         
when(sqlStatement.getRenameTables()).thenReturn(Collections.singleton(renameTableDefinitionSegment));
-        when(sqlStatement.getTables()).thenReturn(Arrays.asList(table, 
renameTable));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(Arrays.asList(table, 
renameTable))));
         return new CommonSQLStatementContext(mock(), sqlStatement);
     }
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java
index 603c59230e6..0371b36ebaa 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java
@@ -22,6 +22,8 @@ import 
org.apache.shardingsphere.sharding.exception.syntax.UnsupportedShardingOp
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.CopyStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
@@ -57,6 +59,7 @@ class ShardingCopySupportedCheckerTest {
         CopyStatement sqlStatement = mock(CopyStatement.class);
         SimpleTableSegment table = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("foo_tbl")));
         when(sqlStatement.getTable()).thenReturn(Optional.of(table));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(table)));
         return new CommonSQLStatementContext(mock(), sqlStatement);
     }
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java
index 4bce713fe3d..c97d9679628 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java
@@ -22,6 +22,8 @@ import 
org.apache.shardingsphere.sharding.exception.syntax.UnsupportedShardingOp
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadDataStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
@@ -29,8 +31,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
-import java.util.Collections;
-
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
@@ -47,7 +47,7 @@ class ShardingLoadDataSupportedCheckerTest {
         LoadDataStatement sqlStatement = mock(LoadDataStatement.class);
         SimpleTableSegment table = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("foo_tbl")));
         when(sqlStatement.getTable()).thenReturn(table);
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(table));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(table)));
         assertDoesNotThrow(() -> new 
ShardingLoadDataSupportedChecker().check(rule, mock(), mock(), new 
CommonSQLStatementContext(mock(), sqlStatement)));
     }
     
@@ -56,7 +56,7 @@ class ShardingLoadDataSupportedCheckerTest {
         LoadDataStatement sqlStatement = mock(LoadDataStatement.class);
         SimpleTableSegment table = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("foo_tbl")));
         when(sqlStatement.getTable()).thenReturn(table);
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(table));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(table)));
         when(rule.isShardingTable("foo_tbl")).thenReturn(true);
         assertThrows(UnsupportedShardingOperationException.class, () -> new 
ShardingLoadDataSupportedChecker().check(rule, mock(), mock(), new 
CommonSQLStatementContext(mock(), sqlStatement)));
     }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java
index 5ef51d70f51..0bf58defa05 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java
@@ -22,6 +22,8 @@ import 
org.apache.shardingsphere.sharding.exception.syntax.UnsupportedShardingOp
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadXMLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
@@ -29,8 +31,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
-import java.util.Collections;
-
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
@@ -47,7 +47,7 @@ class ShardingLoadXmlSupportedCheckerTest {
         LoadXMLStatement sqlStatement = mock(LoadXMLStatement.class);
         SimpleTableSegment table = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("foo_tbl")));
         when(sqlStatement.getTable()).thenReturn(table);
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(table));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(table)));
         assertDoesNotThrow(() -> new 
ShardingLoadXmlSupportedChecker().check(rule, mock(), mock(), new 
CommonSQLStatementContext(mock(), sqlStatement)));
     }
     
@@ -57,7 +57,7 @@ class ShardingLoadXmlSupportedCheckerTest {
         SimpleTableSegment table = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("foo_tbl")));
         when(sqlStatement.getTable()).thenReturn(table);
         when(rule.isShardingTable("foo_tbl")).thenReturn(true);
-        
when(sqlStatement.getTables()).thenReturn(Collections.singleton(table));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(table)));
         assertThrows(UnsupportedShardingOperationException.class, () -> new 
ShardingLoadXmlSupportedChecker().check(rule, mock(), mock(), new 
CommonSQLStatementContext(mock(), sqlStatement)));
     }
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java
index 0c43c58306d..6a5f2239839 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/ShardingResultMergerEngineTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.sharding.merge;
 
-import 
org.apache.shardingsphere.infra.binder.context.statement.type.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.type.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.InsertStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
@@ -35,6 +35,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.In
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+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.dal.ShowStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.FetchStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
@@ -70,7 +72,9 @@ class ShardingResultMergerEngineTest {
     @Test
     void assertNewInstanceWithDALStatement() {
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
-        SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(databaseType, mock(ShowStatement.class));
+        SQLStatement sqlStatement = mock(ShowStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(databaseType, sqlStatement);
         assertThat(new ShardingResultMergerEngine().newInstance("foo_db", 
databaseType, null, props, sqlStatementContext), 
instanceOf(ShardingDALResultMerger.class));
     }
     
@@ -94,7 +98,9 @@ class ShardingResultMergerEngineTest {
     @Test
     void assertNewInstanceWithDDLStatement() {
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
-        SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(databaseType, mock(FetchStatement.class));
+        SQLStatement sqlStatement = mock(FetchStatement.class);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        SQLStatementContext sqlStatementContext = new 
CommonSQLStatementContext(databaseType, sqlStatement);
         assertThat(new ShardingResultMergerEngine().newInstance("foo_db", 
databaseType, null, props, sqlStatementContext), 
instanceOf(ShardingDDLResultMerger.class));
     }
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingRenameTableRouteContextCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingRenameTableRouteContextCheckerTest.java
index 97fe237469f..b197e16dab3 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingRenameTableRouteContextCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingRenameTableRouteContextCheckerTest.java
@@ -31,6 +31,8 @@ import org.apache.shardingsphere.sharding.rule.ShardingTable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
@@ -93,7 +95,7 @@ class ShardingRenameTableRouteContextCheckerTest {
         SimpleTableSegment renameTable = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("bar_tbl")));
         renameTableDefinitionSegment.setRenameTable(renameTable);
         
when(sqlStatement.getRenameTables()).thenReturn(Collections.singleton(renameTableDefinitionSegment));
-        when(sqlStatement.getTables()).thenReturn(Arrays.asList(table, 
renameTable));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(Arrays.asList(table, 
renameTable))));
         return new CommonSQLStatementContext(mock(), sqlStatement);
     }
 }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java
index 0df6060f528..aba3f97410b 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/SQLStatementContextFactory.java
@@ -42,7 +42,7 @@ import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DCLStatement;
@@ -67,7 +67,6 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateS
 
 import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
 
 /**
  * SQL statement context factory.
@@ -87,10 +86,9 @@ public final class SQLStatementContextFactory {
      */
     public static SQLStatementContext newInstance(final ShardingSphereMetaData 
metaData,
                                                   final DatabaseType 
databaseType, final SQLStatement sqlStatement, final List<Object> params, final 
String currentDatabaseName) {
-        Optional<DialectCommonSQLStatementContextWarpProvider> 
dialectCommonSQLStatementContextWarpProvider = 
DatabaseTypedSPILoader.findService(
-                DialectCommonSQLStatementContextWarpProvider.class, 
databaseType);
-        if (sqlStatement instanceof TableAvailableSQLStatement && 
dialectCommonSQLStatementContextWarpProvider
-                .map(optional -> 
dialectCommonSQLStatementContextWarpProvider.get().getNeedToWarpSQLStatementTypes().contains(sqlStatement.getClass())).orElse(false))
 {
+        if 
(sqlStatement.getAttributes().findAttribute(TableSQLStatementAttribute.class).isPresent()
+                && 
DatabaseTypedSPILoader.findService(DialectCommonSQLStatementContextWarpProvider.class,
 databaseType)
+                        .map(optional -> 
optional.getNeedToWarpSQLStatementTypes().contains(sqlStatement.getClass())).orElse(false))
 {
             return new CommonSQLStatementContext(databaseType, sqlStatement);
         }
         if (sqlStatement instanceof DMLStatement) {
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/CommonSQLStatementContext.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/CommonSQLStatementContext.java
index 0151c2c9c93..cc1f8f4a404 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/CommonSQLStatementContext.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/CommonSQLStatementContext.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContex
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collections;
 
@@ -43,6 +43,6 @@ public final class CommonSQLStatementContext implements 
SQLStatementContext {
     public CommonSQLStatementContext(final DatabaseType databaseType, final 
SQLStatement sqlStatement) {
         this.databaseType = databaseType;
         this.sqlStatement = sqlStatement;
-        tablesContext = new TablesContext(sqlStatement instanceof 
TableAvailableSQLStatement ? ((TableAvailableSQLStatement) 
sqlStatement).getTables() : Collections.emptyList());
+        tablesContext = new 
TablesContext(sqlStatement.getAttributes().findAttribute(TableSQLStatementAttribute.class).map(TableSQLStatementAttribute::getTables).orElse(Collections.emptyList()));
     }
 }
diff --git 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
index ef68b07ee59..4fbc4900505 100644
--- 
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
+++ 
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/dal/ExplainStatementContext.java
@@ -23,8 +23,10 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import 
org.apache.shardingsphere.infra.binder.context.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -45,7 +47,7 @@ public final class ExplainStatementContext implements 
SQLStatementContext {
                                    final DatabaseType databaseType, final 
ExplainStatement sqlStatement, final List<Object> params, final String 
currentDatabaseName) {
         this.databaseType = databaseType;
         this.sqlStatement = sqlStatement;
-        tablesContext = new TablesContext(sqlStatement.getTables());
+        tablesContext = new 
TablesContext(sqlStatement.getAttributes().findAttribute(TableSQLStatementAttribute.class).map(TableSQLStatementAttribute::getTables).orElse(Collections.emptyList()));
         explainableSQLStatementContext = 
SQLStatementContextFactory.newInstance(metaData, databaseType, 
sqlStatement.getExplainableSQLStatement(), params, currentDatabaseName);
     }
 }
diff --git 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
index b2c566c1e66..a305a6b6456 100644
--- 
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
+++ 
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
@@ -37,6 +37,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.Proj
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.LimitSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterDatabaseStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CloseStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement;
@@ -80,6 +81,7 @@ class SQLStatementContextFactoryTest {
     @Test
     void 
assertSQLStatementContextCreatedWhenSQLStatementNotInstanceOfSelectStatementAndInsertStatement()
 {
         AlterDatabaseStatement alterDatabaseStatement = 
mock(AlterDatabaseStatement.class);
+        when(alterDatabaseStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
         SQLStatementContext sqlStatementContext = new 
SQLBindEngine(mockMetaData(), "foo_db", new 
HintValueContext()).bind(databaseType, alterDatabaseStatement, 
Collections.emptyList());
         assertThat(sqlStatementContext, 
instanceOf(CommonSQLStatementContext.class));
     }
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropSchemaSupportedCheckerTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropSchemaSupportedCheckerTest.java
index 767149465ae..5da3e3b0d77 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropSchemaSupportedCheckerTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropSchemaSupportedCheckerTest.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import 
org.apache.shardingsphere.single.checker.sql.schema.SingleDropSchemaSupportedChecker;
 import org.apache.shardingsphere.single.exception.DropNotEmptySchemaException;
 import org.apache.shardingsphere.single.rule.SingleRule;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
@@ -77,6 +78,7 @@ class SingleDropSchemaSupportedCheckerTest {
         DropSchemaStatement dropSchemaStatement = 
mock(DropSchemaStatement.class, RETURNS_DEEP_STUBS);
         
when(dropSchemaStatement.isContainsCascade()).thenReturn(containsCascade);
         
when(dropSchemaStatement.getSchemaNames()).thenReturn(Collections.singleton(new 
IdentifierValue(schemaName)));
+        when(dropSchemaStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
         return new CommonSQLStatementContext(mock(), dropSchemaStatement);
     }
 }
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropTableSupportedCheckerTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropTableSupportedCheckerTest.java
index ba519579d4d..bc95c15e218 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropTableSupportedCheckerTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropTableSupportedCheckerTest.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.single.checker.sql.table.SingleDropTableSupportedChecker;
 import org.apache.shardingsphere.single.rule.SingleRule;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -67,6 +68,7 @@ class SingleDropTableSupportedCheckerTest {
         DropTableStatement dropSchemaStatement = 
mock(DropTableStatement.class, RETURNS_DEEP_STUBS);
         
when(dropSchemaStatement.isContainsCascade()).thenReturn(containsCascade);
         
when(dropSchemaStatement.getTables()).thenReturn(Collections.emptyList());
+        when(dropSchemaStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
         return new CommonSQLStatementContext(mock(), dropSchemaStatement);
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/AnalyzeTableStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/TableSQLStatementAttribute.java
similarity index 78%
copy from 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/AnalyzeTableStatement.java
copy to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/TableSQLStatementAttribute.java
index e199bc075ef..4500edba5d0 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/AnalyzeTableStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/TableSQLStatementAttribute.java
@@ -15,22 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.statement.core.statement.dal;
+package 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttribute;
 
 import java.util.Collection;
+import java.util.Collections;
 
 /**
- * Analyze table statement.
+ * Table SQL statement attribute.
  */
 @RequiredArgsConstructor
 @Getter
-public final class AnalyzeTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
+public final class TableSQLStatementAttribute implements SQLStatementAttribute 
{
     
     private final Collection<SimpleTableSegment> tables;
+    
+    public TableSQLStatementAttribute(final SimpleTableSegment table) {
+        this(Collections.singleton(table));
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/TableAvailableSQLStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/TableAvailableSQLStatement.java
deleted file mode 100644
index 22ca1080ae6..00000000000
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/TableAvailableSQLStatement.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.generic.table.SimpleTableSegment;
-
-import java.util.Collection;
-
-/**
- * Table available SQL statement.
- */
-public interface TableAvailableSQLStatement {
-    
-    /**
-     * Get tables.
-     *
-     * @return tables
-     */
-    Collection<SimpleTableSegment> getTables();
-}
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/AnalyzeTableStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/AnalyzeTableStatement.java
index e199bc075ef..b84aed19633 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/AnalyzeTableStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/AnalyzeTableStatement.java
@@ -17,11 +17,11 @@
 
 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.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 
@@ -29,8 +29,12 @@ import java.util.Collection;
  * Analyze table statement.
  */
 @RequiredArgsConstructor
-@Getter
-public final class AnalyzeTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
+public final class AnalyzeTableStatement extends AbstractSQLStatement 
implements DALStatement {
     
     private final Collection<SimpleTableSegment> tables;
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ExplainStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ExplainStatement.java
index 282ea68e455..f6a05d8c99c 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ExplainStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ExplainStatement.java
@@ -20,27 +20,25 @@ package 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor;
-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.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
-
-import java.util.Collection;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 /**
  * Explain statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class ExplainStatement extends AbstractSQLStatement implements 
DALStatement, TableAvailableSQLStatement {
+public final class ExplainStatement extends AbstractSQLStatement implements 
DALStatement {
     
     private final SQLStatement explainableSQLStatement;
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
+    public SQLStatementAttributes getAttributes() {
         TableExtractor extractor = new TableExtractor();
         // TODO extract table from declare, execute, createMaterializedView, 
refreshMaterializedView
         extractor.extractTablesFromSQLStatement(explainableSQLStatement);
-        return extractor.getRewriteTables();
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(extractor.getRewriteTables()));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java
index 98c375ab15c..1faeead3270 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java
@@ -21,30 +21,22 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 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.DatabaseSelectRequiredSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.DatabaseSelectRequiredSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableInResultSetSQLStatementAttribute;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailableSQLStatement;
-
-import java.util.Collection;
-import java.util.Collections;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 /**
  * Show create table statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class ShowCreateTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
+public final class ShowCreateTableStatement extends AbstractSQLStatement 
implements DALStatement {
     
     private final SimpleTableSegment table;
     
-    @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
-    }
-    
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute(), new 
TableInResultSetSQLStatementAttribute(2));
+        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute(), new 
TableInResultSetSQLStatementAttribute(2), new 
TableSQLStatementAttribute(table));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/DenyUserStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/DenyUserStatement.java
index c7b4c7fdca6..16264d222ae 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/DenyUserStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/DenyUserStatement.java
@@ -22,10 +22,10 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedList;
 
 /**
@@ -33,14 +33,14 @@ import java.util.LinkedList;
  */
 @Getter
 @Setter
-public final class DenyUserStatement extends AbstractSQLStatement implements 
DCLStatement, TableAvailableSQLStatement {
+public final class DenyUserStatement extends AbstractSQLStatement implements 
DCLStatement {
     
     private SimpleTableSegment table;
     
     private final Collection<ColumnSegment> columns = new LinkedList<>();
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(table));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/GrantStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/GrantStatement.java
index 894f09603c4..ad1e09d2009 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/GrantStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/GrantStatement.java
@@ -20,7 +20,8 @@ package 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl;
 import lombok.Getter;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -29,7 +30,12 @@ import java.util.LinkedList;
  * Grant statement.
  */
 @Getter
-public class GrantStatement extends AbstractSQLStatement implements 
DCLStatement, TableAvailableSQLStatement {
+public class GrantStatement extends AbstractSQLStatement implements 
DCLStatement {
     
     private final Collection<SimpleTableSegment> tables = new LinkedList<>();
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/RevokeStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/RevokeStatement.java
index b3a49c785fc..dec0ab8b02a 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/RevokeStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dcl/RevokeStatement.java
@@ -20,7 +20,8 @@ package 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl;
 import lombok.Getter;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -29,7 +30,12 @@ import java.util.LinkedList;
  * Revoke statement.
  */
 @Getter
-public class RevokeStatement extends AbstractSQLStatement implements 
DCLStatement, TableAvailableSQLStatement {
+public class RevokeStatement extends AbstractSQLStatement implements 
DCLStatement {
     
     private final Collection<SimpleTableSegment> tables = new LinkedList<>();
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CommentStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CommentStatement.java
index 23ff5f07464..7f1d98540ad 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CommentStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CommentStatement.java
@@ -23,10 +23,10 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.Ind
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Optional;
 
@@ -35,7 +35,7 @@ import java.util.Optional;
  */
 @Getter
 @Setter
-public class CommentStatement extends AbstractSQLStatement implements 
DDLStatement, TableAvailableSQLStatement {
+public class CommentStatement extends AbstractSQLStatement implements 
DDLStatement {
     
     private SimpleTableSegment table;
     
@@ -55,7 +55,7 @@ public class CommentStatement extends AbstractSQLStatement 
implements DDLStateme
     }
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return null == table ? Collections.emptyList() : 
Collections.singletonList(table);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new TableSQLStatementAttribute(null 
== table ? Collections.emptyList() : Collections.singletonList(table)));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateFunctionStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateFunctionStatement.java
index d7de432c583..29c4343e1cd 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateFunctionStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateFunctionStatement.java
@@ -23,12 +23,11 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtrac
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.RoutineBodySegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
-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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
@@ -38,7 +37,7 @@ import java.util.Optional;
  */
 @Getter
 @Setter
-public class CreateFunctionStatement extends AbstractSQLStatement implements 
DDLStatement, TableAvailableSQLStatement {
+public class CreateFunctionStatement extends AbstractSQLStatement implements 
DDLStatement {
     
     private FunctionNameSegment functionName;
     
@@ -65,7 +64,8 @@ public class CreateFunctionStatement extends 
AbstractSQLStatement implements DDL
     }
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return getRoutineBody().map(optional -> new 
TableExtractor().extractExistTableFromRoutineBody(optional)).orElseGet(Collections::emptyList);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(
+                new TableSQLStatementAttribute(getRoutineBody().map(optional 
-> new 
TableExtractor().extractExistTableFromRoutineBody(optional)).orElseGet(Collections::emptyList)));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java
index 3ee6e3df330..ca3e6bc6d88 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java
@@ -21,7 +21,8 @@ import lombok.Getter;
 import lombok.Setter;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -31,11 +32,16 @@ import java.util.LinkedList;
  */
 @Getter
 @Setter
-public final class DropTableStatement extends AbstractSQLStatement implements 
DDLStatement, TableAvailableSQLStatement {
+public final class DropTableStatement extends AbstractSQLStatement implements 
DDLStatement {
     
     private final Collection<SimpleTableSegment> tables = new LinkedList<>();
     
     private boolean ifExists;
     
     private boolean containsCascade;
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
index aa8030f3433..7d4a5b9a403 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropViewStatement.java
@@ -21,7 +21,8 @@ import lombok.Getter;
 import lombok.Setter;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -31,14 +32,14 @@ import java.util.LinkedList;
  */
 @Getter
 @Setter
-public final class DropViewStatement extends AbstractSQLStatement implements 
DDLStatement, TableAvailableSQLStatement {
+public final class DropViewStatement extends AbstractSQLStatement implements 
DDLStatement {
     
     private final Collection<SimpleTableSegment> views = new LinkedList<>();
     
     private boolean ifExists;
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return views;
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(views));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/PrepareStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/PrepareStatement.java
index 6ae6b5f8f15..6b8744fe825 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/PrepareStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/PrepareStatement.java
@@ -20,16 +20,14 @@ package 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl;
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor;
-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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
 
-import java.util.Collection;
-import java.util.LinkedList;
 import java.util.Optional;
 
 /**
@@ -37,7 +35,7 @@ import java.util.Optional;
  */
 @Getter
 @Setter
-public final class PrepareStatement extends AbstractSQLStatement implements 
DDLStatement, TableAvailableSQLStatement {
+public final class PrepareStatement extends AbstractSQLStatement implements 
DDLStatement {
     
     private SelectStatement select;
     
@@ -84,12 +82,12 @@ public final class PrepareStatement extends 
AbstractSQLStatement implements DDLS
     }
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
+    public SQLStatementAttributes getAttributes() {
         TableExtractor tableExtractor = new TableExtractor();
         
Optional.ofNullable(select).ifPresent(tableExtractor::extractTablesFromSelect);
         
Optional.ofNullable(insert).ifPresent(tableExtractor::extractTablesFromInsert);
         
Optional.ofNullable(update).ifPresent(tableExtractor::extractTablesFromUpdate);
         
Optional.ofNullable(delete).ifPresent(tableExtractor::extractTablesFromDelete);
-        return new LinkedList<>(tableExtractor.getRewriteTables());
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tableExtractor.getRewriteTables()));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/RenameTableStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/RenameTableStatement.java
index b62e098ddda..fa13e689351 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/RenameTableStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/RenameTableStatement.java
@@ -22,7 +22,8 @@ import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -32,17 +33,17 @@ import java.util.LinkedList;
  */
 @RequiredArgsConstructor
 @Getter
-public final class RenameTableStatement extends AbstractSQLStatement 
implements DDLStatement, TableAvailableSQLStatement {
+public final class RenameTableStatement extends AbstractSQLStatement 
implements DDLStatement {
     
     private final Collection<RenameTableDefinitionSegment> renameTables;
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
+    public SQLStatementAttributes getAttributes() {
+        Collection<SimpleTableSegment> tables = new LinkedList<>();
         for (RenameTableDefinitionSegment each : renameTables) {
-            result.add(each.getTable());
-            result.add(each.getRenameTable());
+            tables.add(each.getTable());
+            tables.add(each.getRenameTable());
         }
-        return result;
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/TruncateStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/TruncateStatement.java
index 3acd02f0c9a..5820efd454f 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/TruncateStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/TruncateStatement.java
@@ -20,7 +20,8 @@ package 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl;
 import lombok.Getter;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -29,7 +30,12 @@ import java.util.LinkedList;
  * Truncate table statement.
  */
 @Getter
-public final class TruncateStatement extends AbstractSQLStatement implements 
DDLStatement, TableAvailableSQLStatement {
+public final class TruncateStatement extends AbstractSQLStatement implements 
DDLStatement {
     
     private final Collection<SimpleTableSegment> tables = new LinkedList<>();
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java
index d2d95baa26f..87058d0d73f 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java
@@ -23,7 +23,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.Co
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.prepare.PrepareStatementQuerySegment;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -34,7 +35,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class CopyStatement extends AbstractSQLStatement implements 
DMLStatement, TableAvailableSQLStatement {
+public final class CopyStatement extends AbstractSQLStatement implements 
DMLStatement {
     
     private final SimpleTableSegment table;
     
@@ -61,7 +62,7 @@ public final class CopyStatement extends AbstractSQLStatement 
implements DMLStat
     }
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return null == table ? Collections.emptyList() : 
Collections.singletonList(table);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new TableSQLStatementAttribute(null 
== table ? Collections.emptyList() : Collections.singletonList(table)));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java
index 85534e1aace..b6e739a67e9 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java
@@ -21,22 +21,20 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 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.TableAvailableSQLStatement;
-
-import java.util.Collection;
-import java.util.Collections;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 /**
  * Load data statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class LoadDataStatement extends AbstractSQLStatement implements 
DMLStatement, TableAvailableSQLStatement {
+public final class LoadDataStatement extends AbstractSQLStatement implements 
DMLStatement {
     
     private final SimpleTableSegment table;
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(table));
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java
index 0dde94e2609..773ae8b742c 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java
@@ -21,22 +21,20 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 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.TableAvailableSQLStatement;
-
-import java.util.Collection;
-import java.util.Collections;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 
 /**
  * Load xml statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class LoadXMLStatement extends AbstractSQLStatement implements 
DMLStatement, TableAvailableSQLStatement {
+public final class LoadXMLStatement extends AbstractSQLStatement implements 
DMLStatement {
     
     private final SimpleTableSegment table;
     
     @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(table));
     }
 }
diff --git 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLFlushStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLFlushStatement.java
index 5eca78ec96c..7e971af146c 100644
--- 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLFlushStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLFlushStatement.java
@@ -21,7 +21,8 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
 import java.util.Collection;
@@ -31,9 +32,14 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLFlushStatement extends AbstractSQLStatement implements 
DALStatement, TableAvailableSQLStatement {
+public final class MySQLFlushStatement extends AbstractSQLStatement implements 
DALStatement {
     
     private final Collection<SimpleTableSegment> tables;
     
     private final boolean flushTable;
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
+    }
 }
diff --git 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLOptimizeTableStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLOptimizeTableStatement.java
index 1f7c632724f..39d2f055a78 100644
--- 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLOptimizeTableStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLOptimizeTableStatement.java
@@ -21,7 +21,8 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
 import java.util.Collection;
@@ -31,7 +32,12 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLOptimizeTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
+public final class MySQLOptimizeTableStatement extends AbstractSQLStatement 
implements DALStatement {
     
     private final Collection<SimpleTableSegment> tables;
+    
+    @Override
+    public SQLStatementAttributes getAttributes() {
+        return new SQLStatementAttributes(new 
TableSQLStatementAttribute(tables));
+    }
 }
diff --git 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLDescribeStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLDescribeStatement.java
index 989d627811a..b0bede5085e 100644
--- 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLDescribeStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLDescribeStatement.java
@@ -22,13 +22,11 @@ import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 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.TableAvailableSQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.ColumnInResultSetSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Optional;
 
 /**
@@ -36,7 +34,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLDescribeStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
+public final class MySQLDescribeStatement extends AbstractSQLStatement 
implements DALStatement {
     
     private final SimpleTableSegment table;
     
@@ -51,13 +49,8 @@ public final class MySQLDescribeStatement extends 
AbstractSQLStatement implement
         return Optional.ofNullable(columnWildcard);
     }
     
-    @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
-    }
-    
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
ColumnInResultSetSQLStatementAttribute(1));
+        return new SQLStatementAttributes(new 
ColumnInResultSetSQLStatementAttribute(1), new 
TableSQLStatementAttribute(table));
     }
 }
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 e3447c6cbf0..de86e522971 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
@@ -26,11 +26,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
 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.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Optional;
 
 /**
@@ -38,7 +36,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLShowColumnsStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
+public final class MySQLShowColumnsStatement extends AbstractSQLStatement 
implements DALStatement {
     
     private final SimpleTableSegment table;
     
@@ -64,13 +62,8 @@ public final class MySQLShowColumnsStatement extends 
AbstractSQLStatement implem
         return Optional.ofNullable(filter);
     }
     
-    @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
-    }
-    
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
ColumnInResultSetSQLStatementAttribute(1), new 
FromDatabaseSQLStatementAttribute(fromDatabase));
+        return new SQLStatementAttributes(new 
ColumnInResultSetSQLStatementAttribute(1), new 
FromDatabaseSQLStatementAttribute(fromDatabase), new 
TableSQLStatementAttribute(table));
     }
 }
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 d4eb0bd3eaa..688e57c3804 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
@@ -24,11 +24,9 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
 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.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Optional;
 
 /**
@@ -36,7 +34,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLShowIndexStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailableSQLStatement {
+public final class MySQLShowIndexStatement extends AbstractSQLStatement 
implements DALStatement {
     
     private final SimpleTableSegment table;
     
@@ -51,13 +49,8 @@ public final class MySQLShowIndexStatement extends 
AbstractSQLStatement implemen
         return Optional.ofNullable(fromDatabase);
     }
     
-    @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
-    }
-    
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase));
+        return new SQLStatementAttributes(new 
FromDatabaseSQLStatementAttribute(fromDatabase), new 
TableSQLStatementAttribute(table));
     }
 }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
index 13df7b8ead2..00aa11c6f4e 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java
@@ -48,6 +48,8 @@ import 
org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement;
@@ -254,7 +256,7 @@ class ProxySQLExecutorTest {
     
     private SQLStatementContext createTruncateStatementContext(final 
DatabaseType databaseType) {
         TruncateStatement sqlStatement = mock(TruncateStatement.class);
-        
when(sqlStatement.getTables()).thenReturn(Collections.singletonList(new 
SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order")))));
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes(new TableSQLStatementAttribute(new 
SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_order"))))));
         return new CommonSQLStatementContext(databaseType, sqlStatement);
     }
     


Reply via email to