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 &quot;UTF-8&quot;], 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 &quot;UTF-8&quot;], 
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));

Reply via email to