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 392dcf6a8fe Refactor sql federation planner builder and config builder
(#37185)
392dcf6a8fe is described below
commit 392dcf6a8fe6e1a7d8a910e8b2f77acb00c66b71
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Nov 27 08:49:08 2025 +0800
Refactor sql federation planner builder and config builder (#37185)
---
.../connection/config/impl/MySQLConnectionConfigBuilder.java | 2 ++
.../compiler/planner/builder/SQLFederationPlannerBuilder.java | 2 +-
.../src/test/resources/cases/federation-query-sql-cases.xml | 4 ++--
.../shardingsphere/test/e2e/sql/it/sql/dql/BaseDQLE2EIT.java | 10 +++++++---
4 files changed, 12 insertions(+), 6 deletions(-)
diff --git
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/connection/config/impl/MySQLConnectionConfigBuilder.java
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/connection/config/impl/MySQLConnectionConfigBuilder.java
index de8cd7552b4..202bc025aa3 100644
---
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/connection/config/impl/MySQLConnectionConfigBuilder.java
+++
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/connection/config/impl/MySQLConnectionConfigBuilder.java
@@ -21,6 +21,7 @@ import org.apache.calcite.config.CalciteConnectionConfig;
import org.apache.calcite.config.CalciteConnectionConfigImpl;
import org.apache.calcite.config.CalciteConnectionProperty;
import org.apache.calcite.config.Lex;
+import org.apache.calcite.config.NullCollation;
import org.apache.calcite.sql.fun.SqlLibrary;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
import
org.apache.shardingsphere.sqlfederation.compiler.context.connection.config.ConnectionConfigBuilder;
@@ -39,6 +40,7 @@ public final class MySQLConnectionConfigBuilder implements
ConnectionConfigBuild
result.setProperty(CalciteConnectionProperty.CONFORMANCE.camelName(),
SqlConformanceEnum.MYSQL_5.name());
result.setProperty(CalciteConnectionProperty.FUN.camelName(),
SqlLibrary.MYSQL.fun);
result.setProperty(CalciteConnectionProperty.CASE_SENSITIVE.camelName(),
String.valueOf(Lex.MYSQL.caseSensitive));
+
result.setProperty(CalciteConnectionProperty.DEFAULT_NULL_COLLATION.camelName(),
NullCollation.LOW.name());
return new CalciteConnectionConfigImpl(result);
}
diff --git
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/planner/builder/SQLFederationPlannerBuilder.java
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/planner/builder/SQLFederationPlannerBuilder.java
index 272bcecfe00..9c86cf39d85 100644
---
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/planner/builder/SQLFederationPlannerBuilder.java
+++
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/planner/builder/SQLFederationPlannerBuilder.java
@@ -156,7 +156,6 @@ public final class SQLFederationPlannerBuilder {
result.add(CoreRules.PROJECT_CORRELATE_TRANSPOSE);
result.add(CoreRules.PROJECT_SET_OP_TRANSPOSE);
result.add(CoreRules.PROJECT_REDUCE_EXPRESSIONS);
- result.add(CoreRules.FILTER_PROJECT_TRANSPOSE);
result.add(ProjectRemoveRule.Config.DEFAULT.toRule());
return result;
}
@@ -177,6 +176,7 @@ public final class SQLFederationPlannerBuilder {
result.add(CoreRules.FILTER_SET_OP_TRANSPOSE);
result.add(CoreRules.FILTER_REDUCE_EXPRESSIONS);
result.add(CoreRules.FILTER_MERGE);
+ result.add(CoreRules.FILTER_PROJECT_TRANSPOSE);
result.add(CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES);
return result;
}
diff --git
a/kernel/sql-federation/compiler/src/test/resources/cases/federation-query-sql-cases.xml
b/kernel/sql-federation/compiler/src/test/resources/cases/federation-query-sql-cases.xml
index 6021d16eed1..0b49e1e7073 100644
---
a/kernel/sql-federation/compiler/src/test/resources/cases/federation-query-sql-cases.xml
+++
b/kernel/sql-federation/compiler/src/test/resources/cases/federation-query-sql-cases.xml
@@ -18,7 +18,7 @@
<test-cases>
<test-case sql="SELECT t_order_federate.order_id,
t_order_federate.user_id, t_user_info.user_id FROM t_order_federate JOIN
t_user_info ON t_order_federate.user_id = t_user_info.user_id WHERE
t_user_info.user_id = 13">
- <assertion expected-result="EnumerableCalc(expr#0..6=[{inputs}],
expr#7=[13], expr#8=[=($t4, $t7)], proj#0..1=[{exprs}], user_id0=[$t4],
$condition=[$t8]) EnumerableHashJoin(condition=[=($3, $6)], joinType=[inner])
EnumerableCalc(expr#0..2=[{inputs}], expr#3=[CAST($t1):VARCHAR CHARACTER
SET "UTF-8"], proj#0..3=[{exprs}])
EnumerableScan(table=[[federate_jdbc, t_order_federate]], sql=[SELECT * FROM
`federate_jdbc`.`t_order_federate`], dynamicParameters=[null]) [...]
+ <assertion expected-result="EnumerableCalc(expr#0..6=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t4]) EnumerableHashJoin(condition=[=($3,
$6)], joinType=[inner]) EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR CHARACTER SET "UTF-8"],
proj#0..3=[{exprs}]) EnumerableScan(table=[[federate_jdbc,
t_order_federate]], sql=[SELECT * FROM `federate_jdbc`.`t_order_federate`],
dynamicParameters=[null]) EnumerableCalc(expr#0..1=[{inputs}], expr#2=[CAS
[...]
</test-case>
<test-case sql="SELECT user_id, information FROM t_user_info WHERE user_id
= 12">
@@ -382,7 +382,7 @@
</test-case>
<test-case sql="SELECT * FROM (SELECT o.* FROM t_order o WHERE o.user_id
IN (10, 11, 12)) AS t, t_order_item i WHERE t.order_id = i.order_id AND
t.order_id > 10 ORDER BY item_id">
- <assertion expected-result="EnumerableSort(sort0=[$6], dir0=[ASC])
EnumerableHashJoin(condition=[=($0, $7)], joinType=[inner])
EnumerableScan(table=[[federate_jdbc, t_order]], sql=[SELECT * FROM (SELECT *
FROM `federate_jdbc`.`t_order` WHERE CAST(`user_id` AS SIGNED) IN (10, 11, 12))
AS `t` WHERE `order_id` > 10], dynamicParameters=[null])
EnumerableScan(table=[[federate_jdbc, t_order_item]], sql=[SELECT * FROM
`federate_jdbc`.`t_order_item` WHERE `order_id` > 10], dyna [...]
+ <assertion expected-result="EnumerableSort(sort0=[$6], dir0=[ASC])
EnumerableHashJoin(condition=[=($0, $7)], joinType=[inner])
EnumerableScan(table=[[federate_jdbc, t_order]], sql=[SELECT * FROM
`federate_jdbc`.`t_order` WHERE CAST(`user_id` AS SIGNED) IN (10, 11, 12) AND
`order_id` > 10], dynamicParameters=[null])
EnumerableScan(table=[[federate_jdbc, t_order_item]], sql=[SELECT * FROM
`federate_jdbc`.`t_order_item` WHERE `order_id` > 10],
dynamicParameters=[null]) "/>
</test-case>
<test-case sql="SELECT * FROM t_order o WHERE o.order_id IN (SELECT
i.order_id FROM t_order_item i INNER JOIN t_product p ON i.product_id =
p.product_id WHERE p.product_id = 10) ORDER BY order_id">
diff --git
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/sql/it/sql/dql/BaseDQLE2EIT.java
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/sql/it/sql/dql/BaseDQLE2EIT.java
index cefa1b52520..fcc542b1ef7 100644
---
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/sql/it/sql/dql/BaseDQLE2EIT.java
+++
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/sql/it/sql/dql/BaseDQLE2EIT.java
@@ -188,11 +188,11 @@ public abstract class BaseDQLE2EIT implements SQLE2EIT {
assertThat(((Timestamp) actualValue).toLocalDateTime(),
is(expectedValue));
} else if (Types.TIMESTAMP == actualMetaData.getColumnType(i +
1) || Types.TIMESTAMP == expectedMetaData.getColumnType(i + 1)) {
Object convertedActualValue = Types.TIMESTAMP ==
actualMetaData.getColumnType(i + 1)
- ? actualResultSet.getTimestamp(i +
1).toLocalDateTime().format(DateTimeFormatterFactory.getDatetimeFormatter())
+ ? formatTimestamp(actualResultSet.getTimestamp(i +
1))
: actualValue;
Object convertedExpectedValue = Types.TIMESTAMP ==
expectedMetaData.getColumnType(i + 1)
- ? expectedResultSet.getTimestamp(i +
1).toLocalDateTime().format(DateTimeFormatterFactory.getDatetimeFormatter())
- : actualValue;
+ ? formatTimestamp(expectedResultSet.getTimestamp(i
+ 1))
+ : expectedValue;
assertThat(String.valueOf(convertedActualValue),
is(String.valueOf(convertedExpectedValue)));
} else if (expectedValue instanceof Clob) {
assertThat(String.valueOf(actualValue), is(((Clob)
expectedValue).getSubString(1, (int) ((Clob) expectedValue).length())));
@@ -216,6 +216,10 @@ public abstract class BaseDQLE2EIT implements SQLE2EIT {
}
}
+ private String formatTimestamp(final Timestamp timestamp) {
+ return null == timestamp ? null :
timestamp.toLocalDateTime().format(DateTimeFormatterFactory.getDatetimeFormatter());
+ }
+
private void assertObjectValue(final ResultSet actual, final int
columnIndex, final String columnLabel, final String expected) throws
SQLException {
assertThat(String.valueOf(actual.getObject(columnIndex)).trim(),
is(expected));
assertThat(String.valueOf(actual.getObject(columnLabel)).trim(),
is(expected));