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;