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

sunnianjun 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 ba5e6b7a8ab Refactor name, owner and alias to IdentifierValue to 
support rewrite with quote (#27296)
ba5e6b7a8ab is described below

commit ba5e6b7a8ab456d581b4756a6cbac09ee6d680f0
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Jul 19 15:39:10 2023 +0800

    Refactor name, owner and alias to IdentifierValue to support rewrite with 
quote (#27296)
    
    * Refactor name, owner and alias to IdentifierValue to support rewrite with 
quote
    
    * fix unit test
---
 .../encrypt/merge/dql/EncryptMergedResult.java     |  8 ++---
 .../generator/EncryptProjectionTokenGenerator.java | 37 +++++++++++-----------
 .../mask/merge/dql/MaskAlgorithmMetaData.java      |  4 +--
 .../impl/AggregationDistinctTokenGenerator.java    |  2 +-
 .../generator/impl/ProjectionsTokenGenerator.java  |  8 ++---
 .../AggregationDistinctTokenGeneratorTest.java     |  5 +--
 .../token/ProjectionsTokenGeneratorTest.java       |  6 ++--
 .../segment/select/projection/Projection.java      |  2 +-
 .../select/projection/ProjectionsContext.java      |  3 +-
 .../select/projection/engine/ProjectionEngine.java | 32 +++++++++----------
 .../engine/ProjectionsContextEngine.java           |  8 +++--
 .../impl/AggregationDistinctProjection.java        |  7 ++--
 .../projection/impl/AggregationProjection.java     |  9 +++---
 .../select/projection/impl/ColumnProjection.java   | 28 ++++++++--------
 .../select/projection/impl/DerivedProjection.java  |  9 +++---
 .../projection/impl/ExpressionProjection.java      |  9 +++---
 .../projection/impl/ParameterMarkerProjection.java | 10 +++---
 .../projection/impl/ShorthandProjection.java       | 11 +++----
 .../select/projection/impl/SubqueryProjection.java | 20 ++++++------
 .../engine/SubqueryTableContextEngine.java         |  6 ++--
 .../infra/binder/segment/table/TablesContext.java  |  8 ++---
 .../statement/dml/SelectStatementContext.java      | 10 +++---
 .../select/projection/ProjectionsContextTest.java  | 13 ++++----
 .../projection/engine/ProjectionEngineTest.java    |  2 +-
 .../impl/AggregationDistinctProjectionTest.java    |  3 +-
 .../projection/impl/AggregationProjectionTest.java |  9 +++---
 .../projection/impl/ShorthandProjectionTest.java   |  9 +++---
 .../pojo/generic/SubstitutableColumnNameToken.java | 14 ++++----
 .../generic/SubstitutableColumnNameTokenTest.java  |  2 +-
 .../resultset/ShardingSphereResultSetMetaData.java |  2 +-
 .../resultset/SQLFederationResultSetMetaData.java  |  2 +-
 .../simple/ParameterMarkerExpressionSegment.java   |  5 +--
 .../dml/item/AggregationProjectionSegment.java     |  5 +--
 .../segment/dml/item/ColumnProjectionSegment.java  |  5 +--
 .../dml/item/ExpressionProjectionSegment.java      |  5 +--
 .../dml/item/ShorthandProjectionSegment.java       |  5 +--
 .../dml/item/SubqueryProjectionSegment.java        |  5 +--
 .../sql/common/segment/generic/AliasAvailable.java |  7 ++--
 .../generic/table/DeleteMultiTableSegment.java     |  3 +-
 .../segment/generic/table/JoinTableSegment.java    |  5 +--
 .../segment/generic/table/SimpleTableSegment.java  |  5 +--
 .../generic/table/SubqueryTableSegment.java        |  5 +--
 .../segment/generic/table/XmlTableSegment.java     |  3 +-
 .../header/query/QueryHeaderBuilderEngine.java     |  2 +-
 .../executor/MySQLSystemVariableQueryExecutor.java |  2 +-
 .../admin/executor/ShowConnectionIdExecutor.java   |  2 +-
 46 files changed, 187 insertions(+), 175 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
index 882db16ba41..d4b231aeff6 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
@@ -69,12 +69,12 @@ public final class EncryptMergedResult implements 
MergedResult {
         if (!tableName.isPresent()) {
             return mergedResult.getValue(columnIndex, type);
         }
-        if (!encryptRule.findEncryptTable(tableName.get()).map(optional -> 
optional.isEncryptColumn(originalColumn.getName())).orElse(false)) {
+        if (!encryptRule.findEncryptTable(tableName.get()).map(optional -> 
optional.isEncryptColumn(originalColumn.getName().getValue())).orElse(false)) {
             return mergedResult.getValue(columnIndex, type);
         }
         Object cipherValue = mergedResult.getValue(columnIndex, Object.class);
-        EncryptColumn encryptColumn = 
encryptRule.getEncryptTable(tableName.get()).getEncryptColumn(originalColumn.getName());
-        return encryptColumn.getCipher().decrypt(database.getName(), 
schemaName, tableName.get(), originalColumn.getName(), cipherValue);
+        EncryptColumn encryptColumn = 
encryptRule.getEncryptTable(tableName.get()).getEncryptColumn(originalColumn.getName().getValue());
+        return encryptColumn.getCipher().decrypt(database.getName(), 
schemaName, tableName.get(), originalColumn.getName().getValue(), cipherValue);
     }
     
     private Optional<String> findTableName(final ColumnProjection 
columnProjection, final Map<String, String> columnTableNames) {
@@ -83,7 +83,7 @@ public final class EncryptMergedResult implements 
MergedResult {
             return Optional.of(tableName);
         }
         for (String each : 
selectStatementContext.getTablesContext().getTableNames()) {
-            if (encryptRule.findEncryptTable(each).map(optional -> 
optional.isEncryptColumn(columnProjection.getName())).orElse(false)) {
+            if (encryptRule.findEncryptTable(each).map(optional -> 
optional.isEncryptColumn(columnProjection.getName().getValue())).orElse(false)) 
{
                 return Optional.of(each);
             }
         }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
index 4f7f48b1f58..75980dd3e31 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
@@ -41,7 +41,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.enums.SubqueryType;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ColumnProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
@@ -97,8 +96,8 @@ public final class EncryptProjectionTokenGenerator implements 
CollectionSQLToken
                     continue;
                 }
                 Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
-                if (encryptTable.isPresent() && 
encryptTable.get().isEncryptColumn(columnProjection.getName()) && 
!containsTableSubquery(selectStatementContext)) {
-                    
sqlTokens.add(generateSQLToken(encryptTable.get().getEncryptColumn(columnProjection.getName()),
 columnSegment, columnProjection, subqueryType));
+                if (encryptTable.isPresent() && 
encryptTable.get().isEncryptColumn(columnProjection.getName().getValue()) && 
!containsTableSubquery(selectStatementContext)) {
+                    
sqlTokens.add(generateSQLToken(encryptTable.get().getEncryptColumn(columnProjection.getName().getValue()),
 columnSegment, columnProjection, subqueryType));
                 }
             }
             if (each instanceof ShorthandProjectionSegment) {
@@ -128,7 +127,7 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
             if (!encryptTable.isPresent() || 
!encryptTable.get().isEncryptColumn(each.getColumnLabel()) || 
containsTableSubquery(selectStatementContext)) {
                 projections.add(each.getAlias().map(optional -> (Projection) 
new ColumnProjection(null, optional, null)).orElse(each));
             } else if (each instanceof ColumnProjection) {
-                
projections.addAll(generateProjections(encryptTable.get().getEncryptColumn(((ColumnProjection)
 each).getName()), (ColumnProjection) each, subqueryType, true, segment));
+                
projections.addAll(generateProjections(encryptTable.get().getEncryptColumn(((ColumnProjection)
 each).getName().getValue()), (ColumnProjection) each, subqueryType, true, 
segment));
             }
         }
         int startIndex = segment.getOwner().isPresent() ? 
segment.getOwner().get().getStartIndex() : segment.getStartIndex();
@@ -148,7 +147,7 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
     
     private ColumnProjection buildColumnProjection(final 
ColumnProjectionSegment segment) {
         IdentifierValue owner = 
segment.getColumn().getOwner().map(OwnerSegment::getIdentifier).orElse(null);
-        return new ColumnProjection(owner, 
segment.getColumn().getIdentifier(), segment.getAliasName().isPresent() ? 
segment.getAlias().map(AliasSegment::getIdentifier).orElse(null) : null);
+        return new ColumnProjection(owner, 
segment.getColumn().getIdentifier(), segment.getAliasName().isPresent() ? 
segment.getAlias().orElse(null) : null);
     }
     
     private Map<String, String> getColumnTableNames(final 
SelectStatementContext selectStatementContext) {
@@ -182,43 +181,43 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
     }
     
     private ColumnProjection distinctOwner(final ColumnProjection column, 
final boolean shorthand) {
-        if (shorthand || null == column.getOwner()) {
+        if (shorthand || !column.getOwner().isPresent()) {
             return column;
         }
-        return new ColumnProjection(null, column.getNameIdentifier(), 
column.getAlias().isPresent() ? column.getAliasIdentifier() : null);
+        return new ColumnProjection(null, column.getName(), 
column.getAlias().isPresent() ? column.getAlias().get() : null);
     }
     
     private ColumnProjection generatePredicateSubqueryProjection(final 
EncryptColumn encryptColumn, final ColumnProjection column) {
         Optional<AssistedQueryColumnItem> assistedQueryColumn = 
encryptColumn.getAssistedQuery();
         if (assistedQueryColumn.isPresent()) {
-            return new ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(assistedQueryColumn.get().getName(), 
column.getNameIdentifier().getQuoteCharacter()), null);
+            return new ColumnProjection(column.getOwner().orElse(null), new 
IdentifierValue(assistedQueryColumn.get().getName(), 
column.getName().getQuoteCharacter()), null);
         }
         String cipherColumn = encryptColumn.getCipher().getName();
-        return new ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(cipherColumn, column.getNameIdentifier().getQuoteCharacter()), 
null);
+        return new ColumnProjection(column.getOwner().orElse(null), new 
IdentifierValue(cipherColumn, column.getName().getQuoteCharacter()), null);
     }
     
     private Collection<ColumnProjection> 
generateTableSubqueryProjections(final EncryptColumn encryptColumn, final 
ColumnProjection column, final boolean shorthand) {
         Collection<ColumnProjection> result = new LinkedList<>();
-        result.add(distinctOwner(new 
ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(encryptColumn.getCipher().getName(),
-                column.getNameIdentifier().getQuoteCharacter()), 
Optional.ofNullable(column.getAliasIdentifier()).orElse(column.getNameIdentifier())),
 shorthand));
+        result.add(distinctOwner(new 
ColumnProjection(column.getOwner().orElse(null), new 
IdentifierValue(encryptColumn.getCipher().getName(),
+                column.getName().getQuoteCharacter()), 
column.getAlias().orElse(column.getName())), shorthand));
         encryptColumn.getAssistedQuery().ifPresent(optional -> result.add(
-                new ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(optional.getName(), 
column.getNameIdentifier().getQuoteCharacter()), null)));
+                new ColumnProjection(column.getOwner().orElse(null), new 
IdentifierValue(optional.getName(), column.getName().getQuoteCharacter()), 
null)));
         return result;
     }
     
     private Collection<ColumnProjection> 
