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 d6ab7570d87 Add TableInfoInResultSetAvailable and 
ColumnInfoInResultSetAvailable (#35762)
d6ab7570d87 is described below

commit d6ab7570d87253730142932426068f05cd7ff0e4
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Fri Jun 20 17:30:50 2025 +0800

    Add TableInfoInResultSetAvailable and ColumnInfoInResultSetAvailable 
(#35762)
---
 .../merge/dal/EncryptDALResultDecorator.java       |  9 +++---
 .../dal/show/EncryptShowColumnsMergedResult.java   | 13 +++++---
 .../show/EncryptShowCreateTableMergedResult.java   | 10 +++---
 .../merge/dal/EncryptDALResultDecoratorTest.java   | 37 +++++++---------------
 .../show/EncryptShowColumnsMergedResultTest.java   |  6 ++++
 .../EncryptShowCreateTableMergedResultTest.java    |  6 ++++
 .../type/ShardingRouteEngineFactoryTest.java       | 17 ++--------
 .../MySQLSQLStatementContextWarpProvider.java      |  2 +-
 .../binder/mysql/bind/MySQLSQLBindEngine.java      |  6 ++--
 .../bind/type/MySQLShowColumnsStatementBinder.java | 10 +++---
 .../mysql/MySQLToBeRemovedSegmentsProvider.java    |  6 ++--
 .../statement/type/DorisDALStatementVisitor.java   |  6 ++--
 .../statement/type/MySQLDALStatementVisitor.java   |  6 ++--
 .../ColumnInfoInResultSetAvailable.java}           | 29 ++++++-----------
 .../TableInfoInResultSetAvailable.java}            | 29 ++++++-----------
 .../statement/dal/ShowCreateTableStatement.java    |  8 ++++-
 .../{ => show/column}/MySQLDescribeStatement.java  | 10 ++++--
 .../show/column/MySQLShowColumnsStatement.java}    | 25 +++++++++------
 .../asserts/statement/dal/DALStatementAssert.java  |  8 ++---
 .../dal/impl/DescribeStatementAssert.java          |  2 +-
 .../dal/impl/ShowColumnsStatementAssert.java       |  4 +--
 21 files changed, 117 insertions(+), 132 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
