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

chengzhang 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 22aa31116ba Enhance MySQLTextResultSetRowPacket and 
MySQLDateBinaryProtocolValue to support LocalDateTime and LocalTime when value 
contains scale (#37881)
22aa31116ba is described below

commit 22aa31116bae55af73eaeb9e20690bdb03096570
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Jan 29 11:44:01 2026 +0800

    Enhance MySQLTextResultSetRowPacket and MySQLDateBinaryProtocolValue to 
support LocalDateTime and LocalTime when value contains scale (#37881)
---
 RELEASE-NOTES.md                                   |  4 +
 .../protocol/MySQLDateBinaryProtocolValue.java     | 88 +++++++++++++++-------
 .../query/text/MySQLTextResultSetRowPacket.java    | 33 ++++++++
 .../protocol/MySQLDateBinaryProtocolValueTest.java | 47 +++++++++++-
 .../merge/dal/EncryptDALResultDecorator.java       |  2 +-
 .../decider/ShardingSQLFederationDecider.java      | 14 ++--
 .../jdbc/type/stream/JDBCStreamQueryResult.java    |  4 +
 .../SQLFederationUnsupportedSQLException.java      |  2 +-
 .../segment/expression/ExpressionConverter.java    |  2 +-
 .../impl/LiteralExpressionConverter.java           | 63 ++++++++++++----
 .../sql/dialect/impl/CustomMySQLSQLDialect.java    | 52 +++++++++++++
 .../expression/ExpressionConverterTest.java        |  2 +-
 .../impl/LiteralExpressionConverterTest.java       | 44 +++++------
 .../type/ViewInResultSetSQLStatementAttribute.java |  2 +-
 .../show/view/MySQLShowCreateViewStatement.java    |  2 +-
 15 files changed, 283 insertions(+), 78 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 2208f2f7499..b94bdfb60e6 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -1,5 +1,9 @@
 ## Release 5.5.4-SNAPSHOT
 
+### Enhancements
+
+1. Enhance MySQLTextResultSetRowPacket and MySQLDateBinaryProtocolValue to 
support LocalDateTime and LocalTime when value contains scale - 
[#37881](https://github.com/apache/shardingsphere/pull/37881)
+
 ### Bug Fixes
 
 ## Release 5.5.3
diff --git 
a/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
 
b/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
index b394db91695..8638cbdfd70 100644
--- 
a/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
+++ 
b/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.database.protocol.mysql.packet.command.query.binary.execute.protocol;
 
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.database.protocol.mysql.payload.MySQLPacketPayload;
 
 import java.sql.SQLException;
@@ -31,6 +32,8 @@ import java.util.Date;
  */
 public final class MySQLDateBinaryProtocolValue implements 
MySQLBinaryProtocolValue {
     
+    private static final long NANOS_PER_SECOND = 1_000_000_000L;
+    
     @Override
     public Object read(final MySQLPacketPayload payload, final boolean 
unsigned) throws SQLException {
         int length = payload.readInt1();
@@ -60,42 +63,30 @@ public final class MySQLDateBinaryProtocolValue implements 
MySQLBinaryProtocolVa
     
     @Override
     public void write(final MySQLPacketPayload payload, final Object value) {
-        LocalDateTime dateTime = getLocalDateTime(value);
-        int year = dateTime.getYear();
-        int month = dateTime.getMonthValue();
-        int dayOfMonth = dateTime.getDayOfMonth();
-        int hours = dateTime.getHour();
-        int minutes = dateTime.getMinute();
-        int seconds = dateTime.getSecond();
-        int nanos = dateTime.getNano();
-        boolean isTimeAbsent = 0 == hours && 0 == minutes && 0 == seconds;
-        boolean isNanosAbsent = 0 == nanos;
+        LocalDateTime dateTime;
+        if (value instanceof LocalDate) {
+            dateTime = ((LocalDate) value).atStartOfDay();
+        } else {
+            dateTime = value instanceof LocalDateTime ? (LocalDateTime) value 
: new Timestamp(((Date) value).getTime()).toLocalDateTime();
+        }
+        DateTimeValues values = buildDateTimeValues(dateTime);
+        boolean isTimeAbsent = 0 == values.hours && 0 == values.minutes && 0 
== values.seconds;
+        boolean isNanosAbsent = 0 == values.nanos;
         if (isTimeAbsent && isNanosAbsent) {
             payload.writeInt1(4);
-            writeDate(payload, year, month, dayOfMonth);
+            writeDate(payload, values.year, values.month, values.dayOfMonth);
             return;
         }
         if (isNanosAbsent) {
             payload.writeInt1(7);
-            writeDate(payload, year, month, dayOfMonth);
-            writeTime(payload, hours, minutes, seconds);
+            writeDate(payload, values.year, values.month, values.dayOfMonth);
+            writeTime(payload, values.hours, values.minutes, values.seconds);
             return;
         }
         payload.writeInt1(11);
-        writeDate(payload, year, month, dayOfMonth);
-        writeTime(payload, hours, minutes, seconds);
-        writeNanos(payload, nanos);
-    }
-    
-    @SuppressWarnings("UseOfObsoleteDateTimeApi")
-    private LocalDateTime getLocalDateTime(final Object value) {
-        if (value instanceof LocalDate) {
-            return ((LocalDate) value).atStartOfDay();
-        }
-        if (value instanceof LocalDateTime) {
-            return (LocalDateTime) value;
-        }
-        return new Timestamp(((Date) value).getTime()).toLocalDateTime();
+        writeDate(payload, values.year, values.month, values.dayOfMonth);
+        writeTime(payload, values.hours, values.minutes, values.seconds);
+        writeNanos(payload, values.nanos);
     }
     
     private void writeDate(final MySQLPacketPayload payload, final int year, 
final int month, final int dayOfMonth) {
@@ -113,4 +104,47 @@ public final class MySQLDateBinaryProtocolValue implements 
MySQLBinaryProtocolVa
     private void writeNanos(final MySQLPacketPayload payload, final int nanos) 
{
         payload.writeInt4(nanos / 1000);
     }
+    
+    private DateTimeValues buildDateTimeValues(final LocalDateTime dateTime) {
+        int year = dateTime.getYear();
+        int month = dateTime.getMonthValue();
+        int dayOfMonth = dateTime.getDayOfMonth();
+        int hours = dateTime.getHour();
+        int minutes = dateTime.getMinute();
+        int seconds = dateTime.getSecond();
+        int nanos = dateTime.getNano();
+        if (nanos >= NANOS_PER_SECOND) {
+            long overflowNanos = nanos;
+            seconds = (int) (seconds + overflowNanos / NANOS_PER_SECOND);
+            nanos = (int) (overflowNanos % NANOS_PER_SECOND);
+            if (seconds >= 60) {
+                LocalDateTime normalized = dateTime.plusSeconds(seconds - 
dateTime.getSecond());
+                year = normalized.getYear();
+                month = normalized.getMonthValue();
+                dayOfMonth = normalized.getDayOfMonth();
+                hours = normalized.getHour();
+                minutes = normalized.getMinute();
+                seconds = normalized.getSecond();
+            }
+        }
+        return new DateTimeValues(year, month, dayOfMonth, hours, minutes, 
seconds, nanos);
+    }
+    
+    @RequiredArgsConstructor
+    private static class DateTimeValues {
+        
+        private final int year;
+        
+        private final int month;
+        
+        private final int dayOfMonth;
+        
+        private final int hours;
+        
+        private final int minutes;
+        
+        private final int seconds;
+        
+        private final int nanos;
+    }
 }
diff --git 
a/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/text/MySQLTextResultSetRowPacket.java
 
b/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/text/MySQLTextResultSetRowPacket.java
index 2b73862d1ee..52e893a2f30 100644
--- 
a/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/text/MySQLTextResultSetRowPacket.java
+++ 
b/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/text/MySQLTextResultSetRowPacket.java
@@ -17,15 +17,21 @@
 
 package 
org.apache.shardingsphere.database.protocol.mysql.packet.command.query.text;
 
+import com.google.common.io.ByteStreams;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.database.protocol.mysql.packet.MySQLPacket;
 import 
org.apache.shardingsphere.database.protocol.mysql.payload.MySQLPacketPayload;
+import org.apache.shardingsphere.infra.exception.generic.UnknownSQLException;
 import org.apache.shardingsphere.infra.util.datetime.DateTimeFormatterFactory;
 
+import java.io.IOException;
 import java.math.BigDecimal;
+import java.sql.Clob;
+import java.sql.SQLException;
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.Collection;
 
@@ -71,6 +77,15 @@ public final class MySQLTextResultSetRowPacket extends 
MySQLPacket {
             payload.writeBytesLenenc((boolean) data ? new byte[]{1} : new 
byte[]{0});
         } else if (data instanceof LocalDateTime) {
             payload.writeStringLenenc(formatLocalDateTime((LocalDateTime) 
data));
+        } else if (data instanceof LocalTime) {
+            payload.writeStringLenenc(formatLocalTime((LocalTime) data));
+        } else if (data instanceof Clob) {
+            try {
+                // TODO Verify the correct approach for this in MySQL.
+                payload.writeBytesLenenc(ByteStreams.toByteArray(((Clob) 
data).getAsciiStream()));
+            } catch (final IOException | SQLException ex) {
+                throw new UnknownSQLException(ex);
+            }
         } else {
             payload.writeStringLenenc(data.toString());
         }
@@ -93,4 +108,22 @@ public final class MySQLTextResultSetRowPacket extends 
MySQLPacket {
         result.append(microsecondsText, 0, endIndex);
         return result.toString();
     }
+    
+    private String formatLocalTime(final LocalTime value) {
+        int nanos = value.getNano();
+        if (0 == nanos) {
+            return DateTimeFormatterFactory.getTimeFormatter().format(value);
+        }
+        StringBuilder result = new 
StringBuilder(DateTimeFormatterFactory.getTimeFormatter().format(value)).append('.');
+        String microsecondsText = String.format("%06d", nanos / 1000);
+        int endIndex = microsecondsText.length();
+        while (endIndex > 0 && '0' == microsecondsText.charAt(endIndex - 1)) {
+            endIndex--;
+        }
+        if (0 == endIndex) {
+            return result.substring(0, result.length() - 1);
+        }
+        result.append(microsecondsText, 0, endIndex);
+        return result.toString();
+    }
 }
diff --git 
a/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
 
b/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
index 32aa2a265c2..c87c956bd8e 100644
--- 
a/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
+++ 
b/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
@@ -140,7 +140,7 @@ class MySQLDateBinaryProtocolValueTest {
     @Test
     void assertWriteWithElevenBytes() {
         MySQLDateBinaryProtocolValue actual = new 
MySQLDateBinaryProtocolValue();
-        actual.write(payload, Timestamp.valueOf("1970-01-14 12:10:30.1"));
+        actual.write(payload, Timestamp.valueOf("1970-01-14 12:10:30.123"));
         verify(payload).writeInt1(11);
         verify(payload).writeInt2(1970);
         verify(payload).writeInt1(1);
@@ -148,6 +148,49 @@ class MySQLDateBinaryProtocolValueTest {
         verify(payload).writeInt1(12);
         verify(payload).writeInt1(10);
         verify(payload).writeInt1(30);
-        verify(payload).writeInt4(100000);
+        verify(payload).writeInt4(123000);
+    }
+    
+    @Test
+    void assertWriteLocalDateTimeWithMaxNanos() {
+        MySQLDateBinaryProtocolValue actual = new 
MySQLDateBinaryProtocolValue();
+        LocalDateTime dateTime = LocalDateTime.of(1970, 1, 14, 12, 10, 29, 
999_999_999);
+        actual.write(payload, dateTime);
+        verify(payload).writeInt1(11);
+        verify(payload).writeInt2(1970);
+        verify(payload).writeInt1(1);
+        verify(payload).writeInt1(14);
+        verify(payload).writeInt1(12);
+        verify(payload).writeInt1(10);
+        verify(payload).writeInt1(29);
+        verify(payload).writeInt4(999999);
+    }
+    
+    @Test
+    void assertWriteLocalDateTimeWithBoundaryNanos() {
+        MySQLDateBinaryProtocolValue actual = new 
MySQLDateBinaryProtocolValue();
+        actual.write(payload, LocalDateTime.of(1970, 1, 14, 12, 10, 29, 1000));
+        verify(payload).writeInt1(11);
+        verify(payload).writeInt2(1970);
+        verify(payload).writeInt1(1);
+        verify(payload).writeInt1(14);
+        verify(payload).writeInt1(12);
+        verify(payload).writeInt1(10);
+        verify(payload).writeInt1(29);
+        verify(payload).writeInt4(1);
+    }
+    
+    @Test
+    void assertWriteLocalDateTimeWithMicrosecondPrecision() {
+        MySQLDateBinaryProtocolValue actual = new 
MySQLDateBinaryProtocolValue();
+        actual.write(payload, LocalDateTime.of(1970, 1, 14, 12, 10, 29, 
123456789));
+        verify(payload).writeInt1(11);
+        verify(payload).writeInt2(1970);
+        verify(payload).writeInt1(1);
+        verify(payload).writeInt1(14);
+        verify(payload).writeInt1(12);
+        verify(payload).writeInt1(10);
+        verify(payload).writeInt1(29);
+        verify(payload).writeInt4(123456);
     }
 }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
index 632ea0f4441..5ee31d3cf27 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.encrypt.merge.dal;
 
-import 
com.sphereex.dbplusengine.sql.parser.statement.core.statement.attribute.type.ViewInResultSetSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.ViewInResultSetSQLStatementAttribute;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.encrypt.merge.dal.show.EncryptShowColumnsMergedResult;
 import 
org.apache.shardingsphere.encrypt.merge.dal.show.EncryptShowCreateTableMergedResult;
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
index 15bf243cb47..db10c6e216f 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
@@ -74,10 +74,11 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
             return false;
         }
         appendTableDataNodes(rule, database, tableNames, includedDataNodes);
-        if (isAllShardingTables(selectStatementContext, tableNames) && 
isSubqueryAllSameShardingConditions(selectStatementContext, parameters, 
globalRuleMetaData, database, rule)) {
+        boolean allShardingTables = 
isAllShardingTables(selectStatementContext, tableNames);
+        if (allShardingTables && 
isSubqueryAllSameShardingConditions(selectStatementContext, parameters, 
globalRuleMetaData, database, rule)) {
             return false;
         }
-        if (isAllShardingTables(selectStatementContext, tableNames) && 
isJoinWithSameEqualityShardingCondition(selectStatementContext, parameters, 
globalRuleMetaData, database, rule, tableNames)) {
+        if (allShardingTables && 
isSingleOrJoinWithSameEqualityShardingCondition(selectStatementContext, 
parameters, globalRuleMetaData, database, rule, tableNames)) {
             return false;
         }
         if (selectStatementContext.isContainsSubquery() || 
selectStatementContext.isContainsHaving()
@@ -93,9 +94,9 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         return tableNames.size() > 1 && 
!rule.isBindingTablesUseShardingColumnsJoin(selectStatementContext, tableNames);
     }
     
-    private boolean isJoinWithSameEqualityShardingCondition(final 
SelectStatementContext selectStatementContext, final List<Object> parameters, 
final RuleMetaData globalRuleMetaData,
-                                                            final 
ShardingSphereDatabase database, final ShardingRule rule, final 
Collection<String> tableNames) {
-        if (!selectStatementContext.isContainsJoinQuery()) {
+    private boolean isSingleOrJoinWithSameEqualityShardingCondition(final 
SelectStatementContext selectStatementContext, final List<Object> parameters, 
final RuleMetaData globalRuleMetaData,
+                                                                    final 
ShardingSphereDatabase database, final ShardingRule rule, final 
Collection<String> tableNames) {
+        if (selectStatementContext.isContainsSubquery() || 
selectStatementContext.isContainsCombine()) {
             return false;
         }
         // TODO consider supporting JOIN optimization when config database and 
table sharding strategy @duanzhengqiang
@@ -110,6 +111,9 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         if (!isAllEqualitySameShardingValues(shardingConditions, tableNames)) {
             return false;
         }
+        if (1 == tableNames.size() && 
!selectStatementContext.isContainsJoinQuery()) {
+            return true;
+        }
         Collection<ShardingTableReferenceRuleConfiguration> bindingTableGroups 
= Collections.singleton(new ShardingTableReferenceRuleConfiguration("", 
Joiner.on(",").join(tableNames)));
         BindingTableCheckedConfiguration configuration = new 
BindingTableCheckedConfiguration(rule.getDataSourceNames(), 
rule.getShardingAlgorithms(), rule.getConfiguration().getShardingAlgorithms(),
                 bindingTableGroups, 
rule.getDefaultDatabaseShardingStrategyConfig(), 
rule.getDefaultTableShardingStrategyConfig(), rule.getDefaultShardingColumn());
diff --git 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java
 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java
index 7b209851889..b4b4306849f 100644
--- 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java
+++ 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java
@@ -34,6 +34,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Time;
 import java.sql.Timestamp;
+import java.time.LocalTime;
 import java.time.ZonedDateTime;
 import java.util.Calendar;
 import java.util.Optional;
@@ -101,6 +102,9 @@ public final class JDBCStreamQueryResult extends 
AbstractStreamQueryResult {
         if (Time.class == type) {
             return resultSet.getTime(columnIndex);
         }
+        if (LocalTime.class == type) {
+            return resultSet.getObject(columnIndex, LocalTime.class);
+        }
         if (Timestamp.class == type) {
             return resultSet.getTimestamp(columnIndex);
         }
diff --git 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/exception/SQLFederationUnsupportedSQLException.java
 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/exception/SQLFederationUnsupportedSQLException.java
index d3736b5f363..3cbbe2b4df9 100644
--- 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/exception/SQLFederationUnsupportedSQLException.java
+++ 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/exception/SQLFederationUnsupportedSQLException.java
@@ -27,6 +27,6 @@ public final class SQLFederationUnsupportedSQLException 
extends SQLFederationSQL
     private static final long serialVersionUID = -8571244162760408846L;
     
     public SQLFederationUnsupportedSQLException(final String sql, final String 
reason) {
-        super(XOpenSQLState.SYNTAX_ERROR, 1, reason, "SQL federation does not 
support SQL '%s'.", sql);
+        super(XOpenSQLState.SYNTAX_ERROR, 1, reason.replace("%", "%%"), "SQL 
federation does not support SQL '" + sql + "'.");
     }
 }
diff --git 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java
 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java
index e37cd761d8c..4a0c8e78ba6 100644
--- 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java
+++ 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverter.java
@@ -92,7 +92,7 @@ public final class ExpressionConverter {
             return Optional.empty();
         }
         if (segment instanceof LiteralExpressionSegment) {
-            return 
LiteralExpressionConverter.convert((LiteralExpressionSegment) segment);
+            return 
LiteralExpressionConverter.convert((LiteralExpressionSegment) segment, null);
         }
         if (segment instanceof CommonExpressionSegment) {
             // TODO
diff --git 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java
 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java
index 4e8160365b8..c098b036014 100644
--- 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java
+++ 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverter.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sqlfederation.compiler.sql.ast.converter.segme
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.parser.SqlParserPos;
@@ -40,6 +41,7 @@ import java.time.ZonedDateTime;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Optional;
+import java.util.TimeZone;
 
 /**
  * Literal expression converter.
@@ -48,12 +50,13 @@ import java.util.Optional;
 public final class LiteralExpressionConverter {
     
     /**
-     * Convert literal expression segment to SQL node.
+     * Convert literal expression segment to sql node.
      *
      * @param segment literal expression segment
-     * @return SQL node
+     * @param dataType data type
+     * @return sql node
      */
-    public static Optional<SqlNode> convert(final LiteralExpressionSegment 
segment) {
+    public static Optional<SqlNode> convert(final LiteralExpressionSegment 
segment, final RelDataType dataType) {
         if (null == segment.getLiterals()) {
             return Optional.of(SqlLiteral.createNull(SqlParserPos.ZERO));
         }
@@ -71,27 +74,29 @@ public final class LiteralExpressionConverter {
             return 
Optional.of(SqlLiteral.createBoolean(Boolean.parseBoolean(literalValue), 
SqlParserPos.ZERO));
         }
         if (segment.getLiterals() instanceof Calendar) {
-            return Optional.of(convertCalendar(segment));
+            return Optional.of(convertCalendar(segment, literalValue, 
dataType));
         }
         if (segment.getLiterals() instanceof Date) {
-            return Optional.of(convertDate(segment, literalValue));
+            return Optional.of(convertDate(segment, literalValue, dataType));
         }
         if (segment.getLiterals() instanceof TimestampString) {
-            return 
Optional.of(SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, (TimestampString) 
segment.getLiterals(), 1, SqlParserPos.ZERO));
+            return 
Optional.of(SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, (TimestampString) 
segment.getLiterals(), getTimeScale(literalValue, dataType), 
SqlParserPos.ZERO));
         }
         if (segment.getLiterals() instanceof LocalDate) {
             return 
Optional.of(SqlLiteral.createDate(DateString.fromDaysSinceEpoch((int) 
((LocalDate) segment.getLiterals()).toEpochDay()), SqlParserPos.ZERO));
         }
         if (segment.getLiterals() instanceof LocalTime) {
-            String formatedValue = 
DateTimeFormatterFactory.getFullTimeFormatter().format((LocalTime) 
segment.getLiterals());
-            return Optional.of(SqlLiteral.createTime(new 
TimeString(formatedValue), 1, SqlParserPos.ZERO));
+            return Optional.of(convertLocalTime(segment, literalValue, 
dataType));
         }
         if (segment.getLiterals() instanceof LocalDateTime) {
-            String formatedValue = ((LocalDateTime) 
segment.getLiterals()).format(DateTimeFormatterFactory.getDatetimeFormatter());
-            return 
Optional.of(SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, new 
TimestampString(formatedValue), 1, SqlParserPos.ZERO));
+            LocalDateTime dateTime = (LocalDateTime) segment.getLiterals();
+            String fraction = literalValue.contains(".") ? 
literalValue.substring(literalValue.lastIndexOf('.') + 1) : "";
+            TimestampString timestampString = 
TimestampString.fromCalendarFields(toCalendar(dateTime.getYear(), 
dateTime.getMonthValue(),
+                    dateTime.getDayOfMonth(), dateTime.getHour(), 
dateTime.getMinute(), dateTime.getSecond())).withFraction(fraction);
+            return 
Optional.of(SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, timestampString, 
getTimeScale(literalValue, dataType), SqlParserPos.ZERO));
         }
         if (segment.getLiterals() instanceof ZonedDateTime) {
-            return Optional.of(SqlLiteral.createTimestamp(new 
TimestampWithTimeZoneString(literalValue), 1, SqlParserPos.ZERO));
+            return Optional.of(SqlLiteral.createTimestamp(new 
TimestampWithTimeZoneString(literalValue), getTimeScale(literalValue, 
dataType), SqlParserPos.ZERO));
         }
         if (segment.getLiterals() instanceof byte[]) {
             return Optional.of(SqlLiteral.createBinaryString((byte[]) 
segment.getLiterals(), SqlParserPos.ZERO));
@@ -109,10 +114,10 @@ public final class LiteralExpressionConverter {
         return SqlLiteral.createExactNumeric(literalValue, SqlParserPos.ZERO);
     }
     
-    private static SqlNode convertCalendar(final LiteralExpressionSegment 
segment) {
+    private static SqlNode convertCalendar(final LiteralExpressionSegment 
segment, final String literalValue, final RelDataType dataType) {
         Calendar calendar = (Calendar) segment.getLiterals();
         if (hasTimePart(calendar)) {
-            return SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, 
TimestampString.fromCalendarFields(calendar), 1, SqlParserPos.ZERO);
+            return SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, 
TimestampString.fromCalendarFields(calendar), getTimeScale(literalValue, 
dataType), SqlParserPos.ZERO);
         }
         return SqlLiteral.createDate(DateString.fromCalendarFields(calendar), 
SqlParserPos.ZERO);
     }
@@ -121,14 +126,40 @@ public final class LiteralExpressionConverter {
         return 0 != calendar.get(Calendar.HOUR_OF_DAY) || 0 != 
calendar.get(Calendar.MINUTE) || 0 != calendar.get(Calendar.SECOND) || 0 != 
calendar.get(Calendar.MILLISECOND);
     }
     
-    private static SqlNode convertDate(final LiteralExpressionSegment segment, 
final String literalValue) {
+    private static SqlNode convertDate(final LiteralExpressionSegment segment, 
final String literalValue, final RelDataType dataType) {
         if (segment.getLiterals() instanceof Timestamp) {
             Timestamp timestamp = (Timestamp) segment.getLiterals();
-            return SqlLiteral.createTimestamp(SqlTypeName.TIMESTAMP, 
TimestampString.fromMillisSinceEpoch(timestamp.getTime()), 1, 
SqlParserPos.ZERO);
+            LocalDateTime dateTime = timestamp.toLocalDateTime();
+            String fraction = literalValue.contains(".") ? 
literalValue.substring(literalValue.lastIndexOf('.') + 1) : "";
+            TimestampWithTimeZoneString timestampWithTimeZone = 
TimestampWithTimeZoneString.fromCalendarFields(toCalendar(dateTime.getYear(), 
dateTime.getMonthValue(),
+                    dateTime.getDayOfMonth(), dateTime.getHour(), 
dateTime.getMinute(), 
dateTime.getSecond())).withFraction(fraction).withTimeZone(TimeZone.getDefault());
+            return SqlLiteral.createTimestamp(timestampWithTimeZone, 
getTimeScale(literalValue, dataType), SqlParserPos.ZERO);
         }
         if (segment.getLiterals() instanceof Time) {
-            return SqlLiteral.createTime(new TimeString(literalValue), 1, 
SqlParserPos.ZERO);
+            return SqlLiteral.createTime(new TimeString(literalValue), 
getTimeScale(literalValue, dataType), SqlParserPos.ZERO);
         }
         return SqlLiteral.createDate(new DateString(literalValue), 
SqlParserPos.ZERO);
     }
+    
+    private static SqlNode convertLocalTime(final LiteralExpressionSegment 
segment, final String literalValue, final RelDataType dataType) {
+        LocalTime localTime = (LocalTime) segment.getLiterals();
+        int nanos = localTime.getNano();
+        String formattedValue = 0 == nanos ? 
DateTimeFormatterFactory.getTimeFormatter().format(localTime) : 
DateTimeFormatterFactory.getFullTimeFormatter().format(localTime);
+        return SqlLiteral.createTime(new TimeString(formattedValue), 
getTimeScale(literalValue, dataType), SqlParserPos.ZERO);
+    }
+    
+    private static int getTimeScale(final String literalValue, final 
RelDataType dataType) {
+        if (null != dataType && dataType.getScale() > 0) {
+            return dataType.getScale();
+        }
+        return literalValue.contains(".") ? 
literalValue.substring(literalValue.lastIndexOf(".")).length() : 0;
+    }
+    
+    @SuppressWarnings("MagicConstant")
+    private static Calendar toCalendar(final int year, final int month, final 
int day, final int hour, final int minute, final int second) {
+        Calendar result = Calendar.getInstance();
+        result.clear();
+        result.set(year, month - 1, day, hour, minute, second);
+        return result;
+    }
 }
diff --git 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/dialect/impl/CustomMySQLSQLDialect.java
 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/dialect/impl/CustomMySQLSQLDialect.java
index cf9f21bf35d..2eb67675274 100644
--- 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/dialect/impl/CustomMySQLSQLDialect.java
+++ 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/sql/dialect/impl/CustomMySQLSQLDialect.java
@@ -17,8 +17,19 @@
 
 package org.apache.shardingsphere.sqlfederation.compiler.sql.dialect.impl;
 
+import org.apache.calcite.sql.SqlAbstractDateTimeLiteral;
+import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlDataTypeSpec;
 import org.apache.calcite.sql.SqlDialect;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlWriter;
+import org.apache.calcite.sql.SqlWriter.FrameTypeEnum;
 import org.apache.calcite.sql.dialect.MysqlSqlDialect;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.util.TimestampWithTimeZoneString;
+import org.apache.calcite.util.Util;
+import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
 
 /**
  * Custom MySQL SQL dialect.
@@ -37,4 +48,45 @@ public final class CustomMySQLSQLDialect extends 
MysqlSqlDialect {
         builder.append(value.replace(literalEndQuoteString, 
literalEscapedQuote));
         builder.append(literalEndQuoteString);
     }
+    
+    @Override
+    public void unparseCall(final SqlWriter writer, final SqlCall call, final 
int leftPrec, final int rightPrec) {
+        if (SqlKind.CAST == call.getOperator().getKind()) {
+            SqlNode parameter1 = call.getOperandList().get(0);
+            SqlNode parameter2 = call.getOperandList().get(1);
+            String typeName = parameter2 instanceof SqlDataTypeSpec ? 
Util.last(((SqlDataTypeSpec) parameter2).getTypeName().names) : null;
+            if (SqlTypeName.DOUBLE.getName().equals(typeName)) {
+                unparseCastDouble(writer, parameter1, typeName);
+                return;
+            }
+        }
+        super.unparseCall(writer, call, leftPrec, rightPrec);
+    }
+    
+    private void unparseCastDouble(final SqlWriter writer, final SqlNode 
parameter1, final String typeName) {
+        writer.keyword("CAST");
+        parameter1.unparse(writer, 0, 0);
+        writer.sep("AS");
+        writer.keyword(typeName);
+        writer.endList(writer.startList(FrameTypeEnum.FUN_CALL, "(", ")"));
+    }
+    
+    @Override
+    public void unparseDateTimeLiteral(final SqlWriter writer, final 
SqlAbstractDateTimeLiteral literal, final int leftPrec, final int rightPrec) {
+        if (SqlTypeName.TIMESTAMP_TZ == literal.getTypeName()) {
+            writer.literal(SqlTypeName.TIMESTAMP.getName() + " '" + 
toFormattedString(literal) + "'");
+        } else {
+            super.unparseDateTimeLiteral(writer, literal, leftPrec, rightPrec);
+        }
+    }
+    
+    private String toFormattedString(final SqlAbstractDateTimeLiteral literal) 
{
+        TimestampWithTimeZoneString timestampWithTimeZone = 
(TimestampWithTimeZoneString) literal.getValue();
+        int precision = literal.getPrec();
+        if (precision > 0) {
+            timestampWithTimeZone = timestampWithTimeZone.round(precision);
+        }
+        ShardingSpherePreconditions.checkState(precision >= 0, () -> new 
IllegalArgumentException("The precision of timestamp with time zone must be 
non-negative."));
+        return 
timestampWithTimeZone.getLocalTimestampString().toString(precision);
+    }
 }
diff --git 
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java
 
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java
index 7fce651ac09..289461be087 100644
--- 
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java
+++ 
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/ExpressionConverterTest.java
@@ -114,7 +114,7 @@ class ExpressionConverterTest {
     void assertConvertDelegatesToAllSupportedConverters() {
         SqlNode expectedLiteralNode = mock(SqlNode.class);
         LiteralExpressionSegment literalSegment = new 
LiteralExpressionSegment(0, 0, "literal");
-        
when(LiteralExpressionConverter.convert(literalSegment)).thenReturn(Optional.of(expectedLiteralNode));
+        when(LiteralExpressionConverter.convert(literalSegment, 
null)).thenReturn(Optional.of(expectedLiteralNode));
         SqlNode expectedListNode = mock(SqlNode.class);
         ListExpression listSegment = new ListExpression(0, 0);
         
when(ListExpressionConverter.convert(listSegment)).thenReturn(Optional.of(expectedListNode));
diff --git 
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverterTest.java
 
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverterTest.java
index 83007cf6180..9786f429052 100644
--- 
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverterTest.java
+++ 
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/sql/ast/converter/segment/expression/impl/LiteralExpressionConverterTest.java
@@ -50,55 +50,55 @@ class LiteralExpressionConverterTest {
     
     @Test
     void assertConvertNullLiteral() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
null)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, null), 
null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.NULL));
     }
     
     @Test
     void assertConvertTrimFlags() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
"both")).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, "both"), 
null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getValueAs(String.class), is("both"));
-        SqlLiteral leading = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
"LEADING")).orElse(null);
+        SqlLiteral leading = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
"LEADING"), null).orElse(null);
         assertNotNull(leading);
         assertThat(leading.getValueAs(String.class), is("LEADING"));
-        SqlLiteral trailing = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
"trailing")).orElse(null);
+        SqlLiteral trailing = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
"trailing"), null).orElse(null);
         assertNotNull(trailing);
         assertThat(trailing.getValueAs(String.class), is("trailing"));
     }
     
     @Test
     void assertConvertTimeUnitName() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
"year")).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, "year"), 
null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getValueAs(String.class), is("year"));
     }
     
     @Test
     void assertConvertApproximateNumber() {
-        SqlNumericLiteral actual = (SqlNumericLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, new 
Float("1.5"))).orElse(null);
+        SqlNumericLiteral actual = (SqlNumericLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, new 
Float("1.5")), null).orElse(null);
         assertNotNull(actual);
         assertFalse(actual.isExact());
     }
     
     @Test
     void assertConvertExactNumber() {
-        SqlNumericLiteral actual = (SqlNumericLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
10)).orElse(null);
+        SqlNumericLiteral actual = (SqlNumericLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 10), 
null).orElse(null);
         assertNotNull(actual);
         assertTrue(actual.isExact());
     }
     
     @Test
     void assertConvertStringLiteral() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
"text")).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, "text"), 
null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getValueAs(String.class), is("text"));
     }
     
     @Test
     void assertConvertBooleanLiteral() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
true)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, true), 
null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getValueAs(Boolean.class), is(true));
     }
@@ -108,7 +108,7 @@ class LiteralExpressionConverterTest {
         Calendar calendar = Calendar.getInstance();
         calendar.set(2020, Calendar.JANUARY, 1, 0, 0, 0);
         calendar.set(Calendar.MILLISECOND, 0);
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
calendar)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
calendar), null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.DATE));
     }
@@ -118,7 +118,7 @@ class LiteralExpressionConverterTest {
         Calendar calendar = Calendar.getInstance();
         calendar.set(2020, Calendar.JANUARY, 1, 1, 1, 1);
         calendar.set(Calendar.MILLISECOND, 1);
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
calendar)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
calendar), null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.TIMESTAMP));
     }
@@ -126,15 +126,15 @@ class LiteralExpressionConverterTest {
     @Test
     void assertConvertTimestampDate() {
         Timestamp timestamp = Timestamp.valueOf("2023-01-02 03:04:05");
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
timestamp)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
timestamp), null).orElse(null);
         assertNotNull(actual);
-        assertThat(actual.getTypeName(), is(SqlTypeName.TIMESTAMP));
+        assertThat(actual.getTypeName(), is(SqlTypeName.TIMESTAMP_TZ));
     }
     
     @Test
     void assertConvertTimeDate() {
         Time time = new Time(new TimeString("01:02:03").getMillisOfDay());
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
time)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, time), 
null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.TIME));
     }
@@ -142,28 +142,28 @@ class LiteralExpressionConverterTest {
     @Test
     void assertConvertUtilDate() {
         java.sql.Date date = java.sql.Date.valueOf("2020-01-01");
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
date)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, date), 
null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.DATE));
     }
     
     @Test
     void assertConvertLocalDate() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
LocalDate.of(2020, 1, 1))).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
LocalDate.of(2020, 1, 1)), null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.DATE));
     }
     
     @Test
     void assertConvertLocalTime() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
LocalTime.of(1, 2, 3))).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
LocalTime.of(1, 2, 3)), null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.TIME));
     }
     
     @Test
     void assertConvertLocalDateTime() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
LocalDateTime.of(2020, 1, 1, 1, 1, 1))).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
LocalDateTime.of(2020, 1, 1, 1, 1, 1)), null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.TIMESTAMP));
     }
@@ -171,26 +171,26 @@ class LiteralExpressionConverterTest {
     @Test
     void assertConvertZonedDateTime() {
         ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.of(2020, 
1, 1, 1, 1, 1), ZoneId.of("UTC"));
-        assertThrows(CalciteException.class, () -> 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
zonedDateTime)));
+        assertThrows(CalciteException.class, () -> 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
zonedDateTime), null));
     }
     
     @Test
     void assertConvertBinary() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, new 
byte[]{1, 2})).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, new 
byte[]{1, 2}), null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getTypeName(), is(SqlTypeName.BINARY));
     }
     
     @Test
     void assertConvertEnumLiteral() {
-        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
SampleEnum.VALUE)).orElse(null);
+        SqlLiteral actual = (SqlLiteral) 
LiteralExpressionConverter.convert(new LiteralExpressionSegment(0, 0, 
SampleEnum.VALUE), null).orElse(null);
         assertNotNull(actual);
         assertThat(actual.getValueAs(String.class), is("VALUE"));
     }
     
     @Test
     void assertConvertReturnsEmptyForUnsupportedType() {
-        Optional<?> actual = LiteralExpressionConverter.convert(new 
LiteralExpressionSegment(0, 0, new Object()));
+        Optional<?> actual = LiteralExpressionConverter.convert(new 
LiteralExpressionSegment(0, 0, new Object()), null);
         assertFalse(actual.isPresent());
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/com/sphereex/dbplusengine/sql/parser/statement/core/statement/attribute/type/ViewInResultSetSQLStatementAttribute.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/ViewInResultSetSQLStatementAttribute.java
similarity index 95%
rename from 
parser/sql/statement/core/src/main/java/com/sphereex/dbplusengine/sql/parser/statement/core/statement/attribute/type/ViewInResultSetSQLStatementAttribute.java
rename to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/ViewInResultSetSQLStatementAttribute.java
index 3982bc53ea2..6eba3a56a2a 100644
--- 
a/parser/sql/statement/core/src/main/java/com/sphereex/dbplusengine/sql/parser/statement/core/statement/attribute/type/ViewInResultSetSQLStatementAttribute.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/attribute/type/ViewInResultSetSQLStatementAttribute.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
com.sphereex.dbplusengine.sql.parser.statement.core.statement.attribute.type;
+package 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
diff --git 
a/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
 
b/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
index 7a86db03a50..26ae7e58252 100644
--- 
a/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
+++ 
b/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.view;
 
-import 
com.sphereex.dbplusengine.sql.parser.statement.core.statement.attribute.type.ViewInResultSetSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.ViewInResultSetSQLStatementAttribute;
 import lombok.Getter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;

Reply via email to