generateExistsSubqueryProjections(final EncryptColumn encryptColumn, final 
ColumnProjection column, final boolean shorthand) {
         Collection<ColumnProjection> result = new LinkedList<>();
-        result.add(distinctOwner(new 
ColumnProjection(column.getOwnerIdentifier(), new 
IdentifierValue(encryptColumn.getCipher().getName(),
-                column.getNameIdentifier().getQuoteCharacter()), null), 
shorthand));
+        result.add(distinctOwner(new 
ColumnProjection(column.getOwner().orElse(null), new 
IdentifierValue(encryptColumn.getCipher().getName(),
+                column.getName().getQuoteCharacter()), null), shorthand));
         return result;
     }
     
     private ColumnProjection generateCommonProjection(final EncryptColumn 
encryptColumn, final ColumnProjection column, final ShorthandProjectionSegment 
segment) {
         String queryColumnName = encryptColumn.getCipher().getName();
-        IdentifierValue owner = (null == segment || 
!segment.getOwner().isPresent()) ? column.getOwnerIdentifier() : 
segment.getOwner().get().getIdentifier();
-        return new ColumnProjection(owner, new 
IdentifierValue(queryColumnName, 
column.getNameIdentifier().getQuoteCharacter()), column.getAlias().isPresent()
-                ? column.getAliasIdentifier()
-                : column.getNameIdentifier());
+        IdentifierValue owner = (null == segment || 
!segment.getOwner().isPresent()) ? column.getOwner().orElse(null) : 
segment.getOwner().get().getIdentifier();
+        return new ColumnProjection(owner, new 
IdentifierValue(queryColumnName, column.getName().getQuoteCharacter()), 
column.getAlias().isPresent()
+                ? column.getAlias().get()
+                : column.getName());
     }
     
     private ShorthandProjection getShorthandProjection(final 
ShorthandProjectionSegment segment, final ProjectionsContext 
projectionsContext) {
@@ -228,7 +227,7 @@ public final class EncryptProjectionTokenGenerator 
implements CollectionSQLToken
                 if (!owner.isPresent() && !((ShorthandProjection) 
each).getOwner().isPresent()) {
                     return (ShorthandProjection) each;
                 }
-                if (owner.isPresent() && 
owner.get().equals(((ShorthandProjection) each).getOwner().orElse(null))) {
+                if (owner.isPresent() && 
owner.get().equals(((ShorthandProjection) 
each).getOwner().map(IdentifierValue::getValue).orElse(null))) {
                     return (ShorthandProjection) each;
                 }
             }
diff --git 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaData.java
 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaData.java
index b2ec588e00e..5c0757c2af4 100644
--- 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaData.java
+++ 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaData.java
@@ -60,7 +60,7 @@ public final class MaskAlgorithmMetaData {
         String schemaName = tablesContext.getSchemaName().orElseGet(() -> 
DatabaseTypeEngine.getDefaultSchemaName(selectStatementContext.getDatabaseType(),
 database.getName()));
         Map<String, String> expressionTableNames = 
tablesContext.findTableNamesByColumnProjection(
                 Collections.singletonList(columnProjection.get()), 
database.getSchema(schemaName));
-        return findTableName(columnProjection.get(), 
expressionTableNames).flatMap(optional -> maskRule.findMaskAlgorithm(optional, 
columnProjection.get().getName()));
+        return findTableName(columnProjection.get(), 
expressionTableNames).flatMap(optional -> maskRule.findMaskAlgorithm(optional, 
columnProjection.get().getName().getValue()));
     }
     
     private Optional<ColumnProjection> findColumnProjection(final int 
columnIndex) {
@@ -78,7 +78,7 @@ public final class MaskAlgorithmMetaData {
             return Optional.of(tableName);
         }
         for (String each : 
selectStatementContext.getTablesContext().getTableNames()) {
-            if (maskRule.findMaskAlgorithm(each, 
columnProjection.getName()).isPresent()) {
+            if (maskRule.findMaskAlgorithm(each, 
columnProjection.getName().getValue()).isPresent()) {
                 return Optional.of(each);
             }
         }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/AggregationDistinctTokenGenerator.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/AggregationDistinctTokenGenerator.java
index 356fc1483f7..8a67d663c1b 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/AggregationDistinctTokenGenerator.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/AggregationDistinctTokenGenerator.java
@@ -51,7 +51,7 @@ public final class AggregationDistinctTokenGenerator 
implements CollectionSQLTok
     
     private AggregationDistinctToken generateSQLToken(final 
AggregationDistinctProjection projection) {
         Preconditions.checkArgument(projection.getAlias().isPresent());
-        String derivedAlias = 
DerivedColumn.isDerivedColumnName(projection.getAlias().get()) ? 
projection.getAlias().get() : null;
+        String derivedAlias = 
DerivedColumn.isDerivedColumnName(projection.getAlias().get().getValue()) ? 
projection.getAlias().get().getValue() : null;
         return new AggregationDistinctToken(projection.getStartIndex(), 
projection.getStopIndex(), projection.getDistinctInnerExpression(), 
derivedAlias);
     }
 }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
index c073cbc2af1..377db5803e0 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ProjectionsTokenGenerator.java
@@ -25,8 +25,8 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Agg
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.DerivedProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.infra.database.oracle.OracleDatabaseType;
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.RouteContextAware;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
@@ -98,9 +98,9 @@ public final class ProjectionsTokenGenerator implements 
OptionalSQLTokenGenerato
     private String getDerivedProjectionText(final Projection projection) {
         Preconditions.checkState(projection.getAlias().isPresent());
         if (projection instanceof AggregationDistinctProjection) {
-            return ((AggregationDistinctProjection) 
projection).getDistinctInnerExpression() + " AS " + projection.getAlias().get() 
+ " ";
+            return ((AggregationDistinctProjection) 
projection).getDistinctInnerExpression() + " AS " + 
projection.getAlias().get().getValue() + " ";
         }
-        return projection.getExpression() + " AS " + 
projection.getAlias().get() + " ";
+        return projection.getExpression() + " AS " + 
projection.getAlias().get().getValue() + " ";
     }
     
     private String getDerivedProjectionTextFromColumnOrderByItemSegment(final 
DerivedProjection projection, final TableExtractor tableExtractor, final 
RouteUnit routeUnit,
@@ -109,7 +109,7 @@ public final class ProjectionsTokenGenerator implements 
OptionalSQLTokenGenerato
         Preconditions.checkState(projection.getDerivedProjectionSegment() 
instanceof ColumnOrderByItemSegment);
         ColumnOrderByItemSegment columnOrderByItemSegment = 
(ColumnOrderByItemSegment) projection.getDerivedProjectionSegment();
         ColumnOrderByItemSegment newColumnOrderByItem = 
generateNewColumnOrderByItem(columnOrderByItemSegment, routeUnit, 
tableExtractor, databaseType);
-        return newColumnOrderByItem.getText() + " AS " + 
projection.getAlias().get() + " ";
+        return newColumnOrderByItem.getText() + " AS " + 
projection.getAlias().get().getValue() + " ";
     }
     
     private Optional<String> getActualTables(final RouteUnit routeUnit, final 
String logicalTableName) {
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/AggregationDistinctTokenGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/AggregationDistinctTokenGeneratorTest.java
index 9d6bf17a125..01c279d27f7 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/AggregationDistinctTokenGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/AggregationDistinctTokenGeneratorTest.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementConte
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
 import 
org.apache.shardingsphere.sharding.rewrite.token.generator.impl.AggregationDistinctTokenGenerator;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
@@ -52,7 +53,7 @@ class AggregationDistinctTokenGeneratorTest {
     void assertGenerateSQLToken() {
         AggregationDistinctProjection aggregationDistinctProjection = 
mock(AggregationDistinctProjection.class);
         String testAlias = "AVG_DERIVED_COUNT_0";
-        
when(aggregationDistinctProjection.getAlias()).thenReturn(Optional.of(testAlias));
+        
when(aggregationDistinctProjection.getAlias()).thenReturn(Optional.of(new 
IdentifierValue(testAlias)));
         when(aggregationDistinctProjection.getStartIndex()).thenReturn(0);
         when(aggregationDistinctProjection.getStopIndex()).thenReturn(2);
         String testDistinctInnerExpression = "TEST_DISTINCT_INNER_EXPRESSION";
@@ -62,7 +63,7 @@ class AggregationDistinctTokenGeneratorTest {
         AggregationDistinctTokenGenerator aggregationDistinctTokenGenerator = 
new AggregationDistinctTokenGenerator();
         List<SQLToken> generateSQLTokensResult = new 
ArrayList<>(aggregationDistinctTokenGenerator.generateSQLTokens(selectStatementContext));
         assertThat(generateSQLTokensResult.get(0).toString(), 
is(testDistinctInnerExpression + " AS " + testAlias));
-        
when(aggregationDistinctProjection.getAlias()).thenReturn(Optional.of("TEST_ERROR_ALIAS"));
+        
when(aggregationDistinctProjection.getAlias()).thenReturn(Optional.of(new 
IdentifierValue("TEST_ERROR_ALIAS")));
         generateSQLTokensResult = new 
ArrayList<>(aggregationDistinctTokenGenerator.generateSQLTokens(selectStatementContext));
         assertThat(generateSQLTokensResult.get(0).toString(), 
is(testDistinctInnerExpression));
     }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
index 38c52ea51b6..ae6e59337f0 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/ProjectionsTokenGeneratorTest.java
@@ -127,7 +127,7 @@ class ProjectionsTokenGeneratorTest {
     private AggregationProjection getAggregationProjection() {
         AggregationDistinctProjection derivedAggregationDistinctProjection = 
mock(AggregationDistinctProjection.class);
         
when(derivedAggregationDistinctProjection.getDistinctInnerExpression()).thenReturn(TEST_AGGREGATION_DISTINCT_PROJECTION_DISTINCT_INNER_EXPRESSION);
-        
when(derivedAggregationDistinctProjection.getAlias()).thenReturn(Optional.of(TEST_AGGREGATION_DISTINCT_PROJECTION_ALIAS));
+        
when(derivedAggregationDistinctProjection.getAlias()).thenReturn(Optional.of(new
 IdentifierValue(TEST_AGGREGATION_DISTINCT_PROJECTION_ALIAS)));
         AggregationProjection result = mock(AggregationProjection.class);
         
when(result.getDerivedAggregationProjections()).thenReturn(Collections.singletonList(derivedAggregationDistinctProjection));
         return result;
@@ -142,7 +142,7 @@ class ProjectionsTokenGeneratorTest {
         
when(oldColumnOrderByItemSegment.getOrderDirection()).thenReturn(mock(OrderDirection.class));
         
when(oldColumnOrderByItemSegment.getColumn().getIdentifier()).thenReturn(mock(IdentifierValue.class));
         DerivedProjection result = mock(DerivedProjection.class);
-        
when(result.getAlias()).thenReturn(Optional.of(TEST_DERIVED_PROJECTION_ALIAS));
+        when(result.getAlias()).thenReturn(Optional.of(new 
IdentifierValue(TEST_DERIVED_PROJECTION_ALIAS)));
         
when(result.getDerivedProjectionSegment()).thenReturn(oldColumnOrderByItemSegment);
         return result;
     }
@@ -150,7 +150,7 @@ class ProjectionsTokenGeneratorTest {
     private DerivedProjection getOtherDerivedProjection() {
         DerivedProjection result = mock(DerivedProjection.class);
         when(result.getDerivedProjectionSegment()).thenReturn(null);
-        
when(result.getAlias()).thenReturn(Optional.of(TEST_OTHER_DERIVED_PROJECTION_ALIAS));
+        when(result.getAlias()).thenReturn(Optional.of(new 
IdentifierValue(TEST_OTHER_DERIVED_PROJECTION_ALIAS)));
         
when(result.getExpression()).thenReturn(TEST_OTHER_DERIVED_PROJECTION_EXPRESSION);
         return result;
     }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/Projection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/Projection.java
index ee6e71e4835..91cd960b15a 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/Projection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/Projection.java
@@ -38,7 +38,7 @@ public interface Projection {
      * 
      * @return alias
      */
-    Optional<String> getAlias();
+    Optional<IdentifierValue> getAlias();
     
     /**
      * Get columnLabel.
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
index 8b9dd179279..523c7b27ac6 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContext.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Col
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.DerivedProjection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ShorthandProjection;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -116,7 +117,7 @@ public final class ProjectionsContext {
                 }
             }
             if 
(projectionName.equalsIgnoreCase(SQLUtils.getExactlyValue(each.getExpression())))
 {
-                return each.getAlias();
+                return each.getAlias().map(IdentifierValue::getValue);
             }
         }
         return Optional.empty();
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
index 956a21dff07..d318ba9bada 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngine.java
@@ -28,9 +28,9 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Exp
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ParameterMarkerProjection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ShorthandProjection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.SubqueryProjection;
-import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.mysql.MySQLDatabaseType;
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.infra.exception.SchemaNotFoundException;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
@@ -45,7 +45,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Expressi
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ShorthandProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.SubqueryProjectionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -113,13 +112,13 @@ public final class ProjectionEngine {
     }
     
     private ParameterMarkerProjection createProjection(final 
ParameterMarkerExpressionSegment projectionSegment) {
-        return new 
ParameterMarkerProjection(projectionSegment.getParameterMarkerIndex(), 
projectionSegment.getParameterMarkerType(), 
projectionSegment.getAliasName().orElse(null));
+        return new 
ParameterMarkerProjection(projectionSegment.getParameterMarkerIndex(), 
projectionSegment.getParameterMarkerType(), 
projectionSegment.getAlias().orElse(null));
     }
     
     private SubqueryProjection createProjection(final TableSegment table, 
final SubqueryProjectionSegment projectionSegment) {
         Projection subqueryProjection = createProjection(table, 
projectionSegment.getSubquery().getSelect().getProjections().getProjections().iterator().next())
                 .orElseThrow(() -> new IllegalArgumentException("Subquery 
projection must have at least one projection column."));
-        return new SubqueryProjection(projectionSegment.getText(), 
subqueryProjection, projectionSegment.getAliasName().orElse(null), 
databaseType);
+        return new SubqueryProjection(projectionSegment.getText(), 
subqueryProjection, projectionSegment.getAlias().orElse(null), databaseType);
     }
     
     private ShorthandProjection createProjection(final TableSegment table, 
final ShorthandProjectionSegment projectionSegment) {
@@ -128,23 +127,22 @@ public final class ProjectionEngine {
         projections.addAll(getShorthandColumnsFromSimpleTableSegment(table, 
owner));
         projections.addAll(getShorthandColumnsFromSubqueryTableSegment(table, 
owner));
         projections.addAll(getShorthandColumnsFromJoinTableSegment(table, 
owner, projectionSegment));
-        return new ShorthandProjection(null == owner ? null : 
owner.getValue(), projections);
+        return new ShorthandProjection(owner, projections);
     }
     
     private ColumnProjection createProjection(final ColumnProjectionSegment 
projectionSegment) {
         IdentifierValue owner = 
projectionSegment.getColumn().getOwner().isPresent() ? 
projectionSegment.getColumn().getOwner().get().getIdentifier() : null;
-        return new ColumnProjection(owner, 
projectionSegment.getColumn().getIdentifier(), 
projectionSegment.getAliasName().isPresent()
-                ? 
projectionSegment.getAlias().map(AliasSegment::getIdentifier).orElse(null)
-                : null);
+        return new ColumnProjection(owner, 
projectionSegment.getColumn().getIdentifier(), 
projectionSegment.getAliasName().isPresent() ? 
projectionSegment.getAlias().orElse(null) : null);
     }
     
     private ExpressionProjection createProjection(final 
ExpressionProjectionSegment projectionSegment) {
-        return new ExpressionProjection(projectionSegment.getText(), 
projectionSegment.getAliasName().orElse(null));
+        return new ExpressionProjection(projectionSegment.getText(), 
projectionSegment.getAlias().orElse(null));
     }
     
     private AggregationDistinctProjection createProjection(final 
AggregationDistinctProjectionSegment projectionSegment) {
         String innerExpression = projectionSegment.getInnerExpression();
-        String alias = projectionSegment.getAliasName().orElseGet(() -> 
DerivedColumn.AGGREGATION_DISTINCT_DERIVED.getDerivedColumnAlias(aggregationDistinctDerivedColumnCount++));
+        IdentifierValue alias =
+                projectionSegment.getAlias().orElseGet(() -> new 
IdentifierValue(DerivedColumn.AGGREGATION_DISTINCT_DERIVED.getDerivedColumnAlias(aggregationDistinctDerivedColumnCount++)));
         AggregationDistinctProjection result = new 
AggregationDistinctProjection(
                 projectionSegment.getStartIndex(), 
projectionSegment.getStopIndex(), projectionSegment.getType(), innerExpression, 
alias, projectionSegment.getDistinctExpression(), databaseType);
         if (AggregationType.AVG == result.getType()) {
@@ -155,7 +153,7 @@ public final class ProjectionEngine {
     
     private AggregationProjection createProjection(final 
AggregationProjectionSegment projectionSegment) {
         String innerExpression = projectionSegment.getInnerExpression();
-        AggregationProjection result = new 
AggregationProjection(projectionSegment.getType(), innerExpression, 
projectionSegment.getAliasName().orElse(null), databaseType);
+        AggregationProjection result = new 
AggregationProjection(projectionSegment.getType(), innerExpression, 
projectionSegment.getAlias().orElse(null), databaseType);
         if (AggregationType.AVG == result.getType()) {
             appendAverageDerivedProjection(result);
             // TODO replace avg to constant, avoid calculate useless avg
@@ -175,7 +173,7 @@ public final class ProjectionEngine {
         ShardingSpherePreconditions.checkNotNull(schema, () -> new 
SchemaNotFoundException(schemaName));
         Collection<ColumnProjection> result = new LinkedList<>();
         if (null == owner) {
-            schema.getVisibleColumnNames(tableName).stream().map(each -> new 
ColumnProjection(table.getAlias().map(AliasSegment::getIdentifier)
+            schema.getVisibleColumnNames(tableName).stream().map(each -> new 
ColumnProjection(table.getAlias()
                     .orElse(((SimpleTableSegment) 
table).getTableName().getIdentifier()), new IdentifierValue(each, 
databaseType.getQuoteCharacter()), null)).forEach(result::add);
         } else if (owner.getValue().equalsIgnoreCase(tableAlias)) {
             schema.getVisibleColumnNames(tableName).stream().map(each -> new 
ColumnProjection(owner, new IdentifierValue(each, 
databaseType.getQuoteCharacter()), null)).forEach(result::add);
@@ -190,7 +188,7 @@ public final class ProjectionEngine {
         SelectStatement subSelectStatement = ((SubqueryTableSegment) 
table).getSubquery().getSelect();
         Collection<Projection> projections = 
subSelectStatement.getProjections().getProjections().stream().map(each -> 
createProjection(subSelectStatement.getFrom(), each).orElse(null))
                 .filter(Objects::nonNull).collect(Collectors.toList());
-        IdentifierValue subqueryTableAlias = 
table.getAlias().map(AliasSegment::getIdentifier).orElse(null);
+        IdentifierValue subqueryTableAlias = table.getAlias().orElse(null);
         return getSubqueryTableActualProjections(projections, 
subqueryTableAlias);
     }
     
@@ -332,10 +330,10 @@ public final class ProjectionEngine {
         String distinctInnerExpression = 
averageDistinctProjection.getDistinctInnerExpression();
         String countAlias = 
DerivedColumn.AVG_COUNT_ALIAS.getDerivedColumnAlias(aggregationAverageDerivedColumnCount);
         AggregationDistinctProjection countDistinctProjection = new 
AggregationDistinctProjection(
-                0, 0, AggregationType.COUNT, innerExpression, countAlias, 
distinctInnerExpression, databaseType);
+                0, 0, AggregationType.COUNT, innerExpression, new 
IdentifierValue(countAlias), distinctInnerExpression, databaseType);
         String sumAlias = 
DerivedColumn.AVG_SUM_ALIAS.getDerivedColumnAlias(aggregationAverageDerivedColumnCount);
         AggregationDistinctProjection sumDistinctProjection = new 
AggregationDistinctProjection(
-                0, 0, AggregationType.SUM, innerExpression, sumAlias, 
distinctInnerExpression, databaseType);
+                0, 0, AggregationType.SUM, innerExpression, new 
IdentifierValue(sumAlias), distinctInnerExpression, databaseType);
         
averageDistinctProjection.getDerivedAggregationProjections().add(countDistinctProjection);
         
averageDistinctProjection.getDerivedAggregationProjections().add(sumDistinctProjection);
         aggregationAverageDerivedColumnCount++;
@@ -344,9 +342,9 @@ public final class ProjectionEngine {
     private void appendAverageDerivedProjection(final AggregationProjection 
averageProjection) {
         String innerExpression = averageProjection.getInnerExpression();
         String countAlias = 
DerivedColumn.AVG_COUNT_ALIAS.getDerivedColumnAlias(aggregationAverageDerivedColumnCount);
-        AggregationProjection countProjection = new 
AggregationProjection(AggregationType.COUNT, innerExpression, countAlias, 
databaseType);
+        AggregationProjection countProjection = new 
AggregationProjection(AggregationType.COUNT, innerExpression, new 
IdentifierValue(countAlias), databaseType);
         String sumAlias = 
DerivedColumn.AVG_SUM_ALIAS.getDerivedColumnAlias(aggregationAverageDerivedColumnCount);
-        AggregationProjection sumProjection = new 
AggregationProjection(AggregationType.SUM, innerExpression, sumAlias, 
databaseType);
+        AggregationProjection sumProjection = new 
AggregationProjection(AggregationType.SUM, innerExpression, new 
IdentifierValue(sumAlias), databaseType);
         
averageProjection.getDerivedAggregationProjections().add(countProjection);
         
averageProjection.getDerivedAggregationProjections().add(sumProjection);
         aggregationAverageDerivedColumnCount++;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
index c5fc0089926..d5458b77e0c 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngine.java
@@ -37,6 +37,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.Or
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.item.TextOrderByItemSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -92,7 +93,8 @@ public final class ProjectionsContextEngine {
         int derivedColumnOffset = 0;
         for (OrderByItem each : orderItems) {
             if (!containsProjection(each.getSegment(), projections)) {
-                result.add(new DerivedProjection(((TextOrderByItemSegment) 
each.getSegment()).getText(), 
derivedColumn.getDerivedColumnAlias(derivedColumnOffset++), each.getSegment()));
+                result.add(new DerivedProjection(((TextOrderByItemSegment) 
each.getSegment()).getText(), new 
IdentifierValue(derivedColumn.getDerivedColumnAlias(derivedColumnOffset++)),
+                        each.getSegment()));
             }
         }
         return result;
@@ -140,11 +142,11 @@ public final class ProjectionsContextEngine {
     }
     
     private boolean isSameName(final ColumnProjection projection, final String 
text) {
-        return 
SQLUtils.getExactlyValue(text).equalsIgnoreCase(projection.getName());
+        return 
SQLUtils.getExactlyValue(text).equalsIgnoreCase(projection.getName().getValue());
     }
     
     private boolean isSameAlias(final Projection projection, final String 
text) {
-        return projection.getAlias().isPresent() && 
SQLUtils.getExactlyValue(text).equalsIgnoreCase(SQLUtils.getExactlyValue(projection.getAlias().get()));
+        return projection.getAlias().isPresent() && 
SQLUtils.getExactlyValue(text).equalsIgnoreCase(SQLUtils.getExactlyValue(projection.getAlias().get().getValue()));
     }
     
     private boolean isSameQualifiedName(final Projection projection, final 
String text) {
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjection.java
index 778de40d7e9..2ed89fa7571 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjection.java
@@ -36,7 +36,7 @@ public final class AggregationDistinctProjection extends 
AggregationProjection {
     private final String distinctInnerExpression;
     
     public AggregationDistinctProjection(final int startIndex, final int 
stopIndex, final AggregationType type, final String innerExpression,
-                                         final String alias, final String 
distinctInnerExpression, final DatabaseType databaseType) {
+                                         final IdentifierValue alias, final 
String distinctInnerExpression, final DatabaseType databaseType) {
         super(type, innerExpression, alias, databaseType);
         this.startIndex = startIndex;
         this.stopIndex = stopIndex;
@@ -49,14 +49,13 @@ public final class AggregationDistinctProjection extends 
AggregationProjection {
      * @return distinct column label
      */
     public String getDistinctColumnLabel() {
-        return getAlias().orElse(distinctInnerExpression);
+        return 
getAlias().map(IdentifierValue::getValue).orElse(distinctInnerExpression);
     }
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        // TODO replace getAlias with aliasIdentifier
         if (getAlias().isPresent()) {
-            return new ColumnProjection(subqueryTableAlias, new 
IdentifierValue(getAlias().get()), null);
+            return new ColumnProjection(subqueryTableAlias, getAlias().get(), 
null);
         }
         return new AggregationDistinctProjection(startIndex, stopIndex, 
getType(), getInnerExpression(), null, distinctInnerExpression, 
getDatabaseType());
     }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjection.java
index 3888bf67850..598bfa77ba2 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjection.java
@@ -44,7 +44,7 @@ public class AggregationProjection implements Projection {
     
     private final String innerExpression;
     
-    private final String alias;
+    private final IdentifierValue alias;
     
     private final DatabaseType databaseType;
     
@@ -59,7 +59,7 @@ public class AggregationProjection implements Projection {
     }
     
     @Override
-    public final Optional<String> getAlias() {
+    public final Optional<IdentifierValue> getAlias() {
         return Optional.ofNullable(alias);
     }
     
@@ -70,14 +70,13 @@ public class AggregationProjection implements Projection {
      */
     @Override
     public String getColumnLabel() {
-        return getAlias().orElseGet(() -> 
databaseType.getDefaultSchema().isPresent() ? type.name().toLowerCase() : 
getExpression());
+        return getAlias().map(IdentifierValue::getValue).orElseGet(() -> 
databaseType.getDefaultSchema().isPresent() ? type.name().toLowerCase() : 
getExpression());
     }
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        // TODO replace getAlias with aliasIdentifier
         if (getAlias().isPresent()) {
-            return new ColumnProjection(subqueryTableAlias, new 
IdentifierValue(getAlias().get()), null);
+            return new ColumnProjection(subqueryTableAlias, getAlias().get(), 
null);
         }
         AggregationProjection result = new AggregationProjection(type, 
innerExpression, alias, databaseType);
         result.setIndex(index);
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ColumnProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ColumnProjection.java
index 1b12c8a8c60..30eddead84e 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ColumnProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ColumnProjection.java
@@ -38,11 +38,11 @@ import java.util.Optional;
 @ToString
 public final class ColumnProjection implements Projection {
     
-    private final IdentifierValue ownerIdentifier;
+    private final IdentifierValue owner;
     
-    private final IdentifierValue nameIdentifier;
+    private final IdentifierValue name;
     
-    private final IdentifierValue aliasIdentifier;
+    private final IdentifierValue alias;
     
     private IdentifierValue originalOwner;
     
@@ -58,8 +58,8 @@ public final class ColumnProjection implements Projection {
      * 
      * @return column name
      */
-    public String getName() {
-        return nameIdentifier.getValue();
+    public IdentifierValue getName() {
+        return name;
     }
     
     /**
@@ -67,28 +67,28 @@ public final class ColumnProjection implements Projection {
      * 
      * @return owner
      */
-    public String getOwner() {
-        return null == ownerIdentifier ? null : ownerIdentifier.getValue();
+    public Optional<IdentifierValue> getOwner() {
+        return Optional.ofNullable(owner);
     }
     
     @Override
     public String getExpression() {
-        return null == getOwner() ? getName() : getOwner() + "." + getName();
+        return null == owner ? name.getValue() : owner.getValue() + "." + 
name.getValue();
     }
     
     @Override
     public String getColumnLabel() {
-        return getAlias().orElse(getName());
+        return 
getAlias().map(IdentifierValue::getValue).orElse(name.getValue());
     }
     
     @Override
-    public Optional<String> getAlias() {
-        return 
Optional.ofNullable(aliasIdentifier).map(IdentifierValue::getValue);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias);
     }
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        ColumnProjection result = null == aliasIdentifier ? new 
ColumnProjection(subqueryTableAlias, nameIdentifier, null) : new 
ColumnProjection(subqueryTableAlias, aliasIdentifier, null);
+        ColumnProjection result = null == alias ? new 
ColumnProjection(subqueryTableAlias, name, null) : new 
ColumnProjection(subqueryTableAlias, alias, null);
         result.setOriginalOwner(originalOwner);
         result.setOriginalName(originalName);
         return result;
@@ -100,7 +100,7 @@ public final class ColumnProjection implements Projection {
      * @return original owner
      */
     public IdentifierValue getOriginalOwner() {
-        return null == originalOwner ? ownerIdentifier : originalOwner;
+        return null == originalOwner ? owner : originalOwner;
     }
     
     /**
@@ -109,6 +109,6 @@ public final class ColumnProjection implements Projection {
      * @return original name
      */
     public IdentifierValue getOriginalName() {
-        return null == originalName ? nameIdentifier : originalName;
+        return null == originalName ? name : originalName;
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
index 29b2d690fc5..c842bc1d1a3 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/DerivedProjection.java
@@ -38,23 +38,22 @@ public final class DerivedProjection implements Projection {
     
     private final String expression;
     
-    private final String alias;
+    private final IdentifierValue alias;
     
     private final SQLSegment derivedProjectionSegment;
     
     @Override
-    public Optional<String> getAlias() {
+    public Optional<IdentifierValue> getAlias() {
         return Optional.ofNullable(alias);
     }
     
     @Override
     public String getColumnLabel() {
-        return getAlias().orElse(expression);
+        return getAlias().map(IdentifierValue::getValue).orElse(expression);
     }
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        // TODO replace getAlias with aliasIdentifier
-        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, new IdentifierValue(getAlias().get()), 
null) : new DerivedProjection(expression, alias, derivedProjectionSegment);
+        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, getAlias().get(), null) : new 
DerivedProjection(expression, alias, derivedProjectionSegment);
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ExpressionProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ExpressionProjection.java
index aa28aaa2ab3..a6e93d18bb2 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ExpressionProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ExpressionProjection.java
@@ -37,21 +37,20 @@ public final class ExpressionProjection implements 
Projection {
     
     private final String expression;
     
-    private final String alias;
+    private final IdentifierValue alias;
     
     @Override
-    public Optional<String> getAlias() {
+    public Optional<IdentifierValue> getAlias() {
         return Optional.ofNullable(alias);
     }
     
     @Override
     public String getColumnLabel() {
-        return getAlias().orElse(expression);
+        return getAlias().map(IdentifierValue::getValue).orElse(expression);
     }
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        // TODO replace getAlias with aliasIdentifier
-        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, new IdentifierValue(getAlias().get()), 
null) : new ExpressionProjection(expression, alias);
+        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, getAlias().get(), null) : new 
ExpressionProjection(expression, alias);
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ParameterMarkerProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ParameterMarkerProjection.java
index 4f09d7e0c32..e484394b053 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ParameterMarkerProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ParameterMarkerProjection.java
@@ -40,7 +40,7 @@ public final class ParameterMarkerProjection implements 
Projection {
     
     private final ParameterMarkerType parameterMarkerType;
     
-    private final String alias;
+    private final IdentifierValue alias;
     
     @Override
     public String getExpression() {
@@ -49,18 +49,16 @@ public final class ParameterMarkerProjection implements 
Projection {
     
     @Override
     public String getColumnLabel() {
-        return getAlias().orElseGet(() -> 
String.valueOf(parameterMarkerIndex));
+        return getAlias().map(IdentifierValue::getValue).orElseGet(() -> 
String.valueOf(parameterMarkerIndex));
     }
     
     @Override
-    public Optional<String> getAlias() {
+    public Optional<IdentifierValue> getAlias() {
         return Optional.ofNullable(alias);
     }
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        // TODO replace getAlias with aliasIdentifier
-        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, new IdentifierValue(getAlias().get()), 
null)
-                : new ParameterMarkerProjection(parameterMarkerIndex, 
parameterMarkerType, alias);
+        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, getAlias().get(), null) : new 
ParameterMarkerProjection(parameterMarkerIndex, parameterMarkerType, alias);
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
index 248413bb463..fdd7f913655 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjection.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.infra.binder.segment.select.projection.impl;
 
-import com.google.common.base.Strings;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -38,17 +37,17 @@ import java.util.Optional;
 @ToString
 public final class ShorthandProjection implements Projection {
     
-    private final String owner;
+    private final IdentifierValue owner;
     
     private final Collection<Projection> actualColumns;
     
     @Override
     public String getExpression() {
-        return Strings.isNullOrEmpty(owner) ? "*" : owner + ".*";
+        return null == owner ? "*" : owner.getValue() + ".*";
     }
     
     @Override
-    public Optional<String> getAlias() {
+    public Optional<IdentifierValue> getAlias() {
         return Optional.empty();
     }
     
@@ -62,7 +61,7 @@ public final class ShorthandProjection implements Projection {
      * 
      * @return owner
      */
-    public Optional<String> getOwner() {
+    public Optional<IdentifierValue> getOwner() {
         return Optional.ofNullable(owner);
     }
     
@@ -83,6 +82,6 @@ public final class ShorthandProjection implements Projection {
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        return new ShorthandProjection(subqueryTableAlias.getValue(), 
actualColumns);
+        return new ShorthandProjection(subqueryTableAlias, actualColumns);
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/SubqueryProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/SubqueryProjection.java
index c21aac17c11..dec00e0b232 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/SubqueryProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/SubqueryProjection.java
@@ -17,14 +17,13 @@
 
 package org.apache.shardingsphere.infra.binder.segment.select.projection.impl;
 
-import com.google.common.base.Strings;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.ToString;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
-import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.infra.database.oracle.OracleDatabaseType;
+import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
@@ -42,30 +41,29 @@ public final class SubqueryProjection implements Projection 
{
     
     private final Projection projection;
     
-    private final String alias;
+    private final IdentifierValue alias;
     
     private final DatabaseType databaseType;
     
     @Override
-    public Optional<String> getAlias() {
-        return Strings.isNullOrEmpty(alias) ? buildDefaultAlias(databaseType) 
: Optional.of(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return null == alias ? buildDefaultAlias(databaseType) : 
Optional.of(alias);
     }
     
-    private Optional<String> buildDefaultAlias(final DatabaseType 
databaseType) {
+    private Optional<IdentifierValue> buildDefaultAlias(final DatabaseType 
databaseType) {
         if (databaseType instanceof OracleDatabaseType) {
-            return Optional.of(expression.replace(" ", "").toUpperCase());
+            return Optional.of(new IdentifierValue(expression.replace(" ", 
"").toUpperCase()));
         }
-        return Optional.of(expression);
+        return Optional.of(new IdentifierValue(expression));
     }
     
     @Override
     public String getColumnLabel() {
-        return getAlias().orElse(expression);
+        return getAlias().map(IdentifierValue::getValue).orElse(expression);
     }
     
     @Override
     public Projection transformSubqueryProjection(final IdentifierValue 
subqueryTableAlias, final IdentifierValue originalOwner, final IdentifierValue 
originalName) {
-        // TODO replace getAlias with aliasIdentifier
-        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, new IdentifierValue(getAlias().get()), 
null) : new SubqueryProjection(expression, projection, alias, databaseType);
+        return getAlias().isPresent() ? new 
ColumnProjection(subqueryTableAlias, getAlias().get(), null) : new 
SubqueryProjection(expression, projection, alias, databaseType);
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/subquery/engine/SubqueryTableContextEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/subquery/engine/SubqueryTableContextEngine.java
index 3899af3f9aa..8da23c0d04f 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/subquery/engine/SubqueryTableContextEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/select/subquery/engine/SubqueryTableContextEngine.java
@@ -49,13 +49,13 @@ public final class SubqueryTableContextEngine {
             if (!(each instanceof ColumnProjection)) {
                 continue;
             }
-            String columnName = ((ColumnProjection) each).getName();
+            String columnName = ((ColumnProjection) each).getName().getValue();
             if (tableSegment instanceof SimpleTableSegment) {
                 String tableName = ((SimpleTableSegment) 
tableSegment).getTableName().getIdentifier().getValue();
                 result.computeIfAbsent(tableName.toLowerCase(), unused -> new 
SubqueryTableContext(tableName, aliasName)).getColumnNames().add(columnName);
             }
-            if (tableSegment instanceof JoinTableSegment && null != 
((ColumnProjection) each).getOwner()) {
-                Optional<String> tableName = 
getTableNameByOwner(subqueryContext.getTablesContext().getSimpleTableSegments(),
 ((ColumnProjection) each).getOwner());
+            if (tableSegment instanceof JoinTableSegment && 
((ColumnProjection) each).getOwner().isPresent()) {
+                Optional<String> tableName = 
getTableNameByOwner(subqueryContext.getTablesContext().getSimpleTableSegments(),
 ((ColumnProjection) each).getOwner().get().getValue());
                 tableName.ifPresent(optional -> 
result.computeIfAbsent(optional.toLowerCase(), unused -> new 
SubqueryTableContext(optional, aliasName)).getColumnNames().add(columnName));
             }
         }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
index af367c72a58..781192dbae1 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
@@ -226,8 +226,8 @@ public final class TablesContext {
     private Map<String, Collection<String>> 
getOwnerColumnNamesByColumnProjection(final Collection<ColumnProjection> 
columns) {
         Map<String, Collection<String>> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
         for (ColumnProjection each : columns) {
-            if (null != each.getOwner()) {
-                result.computeIfAbsent(each.getOwner(), unused -> new 
LinkedList<>()).add(each.getExpression());
+            if (each.getOwner().isPresent()) {
+                result.computeIfAbsent(each.getOwner().get().getValue(), 
unused -> new LinkedList<>()).add(each.getExpression());
             }
         }
         return result;
@@ -280,8 +280,8 @@ public final class TablesContext {
     private Collection<String> getNoOwnerColumnNamesByColumnProjection(final 
Collection<ColumnProjection> columns) {
         Collection<String> result = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
         for (ColumnProjection each : columns) {
-            if (null == each.getOwner()) {
-                result.add(each.getName());
+            if (!each.getOwner().isPresent()) {
+                result.add(each.getName().getValue());
             }
         }
         return result;
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
index 4ba638f4699..46cb79eacfd 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
@@ -70,6 +70,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUti
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
 import 
org.apache.shardingsphere.sql.parser.sql.common.util.SubqueryExtractUtils;
 import org.apache.shardingsphere.sql.parser.sql.common.util.WhereExtractUtils;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -291,21 +292,22 @@ public final class SelectStatementContext extends 
CommonSQLStatementContext impl
         }
         String rawName = SQLUtils.getExactlyValue(((TextOrderByItemSegment) 
orderByItem).getText());
         for (Projection each : projectionsContext.getProjections()) {
+            Optional<String> result = 
each.getAlias().map(IdentifierValue::getValue);
             if 
(SQLUtils.getExactlyExpression(rawName).equalsIgnoreCase(SQLUtils.getExactlyExpression(SQLUtils.getExactlyValue(each.getExpression()))))
 {
-                return each.getAlias();
+                return result;
             }
-            if (rawName.equalsIgnoreCase(each.getAlias().orElse(null))) {
+            if (rawName.equalsIgnoreCase(result.orElse(null))) {
                 return Optional.of(rawName);
             }
             if (isSameColumnName(each, rawName)) {
-                return each.getAlias();
+                return result;
             }
         }
         return Optional.empty();
     }
     
     private boolean isSameColumnName(final Projection projection, final String 
name) {
-        return projection instanceof ColumnProjection && 
name.equalsIgnoreCase(((ColumnProjection) projection).getName());
+        return projection instanceof ColumnProjection && 
name.equalsIgnoreCase(((ColumnProjection) projection).getName().getValue());
     }
     
     private String getOrderItemText(final TextOrderByItemSegment 
orderByItemSegment) {
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContextTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContextTest.java
index d5a8e835987..2f45cc770f4 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContextTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/ProjectionsContextTest.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Exp
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ShorthandProjection;
 import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
@@ -113,7 +114,7 @@ class ProjectionsContextTest {
     }
     
     private ShorthandProjection getShorthandProjection() {
-        return new ShorthandProjection("table", Collections.emptyList());
+        return new ShorthandProjection(new IdentifierValue("table"), 
Collections.emptyList());
     }
     
     private ColumnProjection getColumnProjection() {
@@ -125,12 +126,12 @@ class ProjectionsContextTest {
     }
     
     private AggregationProjection getAggregationProjection() {
-        return new AggregationProjection(AggregationType.COUNT, "(column)", 
"c", mock(DatabaseType.class));
+        return new AggregationProjection(AggregationType.COUNT, "(column)", 
new IdentifierValue("c"), mock(DatabaseType.class));
     }
     
     private AggregationDistinctProjection getAggregationDistinctProjection() {
         return new AggregationDistinctProjection(
-                0, 0, AggregationType.COUNT, "(DISTINCT column)", "c", 
"column", mock(DatabaseType.class));
+                0, 0, AggregationType.COUNT, "(DISTINCT column)", new 
IdentifierValue("c"), "column", mock(DatabaseType.class));
     }
     
     @Test
@@ -138,7 +139,7 @@ class ProjectionsContextTest {
         ColumnProjection columnProjection1 = new ColumnProjection(null, 
"col1", null);
         ColumnProjection columnProjection2 = new ColumnProjection(null, 
"col2", null);
         ColumnProjection columnProjection3 = new ColumnProjection(null, 
"col3", null);
-        DerivedProjection derivedProjection = new DerivedProjection("col3", 
"a3", null);
+        DerivedProjection derivedProjection = new DerivedProjection("col3", 
new IdentifierValue("a3"), null);
         ShorthandProjection shorthandProjection = new 
ShorthandProjection(null, Arrays.asList(columnProjection2, columnProjection3));
         ProjectionsContext actual = new ProjectionsContext(0, 0, false, 
Arrays.asList(columnProjection1, shorthandProjection, derivedProjection));
         assertThat(actual.getExpandProjections().size(), is(3));
@@ -149,9 +150,9 @@ class ProjectionsContextTest {
     
     @Test
     void assertIsContainsLastInsertIdProjection() {
-        ProjectionsContext lastInsertIdProjection = new ProjectionsContext(0, 
0, false, Collections.singletonList(new 
ExpressionProjection("LAST_INSERT_ID()", "id")));
+        ProjectionsContext lastInsertIdProjection = new ProjectionsContext(0, 
0, false, Collections.singletonList(new 
ExpressionProjection("LAST_INSERT_ID()", new IdentifierValue("id"))));
         assertTrue(lastInsertIdProjection.isContainsLastInsertIdProjection());
-        ProjectionsContext maxProjection = new ProjectionsContext(0, 0, false, 
Collections.singletonList(new ExpressionProjection("MAX(id)", "max")));
+        ProjectionsContext maxProjection = new ProjectionsContext(0, 0, false, 
Collections.singletonList(new ExpressionProjection("MAX(id)", new 
IdentifierValue("max"))));
         assertFalse(maxProjection.isContainsLastInsertIdProjection());
     }
 }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
index 6429138b0a5..cfc5e9c92e4 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionEngineTest.java
@@ -178,7 +178,7 @@ class ProjectionEngineTest {
                 Collections.singletonMap(DefaultDatabase.LOGIC_NAME, schema), 
databaseType).createProjection(mock(TableSegment.class), 
parameterMarkerExpressionSegment);
         assertTrue(actual.isPresent());
         assertThat(actual.get(), instanceOf(ParameterMarkerProjection.class));
-        assertThat(actual.get().getAlias().orElse(null), is("alias"));
+        
assertThat(actual.get().getAlias().map(IdentifierValue::getValue).orElse(null), 
is("alias"));
     }
     
     @Test
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjectionTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjectionTest.java
index c25d8bbed6d..fe731e1edc2 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjectionTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationDistinctProjectionTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl;
 
 import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -28,7 +29,7 @@ import static org.mockito.Mockito.mock;
 class AggregationDistinctProjectionTest {
     
     private final AggregationDistinctProjection aggregationDistinctProjection 
= new AggregationDistinctProjection(
-            0, 0, AggregationType.COUNT, "(DISTINCT order_id)", "c", 
"order_id", mock(DatabaseType.class));
+            0, 0, AggregationType.COUNT, "(DISTINCT order_id)", new 
IdentifierValue("c"), "order_id", mock(DatabaseType.class));
     
     @Test
     void assertGetDistinctColumnLabel() {
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjectionTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjectionTest.java
index b2a98bb58d8..569f736ec72 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjectionTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/AggregationProjectionTest.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projecti
 import org.apache.shardingsphere.infra.database.spi.DatabaseType;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
 import java.util.Optional;
@@ -40,15 +41,15 @@ class AggregationProjectionTest {
     
     @Test
     void assertGetAlias() {
-        Projection projection = new 
AggregationProjection(AggregationType.COUNT, "( A.\"DIRECTION\" )", 
"AVG_DERIVED_COUNT_0", mock(DatabaseType.class));
-        Optional<String> actual = projection.getAlias();
+        Projection projection = new 
AggregationProjection(AggregationType.COUNT, "( A.\"DIRECTION\" )", new 
IdentifierValue("AVG_DERIVED_COUNT_0"), mock(DatabaseType.class));
+        Optional<IdentifierValue> actual = projection.getAlias();
         assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("AVG_DERIVED_COUNT_0"));
+        assertThat(actual.get().getValue(), is("AVG_DERIVED_COUNT_0"));
     }
     
     @Test
     void assertGetColumnLabelWithAlias() {
-        Projection projection = new 
AggregationProjection(AggregationType.COUNT, "( A.\"DIRECTION\" )", 
"AVG_DERIVED_COUNT_0", mock(DatabaseType.class));
+        Projection projection = new 
AggregationProjection(AggregationType.COUNT, "( A.\"DIRECTION\" )", new 
IdentifierValue("AVG_DERIVED_COUNT_0"), mock(DatabaseType.class));
         assertThat(projection.getColumnLabel(), is("AVG_DERIVED_COUNT_0"));
     }
     
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjectionTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjectionTest.java
index 6830512b167..7555bc427e8 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjectionTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/impl/ShorthandProjectionTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.binder.segment.select.projection.impl;
 
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
@@ -30,21 +31,21 @@ class ShorthandProjectionTest {
     
     @Test
     void assertGetExpression() {
-        assertThat(new ShorthandProjection("owner", 
Collections.emptyList()).getExpression(), is("owner.*"));
+        assertThat(new ShorthandProjection(new IdentifierValue("owner"), 
Collections.emptyList()).getExpression(), is("owner.*"));
     }
     
     @Test
     void assertGetAliasWhenAbsent() {
-        assertFalse(new ShorthandProjection("owner", 
Collections.emptyList()).getAlias().isPresent());
+        assertFalse(new ShorthandProjection(new IdentifierValue("owner"), 
Collections.emptyList()).getAlias().isPresent());
     }
     
     @Test
     void assertGetColumnLabel() {
-        assertTrue(new ShorthandProjection("owner", 
Collections.emptyList()).getColumnLabel().contains("*"));
+        assertTrue(new ShorthandProjection(new IdentifierValue("owner"), 
Collections.emptyList()).getColumnLabel().contains("*"));
     }
     
     @Test
     void assertContains() {
-        assertTrue(new ShorthandProjection("owner", 
Collections.emptyList()).getOwner().isPresent());
+        assertTrue(new ShorthandProjection(new IdentifierValue("owner"), 
Collections.emptyList()).getOwner().isPresent());
     }
 }
diff --git 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameToken.java
 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameToken.java
index 40c39db6783..69d0a601331 100644
--- 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameToken.java
+++ 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameToken.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic;
 
-import com.google.common.base.Strings;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
@@ -28,12 +27,14 @@ import 
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.Substitutable;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
 import org.apache.shardingsphere.sql.parser.sql.common.enums.QuoteCharacter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * Substitutable column name token.
@@ -118,13 +119,14 @@ public final class SubstitutableColumnNameToken extends 
SQLToken implements Subs
     }
     
     private static void appendColumnProjection(final ColumnProjection 
columnProjection, final Map<String, String> logicActualTableNames, final 
StringBuilder builder) {
-        if (!Strings.isNullOrEmpty(columnProjection.getOwner())) {
-            String lowerCaseOwner = columnProjection.getOwner().toLowerCase();
-            
builder.append(columnProjection.getOwnerIdentifier().getQuoteCharacter().wrap(logicActualTableNames.getOrDefault(lowerCaseOwner,
 columnProjection.getOwner()))).append('.');
+        if (columnProjection.getOwner().isPresent()) {
+            Optional<IdentifierValue> owner = columnProjection.getOwner();
+            String lowerCaseOwner = owner.get().getValue().toLowerCase();
+            
builder.append(owner.get().getQuoteCharacter().wrap(logicActualTableNames.getOrDefault(lowerCaseOwner,
 owner.get().getValue()))).append('.');
         }
-        
builder.append(columnProjection.getNameIdentifier().getQuoteCharacter().wrap(columnProjection.getName()));
+        
builder.append(columnProjection.getName().getValueWithQuoteCharacters());
         if (columnProjection.getAlias().isPresent()) {
-            builder.append(" AS 
").append(columnProjection.getAliasIdentifier().getQuoteCharacter().wrap(columnProjection.getAlias().get()));
+            builder.append(" AS 
").append(columnProjection.getAlias().get().getValueWithQuoteCharacters());
         }
     }
 }
diff --git 
a/infra/rewrite/src/test/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameTokenTest.java
 
b/infra/rewrite/src/test/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameTokenTest.java
index 549a84d6491..945af0324fc 100644
--- 
a/infra/rewrite/src/test/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameTokenTest.java
+++ 
b/infra/rewrite/src/test/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/SubstitutableColumnNameTokenTest.java
@@ -63,7 +63,7 @@ class SubstitutableColumnNameTokenTest {
     void assertToStringWithSubqueryProjection() {
         Collection<Projection> projections = Arrays.asList(new 
ColumnProjection(new IdentifierValue("temp", QuoteCharacter.BACK_QUOTE),
                 new IdentifierValue("id", QuoteCharacter.BACK_QUOTE), new 
IdentifierValue("id", QuoteCharacter.BACK_QUOTE)),
-                new SubqueryProjection("(SELECT name FROM t_order)", new 
ColumnProjection(null, "name", null), "name", new OracleDatabaseType()));
+                new SubqueryProjection("(SELECT name FROM t_order)", new 
ColumnProjection(null, "name", null), new IdentifierValue("name"), new 
OracleDatabaseType()));
         assertThat(new SubstitutableColumnNameToken(0, 1, projections, 
QuoteCharacter.BACK_QUOTE).toString(mock(RouteUnit.class)),
                 is("`temp`.`id` AS `id`, `name`"));
     }
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
index 33227925f79..c91ac1df616 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
@@ -114,7 +114,7 @@ public final class ShardingSphereResultSetMetaData extends 
WrapperAdapter implem
             checkColumnIndex(column);
             Projection projection = ((SelectStatementContext) 
sqlStatementContext).getProjectionsContext().getExpandProjections().get(column 
- 1);
             if (projection instanceof ColumnProjection) {
-                return ((ColumnProjection) projection).getName();
+                return ((ColumnProjection) projection).getName().getValue();
             }
             if (projection instanceof AggregationDistinctProjection) {
                 return 
DerivedColumn.isDerivedColumnName(projection.getColumnLabel()) ? 
projection.getExpression() : projection.getColumnLabel();
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
index 20c7e238f27..0472c59c3da 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
@@ -118,7 +118,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
         }
         Projection projection = expandProjections.get(column - 1);
         if (projection instanceof ColumnProjection) {
-            return ((ColumnProjection) projection).getName();
+            return ((ColumnProjection) projection).getName().getValue();
         }
         return getColumnLabel(column);
     }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
index 2f153926dbc..eb233923b72 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ParameterMarkerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -61,8 +62,8 @@ public class ParameterMarkerExpressionSegment implements 
SimpleExpressionSegment
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
     
     @Override
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/AggregationProjectionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/AggregationProjectionSegment.java
index 1d2ae417e0e..9ebff3908ee 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/AggregationProjectionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/AggregationProjectionSegment.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -60,8 +61,8 @@ public class AggregationProjectionSegment implements 
ProjectionSegment, AliasAva
     }
     
     @Override
-    public final Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public final Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
     
     @Override
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
index 214e9c66963..916b441bd3e 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
@@ -22,6 +22,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -46,8 +47,8 @@ public final class ColumnProjectionSegment implements 
ProjectionSegment, AliasAv
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
     
     @Override
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
index e7e3dcda0d1..148a3b53406 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -64,8 +65,8 @@ public final class ExpressionProjectionSegment implements 
ProjectionSegment, Com
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
     
     @Override
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ShorthandProjectionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ShorthandProjectionSegment.java
index a35b5a1628d..aa1096829bb 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ShorthandProjectionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ShorthandProjectionSegment.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvai
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -54,7 +55,7 @@ public final class ShorthandProjectionSegment implements 
ProjectionSegment, Owne
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
index 8ab137d655e..c9783a150bc 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/SubqueryProjectionSegment.java
@@ -23,6 +23,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -46,8 +47,8 @@ public final class SubqueryProjectionSegment implements 
ProjectionSegment, Alias
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
     
     @Override
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/AliasAvailable.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/AliasAvailable.java
index a7f729f91a6..6e7d820c2e7 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/AliasAvailable.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/AliasAvailable.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
 
 import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -34,11 +35,11 @@ public interface AliasAvailable extends SQLSegment {
     Optional<String> getAliasName();
     
     /**
-     * Get alias segment.
+     * Get alias.
      *
-     * @return alias segment
+     * @return alias
      */
-    Optional<AliasSegment> getAlias();
+    Optional<IdentifierValue> getAlias();
     
     /**
      * Set alias.
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/DeleteMultiTableSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/DeleteMultiTableSegment.java
index 500984b6258..b9b6632ce8f 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/DeleteMultiTableSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/DeleteMultiTableSegment.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table;
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -46,7 +47,7 @@ public final class DeleteMultiTableSegment implements 
TableSegment {
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
+    public Optional<IdentifierValue> getAlias() {
         return Optional.empty();
     }
     
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/JoinTableSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/JoinTableSegment.java
index 304a3131f2a..5956268f5a2 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/JoinTableSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/JoinTableSegment.java
@@ -22,6 +22,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Collections;
 import java.util.List;
@@ -55,7 +56,7 @@ public final class JoinTableSegment implements TableSegment {
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
index b0d387e8395..521ae04601b 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SimpleTableSegment.java
@@ -23,6 +23,7 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerAvailable;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -65,7 +66,7 @@ public final class SimpleTableSegment implements 
TableSegment, OwnerAvailable {
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
 }
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SubqueryTableSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SubqueryTableSegment.java
index a9c0f4d7fdf..5c80e0e8cac 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SubqueryTableSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/SubqueryTableSegment.java
@@ -22,6 +22,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -43,8 +44,8 @@ public final class SubqueryTableSegment implements 
TableSegment {
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
-        return Optional.ofNullable(alias);
+    public Optional<IdentifierValue> getAlias() {
+        return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
     }
     
     @Override
diff --git 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/XmlTableSegment.java
 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/XmlTableSegment.java
index 3d6663d2985..bc4551adbd1 100644
--- 
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/XmlTableSegment.java
+++ 
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/table/XmlTableSegment.java
@@ -22,6 +22,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.XmlTableFunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Optional;
 
@@ -51,7 +52,7 @@ public final class XmlTableSegment implements TableSegment {
     }
     
     @Override
-    public Optional<AliasSegment> getAlias() {
+    public Optional<IdentifierValue> getAlias() {
         return Optional.empty();
     }
     
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
index 0fcf28fdb2b..4b59e3f053a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngine.java
@@ -76,6 +76,6 @@ public final class QueryHeaderBuilderEngine {
     
     private String getColumnName(final ProjectionsContext projectionsContext, 
final QueryResultMetaData queryResultMetaData, final int columnIndex) throws 
SQLException {
         Projection projection = 
projectionsContext.getExpandProjections().get(columnIndex - 1);
-        return projection instanceof ColumnProjection ? ((ColumnProjection) 
projection).getName() : queryResultMetaData.getColumnName(columnIndex);
+        return projection instanceof ColumnProjection ? ((ColumnProjection) 
projection).getName().getValue() : 
queryResultMetaData.getColumnName(columnIndex);
     }
 }
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSystemVariableQueryExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSystemVariableQueryExecutor.java
index a61b5b2f81a..16cf5e1c92c 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSystemVariableQueryExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSystemVariableQueryExecutor.java
@@ -28,8 +28,8 @@ import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataMergedRe
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
-import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.MySQLSystemVariable;
+import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowConnectionIdExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowConnectionIdExecutor.java
index a18451ab5a7..1077d2a85f9 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowConnectionIdExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowConnectionIdExecutor.java
@@ -25,8 +25,8 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.ra
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataMergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
-import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;

Reply via email to