index 955801edd3d..614dcf2f4f3 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
@@ -26,9 +26,8 @@ import 
org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.ColumnInfoInResultSetAvailable;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableInfoInResultSetAvailable;
 
 /**
  * DAL result decorator for encrypt.
@@ -41,10 +40,10 @@ public final class EncryptDALResultDecorator implements 
ResultDecorator<EncryptR
     @Override
     public MergedResult decorate(final MergedResult mergedResult, final 
SQLStatementContext sqlStatementContext, final EncryptRule rule) {
         SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
-        if (sqlStatement instanceof ExplainStatement || sqlStatement 
instanceof ShowColumnsStatement) {
+        if (sqlStatement instanceof ColumnInfoInResultSetAvailable) {
             return new EncryptShowColumnsMergedResult(mergedResult, 
sqlStatementContext, rule);
         }
-        if (sqlStatement instanceof ShowCreateTableStatement) {
+        if (sqlStatement instanceof TableInfoInResultSetAvailable) {
             return new EncryptShowCreateTableMergedResult(globalRuleMetaData, 
mergedResult, sqlStatementContext, rule);
         }
         return mergedResult;
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
index 74e555c3c2d..ccebff31ebd 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.ColumnInfoInResultSetAvailable;
 
 import java.io.InputStream;
 import java.io.Reader;
@@ -36,20 +37,22 @@ import java.util.Optional;
  */
 public final class EncryptShowColumnsMergedResult implements MergedResult {
     
-    private static final int COLUMN_FIELD_INDEX = 1;
-    
     private final MergedResult mergedResult;
     
     private final EncryptRule rule;
     
     private final String tableName;
     
+    private final int columnNameResultSetIndex;
+    
     public EncryptShowColumnsMergedResult(final MergedResult mergedResult, 
final SQLStatementContext sqlStatementContext, final EncryptRule rule) {
         ShardingSpherePreconditions.checkState(1 == 
sqlStatementContext.getTablesContext().getSimpleTables().size(),
                 () -> new UnsupportedEncryptSQLException("SHOW COLUMNS FOR 
MULTI TABLES"));
         this.mergedResult = mergedResult;
         this.rule = rule;
         tableName = 
sqlStatementContext.getTablesContext().getSimpleTables().iterator().next().getTableName().getIdentifier().getValue();
+        columnNameResultSetIndex = ((ColumnInfoInResultSetAvailable) 
sqlStatementContext.getSqlStatement()).getColumnNameResultSetIndex();
+        
     }
     
     @Override
@@ -66,7 +69,7 @@ public final class EncryptShowColumnsMergedResult implements 
MergedResult {
     }
     
     private boolean next(final EncryptTable encryptTable) throws SQLException {
-        while 
(encryptTable.isDerivedColumn(mergedResult.getValue(COLUMN_FIELD_INDEX, 
String.class).toString())) {
+        while 
(encryptTable.isDerivedColumn(mergedResult.getValue(columnNameResultSetIndex, 
String.class).toString())) {
             boolean isFinished = !mergedResult.next();
             if (isFinished) {
                 return false;
@@ -77,14 +80,14 @@ public final class EncryptShowColumnsMergedResult 
implements MergedResult {
     
     @Override
     public Object getValue(final int columnIndex, final Class<?> type) throws 
SQLException {
-        if (COLUMN_FIELD_INDEX == columnIndex) {
+        if (columnNameResultSetIndex == columnIndex) {
             return getColumnNameValue(type);
         }
         return mergedResult.getValue(columnIndex, type);
     }
     
     private String getColumnNameValue(final Class<?> type) throws SQLException 
{
-        String columnName = mergedResult.getValue(COLUMN_FIELD_INDEX, 
type).toString();
+        String columnName = mergedResult.getValue(columnNameResultSetIndex, 
type).toString();
         Optional<EncryptTable> encryptTable = rule.findEncryptTable(tableName);
         return encryptTable.isPresent() && 
encryptTable.get().isCipherColumn(columnName) ? 
encryptTable.get().getLogicColumnByCipherColumn(columnName) : columnName;
     }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
index 0e6a870809f..e4196307398 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.infra.parser.SQLParserEngine;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableInfoInResultSetAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
 
 import java.io.InputStream;
@@ -46,14 +47,14 @@ public final class EncryptShowCreateTableMergedResult 
implements MergedResult {
     
     private static final String COMMA = ", ";
     
-    private static final int CREATE_TABLE_DEFINITION_INDEX = 2;
-    
     private final MergedResult mergedResult;
     
     private final EncryptRule rule;
     
     private final String tableName;
     
+    private final int tableNameResultSetIndex;
+    
     private final SQLParserEngine sqlParserEngine;
     
     public EncryptShowCreateTableMergedResult(final RuleMetaData 
globalRuleMetaData, final MergedResult mergedResult, final SQLStatementContext 
sqlStatementContext, final EncryptRule rule) {
@@ -62,6 +63,7 @@ public final class EncryptShowCreateTableMergedResult 
implements MergedResult {
         this.mergedResult = mergedResult;
         this.rule = rule;
         tableName = 
sqlStatementContext.getTablesContext().getSimpleTables().iterator().next().getTableName().getIdentifier().getValue();
+        tableNameResultSetIndex = ((TableInfoInResultSetAvailable) 
sqlStatementContext.getSqlStatement()).getTableNameResultSetIndex();
         sqlParserEngine = 
globalRuleMetaData.getSingleRule(SQLParserRule.class).getSQLParserEngine(sqlStatementContext.getDatabaseType());
     }
     
@@ -72,10 +74,10 @@ public final class EncryptShowCreateTableMergedResult 
implements MergedResult {
     
     @Override
     public Object getValue(final int columnIndex, final Class<?> type) throws 
SQLException {
-        if (CREATE_TABLE_DEFINITION_INDEX != columnIndex) {
+        if (tableNameResultSetIndex != columnIndex) {
             return mergedResult.getValue(columnIndex, type);
         }
-        String createTableSQL = 
mergedResult.getValue(CREATE_TABLE_DEFINITION_INDEX, type).toString();
+        String createTableSQL = mergedResult.getValue(tableNameResultSetIndex, 
type).toString();
         Optional<EncryptTable> encryptTable = rule.findEncryptTable(tableName);
         if (!encryptTable.isPresent() || !createTableSQL.contains("(")) {
             return createTableSQL;
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
index 2e2d9133ff3..4bb1ca5a5d4 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
@@ -20,9 +20,8 @@ package org.apache.shardingsphere.encrypt.merge.dal;
 import 
org.apache.shardingsphere.encrypt.merge.dal.show.EncryptShowColumnsMergedResult;
 import 
org.apache.shardingsphere.encrypt.merge.dal.show.EncryptShowCreateTableMergedResult;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-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.dal.ExplainStatementContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.type.CommonSQLStatementContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
@@ -30,9 +29,9 @@ import 
org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 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.dal.ExplainStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.ColumnInfoInResultSetAvailable;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableInfoInResultSetAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -46,6 +45,7 @@ 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;
 
 @ExtendWith(MockitoExtension.class)
 class EncryptDALResultDecoratorTest {
@@ -58,23 +58,16 @@ class EncryptDALResultDecoratorTest {
     @Mock
     private SQLStatementContext sqlStatementContext;
     
-    @Test
-    void assertMergedResultWithExplainStatement() {
-        sqlStatementContext = getExplainStatementContext();
-        EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(mock(RuleMetaData.class));
-        assertThat(decorator.decorate(mock(MergedResult.class), 
sqlStatementContext, rule), instanceOf(EncryptShowColumnsMergedResult.class));
-    }
-    
     @Test
     void assertMergedResultWithShowColumnsStatement() {
-        sqlStatementContext = getShowColumnsStatementContext();
+        sqlStatementContext = 
getColumnInfoInResultSetAvailableStatementContext();
         EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(mock(RuleMetaData.class));
         assertThat(decorator.decorate(mock(MergedResult.class), 
sqlStatementContext, rule), instanceOf(EncryptShowColumnsMergedResult.class));
     }
     
     @Test
     void assertMergedResultWithShowCreateTableStatement() {
-        sqlStatementContext = mockShowCreateTableStatementContext();
+        sqlStatementContext = 
mockTableInfoInResultSetAvailableStatementContext();
         RuleMetaData ruleMetaData = mock(RuleMetaData.class);
         
when(ruleMetaData.getSingleRule(SQLParserRule.class)).thenReturn(mock(SQLParserRule.class));
         EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(ruleMetaData);
@@ -88,28 +81,20 @@ class EncryptDALResultDecoratorTest {
         assertThat(decorator.decorate(mock(MergedResult.class), 
sqlStatementContext, rule), instanceOf(MergedResult.class));
     }
     
-    private SQLStatementContext getExplainStatementContext() {
-        ExplainStatementContext result = mock(ExplainStatementContext.class, 
RETURNS_DEEP_STUBS);
-        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(1, 7, new IdentifierValue("foo_tbl")));
-        
when(result.getTablesContext().getSimpleTables()).thenReturn(Collections.singleton(simpleTableSegment));
-        
when(result.getSqlStatement()).thenReturn(mock(ExplainStatement.class));
-        return result;
-    }
-    
-    private SQLStatementContext getShowColumnsStatementContext() {
+    private SQLStatementContext 
getColumnInfoInResultSetAvailableStatementContext() {
         SQLStatementContext result = mock(SQLStatementContext.class, 
RETURNS_DEEP_STUBS);
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(1, 7, new IdentifierValue("foo_tbl")));
         
when(result.getTablesContext().getSimpleTables()).thenReturn(Collections.singleton(simpleTableSegment));
-        
when(result.getSqlStatement()).thenReturn(mock(ShowColumnsStatement.class));
+        when(result.getSqlStatement()).thenReturn(mock(SQLStatement.class, 
withSettings().extraInterfaces(ColumnInfoInResultSetAvailable.class)));
         return result;
     }
     
-    private SQLStatementContext mockShowCreateTableStatementContext() {
+    private SQLStatementContext 
mockTableInfoInResultSetAvailableStatementContext() {
         SQLStatementContext result = mock(CommonSQLStatementContext.class, 
RETURNS_DEEP_STUBS);
         when(result.getDatabaseType()).thenReturn(databaseType);
         SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(1, 7, new IdentifierValue("foo_tbl")));
         
when(result.getTablesContext().getSimpleTables()).thenReturn(Collections.singleton(simpleTableSegment));
-        
when(result.getSqlStatement()).thenReturn(mock(ShowCreateTableStatement.class));
+        when(result.getSqlStatement()).thenReturn(mock(SQLStatement.class, 
withSettings().extraInterfaces(TableInfoInResultSetAvailable.class)));
         return result;
     }
 }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResultTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResultTest.java
index 694482357fb..d2004284ec0 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResultTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResultTest.java
@@ -24,6 +24,8 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 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.available.ColumnInfoInResultSetAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -47,6 +49,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 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;
 
 @ExtendWith(MockitoExtension.class)
 @MockitoSettings(strictness = Strictness.LENIENT)
@@ -147,6 +150,9 @@ class EncryptShowColumnsMergedResultTest {
     
     private EncryptShowColumnsMergedResult createMergedResult(final 
MergedResult mergedResult, final EncryptRule rule) {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
+        SQLStatement sqlStatement = mock(SQLStatement.class, 
withSettings().extraInterfaces(ColumnInfoInResultSetAvailable.class).defaultAnswer(RETURNS_DEEP_STUBS));
+        when(((ColumnInfoInResultSetAvailable) 
sqlStatement).getColumnNameResultSetIndex()).thenReturn(1);
+        when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         
when(sqlStatementContext.getTablesContext().getSimpleTables()).thenReturn(Collections.singleton(new
 SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("t_encrypt")))));
         return new EncryptShowColumnsMergedResult(mergedResult, 
sqlStatementContext, rule);
     }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResultTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResultTest.java
index 9c8b155a5dd..d89929dd82a 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResultTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResultTest.java
@@ -35,6 +35,8 @@ import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.sql.parser.api.CacheOption;
 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.available.TableInfoInResultSetAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -60,6 +62,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 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;
 
 @ExtendWith(MockitoExtension.class)
 @MockitoSettings(strictness = Strictness.LENIENT)
@@ -209,6 +212,9 @@ class EncryptShowCreateTableMergedResultTest {
     
     private EncryptShowCreateTableMergedResult createMergedResult(final 
MergedResult mergedResult, final String tableName, final EncryptRule rule) {
         CommonSQLStatementContext sqlStatementContext = 
mock(CommonSQLStatementContext.class, RETURNS_DEEP_STUBS);
+        SQLStatement sqlStatement = mock(SQLStatement.class, 
withSettings().extraInterfaces(TableInfoInResultSetAvailable.class).defaultAnswer(RETURNS_DEEP_STUBS));
+        when(((TableInfoInResultSetAvailable) 
sqlStatement).getTableNameResultSetIndex()).thenReturn(2);
+        when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         
when(sqlStatementContext.getTablesContext().getSimpleTables()).thenReturn(Collections.singleton(new
 SimpleTableSegment(new TableNameSegment(1, 4, new 
IdentifierValue(tableName)))));
         when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
         RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
index 50f616a9751..d1a33e3aa95 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
@@ -42,8 +42,6 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
 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.dal.DALStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DCLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.GrantStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement;
@@ -200,19 +198,8 @@ class ShardingRouteEngineFactoryTest {
     }
     
     @Test
-    void assertNewInstanceForShowCreateTableWithTableRule() {
-        DALStatement dalStatement = mock(ShowCreateTableStatement.class);
-        when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
-        tableNames.add("table_1");
-        
when(shardingRule.getShardingLogicTableNames(tableNames)).thenReturn(tableNames);
-        QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class));
-        ShardingRouteEngine actual = 
ShardingRouteEngineFactory.newInstance(shardingRule, database, queryContext, 
shardingConditions, tableNames, props);
-        assertThat(actual, instanceOf(ShardingUnicastRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceForShowColumnsWithTableRule() {
-        DALStatement dalStatement = mock(ShowColumnsStatement.class);
+    void assertNewInstanceForCommonDALStatement() {
+        DALStatement dalStatement = mock(DALStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
         tableNames.add("table_1");
         
when(shardingRule.getShardingLogicTableNames(tableNames)).thenReturn(tableNames);
diff --git 
a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementContextWarpProvider.java
 
b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementContextWarpProvider.java
index aadb76e4348..b5ef03f335b 100644
--- 
a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementContextWarpProvider.java
+++ 
b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/MySQLSQLStatementContextWarpProvider.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLOptimizeTab
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadDataStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadXMLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLDescribeStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLFlushStatement;
 
 import java.util.Arrays;
diff --git 
a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/MySQLSQLBindEngine.java
 
b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/MySQLSQLBindEngine.java
index 834c9dee2ef..7504aff4504 100644
--- 
a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/MySQLSQLBindEngine.java
+++ 
b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/MySQLSQLBindEngine.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.mysql.bind.type.MySQLShowCreateTab
 import 
org.apache.shardingsphere.infra.binder.mysql.bind.type.MySQLShowIndexStatementBinder;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLOptimizeTableStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLShowColumnsStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowIndexStatement;
 
@@ -44,8 +44,8 @@ public final class MySQLSQLBindEngine implements 
DialectSQLBindEngine {
         if (sqlStatement instanceof ShowCreateTableStatement) {
             return Optional.of(new 
MySQLShowCreateTableStatementBinder().bind((ShowCreateTableStatement) 
sqlStatement, binderContext));
         }
-        if (sqlStatement instanceof ShowColumnsStatement) {
-            return Optional.of(new 
MySQLShowColumnsStatementBinder().bind((ShowColumnsStatement) sqlStatement, 
binderContext));
+        if (sqlStatement instanceof MySQLShowColumnsStatement) {
+            return Optional.of(new 
MySQLShowColumnsStatementBinder().bind((MySQLShowColumnsStatement) 
sqlStatement, binderContext));
         }
         if (sqlStatement instanceof ShowIndexStatement) {
             return Optional.of(new 
MySQLShowIndexStatementBinder().bind((ShowIndexStatement) sqlStatement, 
binderContext));
diff --git 
a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/type/MySQLShowColumnsStatementBinder.java
 
b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/type/MySQLShowColumnsStatementBinder.java
index dbfd061a077..9fdd6bea1c0 100644
--- 
a/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/type/MySQLShowColumnsStatementBinder.java
+++ 
b/infra/binder/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/binder/mysql/bind/type/MySQLShowColumnsStatementBinder.java
@@ -28,25 +28,25 @@ import 
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinde
 import 
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementCopyUtils;
 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.dal.ShowColumnsStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLShowColumnsStatement;
 
 import java.util.Optional;
 
 /**
  * Show columns statement binder for MySQL.
  */
-public final class MySQLShowColumnsStatementBinder implements 
SQLStatementBinder<ShowColumnsStatement> {
+public final class MySQLShowColumnsStatementBinder implements 
SQLStatementBinder<MySQLShowColumnsStatement> {
     
     @Override
-    public ShowColumnsStatement bind(final ShowColumnsStatement sqlStatement, 
final SQLStatementBinderContext binderContext) {
+    public MySQLShowColumnsStatement bind(final MySQLShowColumnsStatement 
sqlStatement, final SQLStatementBinderContext binderContext) {
         Multimap<CaseInsensitiveString, TableSegmentBinderContext> 
tableBinderContexts = LinkedHashMultimap.create();
         SimpleTableSegment boundTable = 
SimpleTableSegmentBinder.bind(sqlStatement.getTable(), binderContext, 
tableBinderContexts);
         Optional<ShowFilterSegment> boundFilter = 
sqlStatement.getFilter().map(optional -> ShowFilterSegmentBinder.bind(optional, 
binderContext, tableBinderContexts, LinkedHashMultimap.create()));
         return copy(sqlStatement, boundTable, boundFilter.orElse(null));
     }
     
-    private ShowColumnsStatement copy(final ShowColumnsStatement sqlStatement, 
final SimpleTableSegment boundTable, final ShowFilterSegment boundFilter) {
-        ShowColumnsStatement result = new ShowColumnsStatement(boundTable, 
sqlStatement.getFromDatabase().orElse(null), boundFilter);
+    private MySQLShowColumnsStatement copy(final MySQLShowColumnsStatement 
sqlStatement, final SimpleTableSegment boundTable, final ShowFilterSegment 
boundFilter) {
+        MySQLShowColumnsStatement result = new 
MySQLShowColumnsStatement(boundTable, 
sqlStatement.getFromDatabase().orElse(null), boundFilter);
         SQLStatementCopyUtils.copyAttributes(sqlStatement, result);
         return result;
     }
diff --git 
a/infra/rewrite/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/rewrite/mysql/MySQLToBeRemovedSegmentsProvider.java
 
b/infra/rewrite/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/rewrite/mysql/MySQLToBeRemovedSegmentsProvider.java
index bbc62f4a9bc..04805700c77 100644
--- 
a/infra/rewrite/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/rewrite/mysql/MySQLToBeRemovedSegmentsProvider.java
+++ 
b/infra/rewrite/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/rewrite/mysql/MySQLToBeRemovedSegmentsProvider.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.infra.rewrite.mysql;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.generic.DialectToBeRemovedSegmentsProvider;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLShowColumnsStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowIndexStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowTableStatusStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowTablesStatement;
@@ -39,8 +39,8 @@ public final class MySQLToBeRemovedSegmentsProvider 
implements DialectToBeRemove
         if (sqlStatement instanceof ShowTablesStatement) {
             ((ShowTablesStatement) 
sqlStatement).getFromDatabase().ifPresent(result::add);
         }
-        if (sqlStatement instanceof ShowColumnsStatement) {
-            ((ShowColumnsStatement) 
sqlStatement).getFromDatabase().ifPresent(result::add);
+        if (sqlStatement instanceof MySQLShowColumnsStatement) {
+            ((MySQLShowColumnsStatement) 
sqlStatement).getFromDatabase().ifPresent(result::add);
         }
         if (sqlStatement instanceof ShowIndexStatement) {
             ((ShowIndexStatement) 
sqlStatement).getFromDatabase().ifPresent(result::add);
diff --git 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java
 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java
index bf7af0fd9d3..27ebaa69f57 100644
--- 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java
+++ 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDALStatementVisitor.java
@@ -144,11 +144,11 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.Datab
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.AnalyzeTableStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLDescribeStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLOptimizeTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.SetStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLShowColumnsStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowDatabasesStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowIndexStatement;
@@ -604,7 +604,7 @@ public final class DorisDALStatementVisitor extends 
DorisStatementVisitor implem
     
     @Override
     public ASTNode visitShowColumns(final ShowColumnsContext ctx) {
-        ShowColumnsStatement result = new ShowColumnsStatement(null == 
ctx.fromTable() ? null : ((FromTableSegment) visit(ctx.fromTable())).getTable(),
+        MySQLShowColumnsStatement result = new MySQLShowColumnsStatement(null 
== ctx.fromTable() ? null : ((FromTableSegment) 
visit(ctx.fromTable())).getTable(),
                 null == ctx.fromDatabase() ? null : (FromDatabaseSegment) 
visit(ctx.fromDatabase()), null == ctx.showFilter() ? null : 
(ShowFilterSegment) visit(ctx.showFilter()));
         result.addParameterMarkers(getParameterMarkerSegments());
         return result;
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
index 930ca2d3534..8d3583caac3 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
@@ -143,7 +143,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DatabaseSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLDescribeStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.resource.MySQLAlterResourceGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.AnalyzeTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.replication.binlog.MySQLBinlogStatement;
@@ -175,7 +175,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.replication.binl
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.replication.binlog.MySQLShowBinlogEventsStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.character.MySQLShowCharacterSetStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.character.MySQLShowCollationStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLShowColumnsStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.database.MySQLShowCreateDatabaseStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.event.MySQLShowCreateEventStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.function.MySQLShowCreateFunctionStatement;
@@ -617,7 +617,7 @@ public final class MySQLDALStatementVisitor extends 
MySQLStatementVisitor implem
     
     @Override
     public ASTNode visitShowColumns(final ShowColumnsContext ctx) {
-        ShowColumnsStatement result = new ShowColumnsStatement(null == 
ctx.fromTable() ? null : ((FromTableSegment) visit(ctx.fromTable())).getTable(),
+        MySQLShowColumnsStatement result = new MySQLShowColumnsStatement(null 
== ctx.fromTable() ? null : ((FromTableSegment) 
visit(ctx.fromTable())).getTable(),
                 null == ctx.fromDatabase() ? null : (FromDatabaseSegment) 
visit(ctx.fromDatabase()), null == ctx.showFilter() ? null : 
(ShowFilterSegment) visit(ctx.showFilter()));
         result.addParameterMarkers(getParameterMarkerSegments());
         return result;
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/available/ColumnInfoInResultSetAvailable.java
similarity index 53%
copy from 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java
copy to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/ColumnInfoInResultSetAvailable.java
index 13d3c3ad78a..86043936656 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/available/ColumnInfoInResultSetAvailable.java
@@ -15,28 +15,17 @@
  * limitations under the License.
  */
 
-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.TableAvailable;
-
-import java.util.Collection;
-import java.util.Collections;
+package 
org.apache.shardingsphere.sql.parser.statement.core.statement.available;
 
 /**
- * Show create table statement.
+ * Column info in result set available.
  */
-@RequiredArgsConstructor
-@Getter
-public final class ShowCreateTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable {
-    
-    private final SimpleTableSegment table;
+public interface ColumnInfoInResultSetAvailable {
     
-    @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
-    }
+    /**
+     * Get column name result set index.
+     *
+     * @return column name result set index
+     */
+    int getColumnNameResultSetIndex();
 }
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/available/TableInfoInResultSetAvailable.java
similarity index 53%
copy from 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowCreateTableStatement.java
copy to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/available/TableInfoInResultSetAvailable.java
index 13d3c3ad78a..f4351fe99e4 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/available/TableInfoInResultSetAvailable.java
@@ -15,28 +15,17 @@
  * limitations under the License.
  */
 
-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.TableAvailable;
-
-import java.util.Collection;
-import java.util.Collections;
+package 
org.apache.shardingsphere.sql.parser.statement.core.statement.available;
 
 /**
- * Show create table statement.
+ * Table info in result set available.
  */
-@RequiredArgsConstructor
-@Getter
-public final class ShowCreateTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable {
-    
-    private final SimpleTableSegment table;
+public interface TableInfoInResultSetAvailable {
     
-    @Override
-    public Collection<SimpleTableSegment> getTables() {
-        return Collections.singleton(table);
-    }
+    /**
+     * Get table name result set index.
+     *
+     * @return table name result set index
+     */
+    int getTableNameResultSetIndex();
 }
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 13d3c3ad78a..582d3025b0f 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
@@ -22,6 +22,7 @@ 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.TableAvailable;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableInfoInResultSetAvailable;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -31,7 +32,7 @@ import java.util.Collections;
  */
 @RequiredArgsConstructor
 @Getter
-public final class ShowCreateTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable {
+public final class ShowCreateTableStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable, TableInfoInResultSetAvailable {
     
     private final SimpleTableSegment table;
     
@@ -39,4 +40,9 @@ public final class ShowCreateTableStatement extends 
AbstractSQLStatement impleme
     public Collection<SimpleTableSegment> getTables() {
         return Collections.singleton(table);
     }
+    
+    @Override
+    public int getTableNameResultSetIndex() {
+        return 2;
+    }
 }
diff --git 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLDescribeStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLDescribeStatement.java
similarity index 87%
rename from 
parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLDescribeStatement.java
rename to 
parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLDescribeStatement.java
index a18a04e8381..8fd04baf664 100644
--- 
a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/MySQLDescribeStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLDescribeStatement.java
@@ -15,13 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.statement.mysql.dal;
+package org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column;
 
 import lombok.Getter;
 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.available.ColumnInfoInResultSetAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
@@ -34,7 +35,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class MySQLDescribeStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable {
+public final class MySQLDescribeStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable, ColumnInfoInResultSetAvailable {
     
     private final SimpleTableSegment table;
     
@@ -53,4 +54,9 @@ public final class MySQLDescribeStatement extends 
AbstractSQLStatement implement
     public Collection<SimpleTableSegment> getTables() {
         return Collections.singleton(table);
     }
+    
+    @Override
+    public int getColumnNameResultSetIndex() {
+        return 1;
+    }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowColumnsStatement.java
 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLShowColumnsStatement.java
similarity index 80%
rename from 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowColumnsStatement.java
rename to 
parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLShowColumnsStatement.java
index b1e3e986359..0899bdf84ca 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dal/ShowColumnsStatement.java
+++ 
b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/column/MySQLShowColumnsStatement.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.statement.core.statement.dal;
+package org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -23,8 +23,10 @@ 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.available.ColumnInfoInResultSetAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.FromDatabaseAvailable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.available.TableAvailable;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -35,7 +37,7 @@ import java.util.Optional;
  */
 @RequiredArgsConstructor
 @Getter
-public final class ShowColumnsStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable, FromDatabaseAvailable {
+public final class MySQLShowColumnsStatement extends AbstractSQLStatement 
implements DALStatement, TableAvailable, FromDatabaseAvailable, 
ColumnInfoInResultSetAvailable {
     
     private final SimpleTableSegment table;
     
@@ -43,6 +45,15 @@ public final class ShowColumnsStatement extends 
AbstractSQLStatement implements
     
     private final ShowFilterSegment filter;
     
+    /**
+     * Get filter segment.
+     *
+     * @return filter segment
+     */
+    public Optional<ShowFilterSegment> getFilter() {
+        return Optional.ofNullable(filter);
+    }
+    
     @Override
     public Collection<SimpleTableSegment> getTables() {
         return Collections.singleton(table);
@@ -53,12 +64,8 @@ public final class ShowColumnsStatement extends 
AbstractSQLStatement implements
         return Optional.ofNullable(fromDatabase);
     }
     
-    /**
-     * Get filter segment.
-     *
-     * @return filter segment
-     */
-    public Optional<ShowFilterSegment> getFilter() {
-        return Optional.ofNullable(filter);
+    @Override
+    public int getColumnNameResultSetIndex() {
+        return 1;
     }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java
index 459949563a4..f87d2b9f3bb 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/DALStatementAssert.java
@@ -20,12 +20,12 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLDescribeStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.EmptyStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ExplainStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLOptimizeTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.SetStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLShowColumnsStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowDatabasesStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowIndexStatement;
@@ -211,8 +211,8 @@ public final class DALStatementAssert {
             ShowDatabasesStatementAssert.assertIs(assertContext, 
(ShowDatabasesStatement) actual, (ShowDatabasesStatementTestCase) expected);
         } else if (actual instanceof ShowTablesStatement) {
             ShowTablesStatementAssert.assertIs(assertContext, 
(ShowTablesStatement) actual, (ShowTablesStatementTestCase) expected);
-        } else if (actual instanceof ShowColumnsStatement) {
-            ShowColumnsStatementAssert.assertIs(assertContext, 
(ShowColumnsStatement) actual, (ShowColumnsStatementTestCase) expected);
+        } else if (actual instanceof MySQLShowColumnsStatement) {
+            ShowColumnsStatementAssert.assertIs(assertContext, 
(MySQLShowColumnsStatement) actual, (ShowColumnsStatementTestCase) expected);
         } else if (actual instanceof ShowCreateTableStatement) {
             ShowCreateTableStatementAssert.assertIs(assertContext, 
(ShowCreateTableStatement) actual, (ShowCreateTableStatementTestCase) expected);
         } else if (actual instanceof MySQLShowCreateTriggerStatement) {
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java
index 96aa83201df..7a8a23b81a8 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/DescribeStatementAssert.java
@@ -19,7 +19,7 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLDescribeStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLDescribeStatement;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/ShowColumnsStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/ShowColumnsStatementAssert.java
index 419740d7bb6..9fcd05dec5a 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/ShowColumnsStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dal/impl/ShowColumnsStatementAssert.java
@@ -19,7 +19,7 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowColumnsStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.column.MySQLShowColumnsStatement;
 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.asserts.segment.show.ShowFilterAssert;
@@ -39,7 +39,7 @@ public final class ShowColumnsStatementAssert {
      * @param actual actual show columns statement
      * @param expected expected show columns statement test case
      */
-    public static void assertIs(final SQLCaseAssertContext assertContext, 
final ShowColumnsStatement actual, final ShowColumnsStatementTestCase expected) 
{
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final MySQLShowColumnsStatement actual, final ShowColumnsStatementTestCase 
expected) {
         if (null != actual.getTable()) {
             TableAssert.assertIs(assertContext, actual.getTable(), 
expected.getTable());
         }

Reply via email to