You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2025/11/27 00:49:14 UTC
(shardingsphere) branch master updated: Refactor sql federation planner builder and config builder (#37185)
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 <du...@apache.org>
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));