This is an automated email from the ASF dual-hosted git repository.
panjuan 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 d20393a9f45 Add ENUMERABLE_UNION_RULE for converting LogicUnion to
EnumerableUnion (#20022)
d20393a9f45 is described below
commit d20393a9f457ec5b0146827a7038d4b779f17243
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Aug 9 17:43:47 2022 +0800
Add ENUMERABLE_UNION_RULE for converting LogicUnion to EnumerableUnion
(#20022)
---
.../optimizer/planner/QueryOptimizePlannerFactory.java | 1 +
.../federation/optimizer/ShardingSphereOptimizerTest.java | 15 ++++++++++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
index ded150bf181..bb82923d4b4 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
@@ -78,6 +78,7 @@ public final class QueryOptimizePlannerFactory {
planner.addRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_FILTER_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_CORRELATE_RULE);
+ planner.addRule(EnumerableRules.ENUMERABLE_UNION_RULE);
}
private static Collection<RelOptRule> getSubQueryRules() {
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
index 11621c5981c..72ee9863a95 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
@@ -85,7 +85,7 @@ public final class ShardingSphereOptimizerTest {
+ "WHERE user_id BETWEEN (SELECT user_id FROM t_user_info WHERE
information = 'before') "
+ "AND (SELECT user_id FROM t_user_info WHERE information =
'after')";
- private static final String DATABASE_NAME = "sharding_db";
+ private static final String SELECT_UNION = "SELECT order_id, user_id FROM
t_order_federate UNION SELECT 1, user_id FROM t_user_info WHERE information =
'before'";
private static final String SCHEMA_NAME = "federate_jdbc";
@@ -259,4 +259,17 @@ public final class ShardingSphereOptimizerTest {
+ " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
+
+ @Test
+ public void assertSelectUnion() {
+ ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
+ SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_UNION, false);
+ String actual = optimizer.optimize(sqlStatement).explain();
+ String expected = "EnumerableUnion(all=[false])" + LINE_SEPARATOR + "
EnumerableCalc(expr#0..2=[{inputs}], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=['1':VARCHAR], expr#3=[CAST($t1):VARCHAR], "
+ + "expr#4=['before':VARCHAR], expr#5=[=($t3, $t4)],
EXPR$0=[$t2], user_id=[$t0], $condition=[$t5])" + LINE_SEPARATOR
+ + " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR;
+ assertThat(actual, is(expected));
+ }
}