This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 5274490187a refactor: optimize push-down for projections. (#20841)
5274490187a is described below

commit 5274490187a64c7acd705dea527254b1b48f71a3
Author: boyjoy1127 <[email protected]>
AuthorDate: Thu Sep 8 08:32:13 2022 +0800

    refactor: optimize push-down for projections. (#20841)
---
 .../advanced/AdvancedFederationExecutor.java       |  2 +-
 .../optimizer/ShardingSphereOptimizer.java         |  8 ++---
 .../translatable/TranslatableProjectRule.java      | 23 +++++++++----
 .../translatable/TranslatableTableScan.java        | 38 +++++++++++++++++++---
 .../planner/QueryOptimizePlannerFactory.java       | 29 +----------------
 .../optimizer/ShardingSphereOptimizerTest.java     | 38 +++++++++++-----------
 6 files changed, 74 insertions(+), 64 deletions(-)

diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
index bfe11fffb1f..fbe3bde0fcb 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-advanced-executor/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedFederationExecutor.java
@@ -134,7 +134,7 @@ public final class AdvancedFederationExecutor implements 
SQLFederationExecutor {
         SqlValidator validator = 
OptimizerPlannerContextFactory.createValidator(catalogReader, 
relDataTypeFactory, connectionConfig);
         SqlToRelConverter converter = 
OptimizerPlannerContextFactory.createConverter(catalogReader, validator, 
relDataTypeFactory);
         RelNode bestPlan =
-                new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(), 
QueryOptimizePlannerFactory.createHepPlannerWithCalc()).optimize(sqlStatement);
+                new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlanner()).optimize(sqlStatement);
         Bindable<Object[]> executablePlan = 
EnumerableInterpretable.toBindable(Collections.emptyMap(), null, 
(EnumerableRel) bestPlan, EnumerableRel.Prefer.ARRAY);
         return executablePlan.bind(new CommonExecuteDataContext(validator, 
converter, parameters));
     }
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
index cb65bcffe98..2cf78ec2ce8 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizer.java
@@ -34,9 +34,7 @@ public final class ShardingSphereOptimizer {
     
     private final SqlToRelConverter converter;
     
-    private final RelOptPlanner hepPlannerWithoutCalc;
-    
-    private final RelOptPlanner hepPlannerWithCalc;
+    private final RelOptPlanner hepPlanner;
     
     /**
      * Optimize query execution plan.
@@ -47,9 +45,9 @@ public final class ShardingSphereOptimizer {
     public RelNode optimize(final SQLStatement sqlStatement) {
         SqlNode sqlNode = SQLNodeConverterEngine.convert(sqlStatement);
         RelNode logicPlan = converter.convertQuery(sqlNode, true, true).rel;
-        RelNode ruleBasedPlan = optimizeWithRBO(logicPlan, 
hepPlannerWithoutCalc);
+        RelNode ruleBasedPlan = optimizeWithRBO(logicPlan, hepPlanner);
         RelNode costBasedPlan = optimizeWithCBO(ruleBasedPlan, converter);
-        return optimizeWithRBO(costBasedPlan, hepPlannerWithCalc);
+        return costBasedPlan;
     }
     
     private static RelNode optimizeWithRBO(final RelNode logicPlan, final 
RelOptPlanner hepPlanner) {
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
index 4d4fddbc0c2..56739774bf5 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableProjectRule.java
@@ -19,12 +19,14 @@ package 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.translatable;
 
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.tools.RelBuilderFactory;
 
+import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -43,22 +45,31 @@ public class TranslatableProjectRule extends RelOptRule {
         LogicalProject project = call.rel(0);
         TranslatableTableScan scan = call.rel(1);
         int[] fields = getProjectFields(project.getProjects());
-        if (fields == null) {
+        List expressions = project.getProjects();
+        int number = project.getProjects().size();
+        if (fields.length == 0) {
             return;
+        } else if (fields.length == number) {
+            call.transformTo(new TranslatableTableScan(scan.getCluster(), 
scan.getTable(), scan.getTranslatableTable(), scan.getFilters(), fields));
+        } else {
+            TranslatableTableScan tableScan = new 
TranslatableTableScan(scan.getCluster(), scan.getTable(), 
scan.getTranslatableTable(), scan.getFilters(), fields, number, expressions);
+            RelNode logicalProject = LogicalProject.create(tableScan, 
project.getHints(), project.getProjects(), project.getRowType());
+            call.transformTo(logicalProject);
         }
-        call.transformTo(new TranslatableTableScan(scan.getCluster(), 
scan.getTable(), scan.getTranslatableTable(), scan.getFilters(), fields));
     }
     
     private int[] getProjectFields(final List<RexNode> rexNodes) {
-        final int[] result = new int[rexNodes.size()];
+        List<Integer> rexInputRefs = new LinkedList<>();
         for (int index = 0; index < rexNodes.size(); index++) {
             RexNode exp = rexNodes.get(index);
             if (exp instanceof RexInputRef) {
-                result[index] = ((RexInputRef) exp).getIndex();
-            } else {
-                return null;
+                rexInputRefs.add(((RexInputRef) exp).getIndex());
             }
         }
+        int[] result = new int[rexInputRefs.size()];
+        for (int index = 0; index < rexInputRefs.size(); index++) {
+            result[index] = rexInputRefs.get(index);
+        }
         return result;
     }
 }
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
index 21a9068f1fd..5d6c4a4f4d5 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/translatable/TranslatableTableScan.java
@@ -46,6 +46,7 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlKind;
 import org.codehaus.groovy.runtime.InvokerHelper;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -61,11 +62,26 @@ public class TranslatableTableScan extends TableScan 
implements EnumerableRel {
     
     private final List<RexNode> filters;
     
+    private final int number;
+    
+    private final List<RexNode> expressions;
+    
     public TranslatableTableScan(final RelOptCluster cluster, final 
RelOptTable table, final FederationTranslatableTable translatableTable, final 
int[] fields) {
         super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), 
ImmutableList.of(), table);
         this.translatableTable = translatableTable;
         this.fields = fields;
+        this.number = fields.length;
+        this.filters = null;
+        this.expressions = new ArrayList<>();
+    }
+    
+    public TranslatableTableScan(final RelOptCluster cluster, final 
RelOptTable table, final FederationTranslatableTable translatableTable, final 
int[] fields, final int number) {
+        super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), 
ImmutableList.of(), table);
+        this.translatableTable = translatableTable;
+        this.fields = fields;
+        this.number = number;
         this.filters = null;
+        this.expressions = new ArrayList<>();
     }
     
     public TranslatableTableScan(final RelOptCluster cluster, final 
RelOptTable table, final FederationTranslatableTable translatableTable,
@@ -73,18 +89,30 @@ public class TranslatableTableScan extends TableScan 
implements EnumerableRel {
         super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), 
ImmutableList.of(), table);
         this.translatableTable = translatableTable;
         this.fields = fields;
+        this.number = fields.length;
+        this.filters = filters;
+        this.expressions = new ArrayList<>();
+    }
+    
+    public TranslatableTableScan(final RelOptCluster cluster, final 
RelOptTable table, final FederationTranslatableTable translatableTable,
+                                 final List<RexNode> filters, final int[] 
fields, final int number, final List<RexNode> expressions) {
+        super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), 
ImmutableList.of(), table);
+        this.translatableTable = translatableTable;
+        this.fields = fields;
+        this.number = number;
         this.filters = filters;
+        this.expressions = expressions;
     }
     
     @Override
     public RelNode copy(final RelTraitSet traitSet, final List<RelNode> 
inputs) {
-        return new TranslatableTableScan(getCluster(), table, 
translatableTable, fields);
+        return new TranslatableTableScan(getCluster(), table, 
translatableTable, fields, number);
     }
     
     @Override
     public String toString() {
         if (null != filters) {
-            String[] filterValues = new String[fields.length];
+            String[] filterValues = new String[number];
             addFilter(filters, filterValues);
             return "TranslatableTableScan{translatableTable=" + 
translatableTable + ", fields=" + Arrays.toString(fields) + ", filters=" + 
Arrays.toString(filterValues) + '}';
         }
@@ -94,7 +122,7 @@ public class TranslatableTableScan extends TableScan 
implements EnumerableRel {
     @Override
     public RelWriter explainTerms(final RelWriter relWriter) {
         if (null != filters) {
-            String[] filterValues = new String[fields.length];
+            String[] filterValues = new String[number];
             addFilter(filters, filterValues);
             return super.explainTerms(relWriter).item("fields", 
Primitive.asList(fields)).item("filters", Primitive.asList(filterValues));
         }
@@ -120,7 +148,7 @@ public class TranslatableTableScan extends TableScan 
implements EnumerableRel {
     
     @Override
     public RelOptCost computeSelfCost(final RelOptPlanner planner, final 
RelMetadataQuery mq) {
-        return super.computeSelfCost(planner, mq).multiplyBy(((double) 
fields.length + 2D) / ((double) table.getRowType().getFieldCount() + 2D));
+        return super.computeSelfCost(planner, mq).multiplyBy(((double) number 
+ 2D) / ((double) table.getRowType().getFieldCount() + 2D));
     }
     
     /**
@@ -133,7 +161,7 @@ public class TranslatableTableScan extends TableScan 
implements EnumerableRel {
     public Result implement(final EnumerableRelImplementor implementor, final 
Prefer pref) {
         PhysType physType = PhysTypeImpl.of(implementor.getTypeFactory(), 
getRowType(), pref.preferArray());
         if (null != filters) {
-            String[] filterValues = new String[fields.length];
+            String[] filterValues = new String[number];
             addFilter(filters, filterValues);
             return implementor.result(physType, 
Blocks.toBlock(Expressions.call(table.getExpression(FederationTranslatableTable.class),
                     "projectAndFilter", implementor.getRootExpression(), 
Expressions.constant(filterValues), Expressions.constant(fields))));
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
index 614aece877d..ff03cd52a00 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/planner/QueryOptimizePlannerFactory.java
@@ -57,32 +57,6 @@ public final class QueryOptimizePlannerFactory {
         return result;
     }
     
-    /**
-     * Create new instance of hep planner without calc rules.
-     *
-     * @return hep planner instance
-     */
-    public static RelOptPlanner createHepPlannerWithoutCalc() {
-        HepProgramBuilder builder = new HepProgramBuilder();
-        
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
-        
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
-        
builder.addGroupBegin().addRuleInstance(CoreRules.PROJECT_MERGE).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
-        builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
-        return new HepPlanner(builder.build());
-    }
-    
-    /**
-     * Create new instance of hep planner with calc rules.
-     *
-     * @return hep planner instance
-     */
-    public static RelOptPlanner createHepPlannerWithCalc() {
-        HepProgramBuilder builder = new HepProgramBuilder();
-        
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
-        builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
-        return new HepPlanner(builder.build());
-    }
-    
     /**
      * Create new instance of hep planner.
      *
@@ -90,9 +64,8 @@ public final class QueryOptimizePlannerFactory {
      */
     public static RelOptPlanner createHepPlanner() {
         HepProgramBuilder builder = new HepProgramBuilder();
-        
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
-        
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
         
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+        
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
         
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
         builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
         return new HepPlanner(builder.build());
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
index bbfdde7a33f..5774fa2b6b8 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/ShardingSphereOptimizerTest.java
@@ -100,7 +100,7 @@ public final class ShardingSphereOptimizerTest {
         tables.put("t_user_info", createUserInfoTableMetaData());
         ShardingSphereSchema schema = new ShardingSphereSchema(tables, 
Collections.emptyMap());
         SqlToRelConverter converter = createSqlToRelConverter(schema);
-        optimizer = new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(), 
QueryOptimizePlannerFactory.createHepPlannerWithCalc());
+        optimizer = new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlanner());
     }
     
     private ShardingSphereTable createOrderTableMetaData() {
@@ -132,10 +132,10 @@ public final class ShardingSphereOptimizerTest {
         String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..4=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($2, $4)], 
joinType=[inner])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" + 
LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0, 1]], filters=[[13, null]])" + LINE_SEPARATOR;
+                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0=[{inputs}], 
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0]], filters=[[13, null]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
     
@@ -164,10 +164,10 @@ public final class ShardingSphereOptimizerTest {
         String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..4=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($2, $4)], 
joinType=[inner])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" + 
LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0, 1]])" + LINE_SEPARATOR;
+                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0=[{inputs}], 
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
     
@@ -178,10 +178,10 @@ public final class ShardingSphereOptimizerTest {
         String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..4=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($2, $4)], 
joinType=[inner])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" + 
LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0, 1]])" + LINE_SEPARATOR;
+                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0=[{inputs}], 
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
     
@@ -192,10 +192,10 @@ public final class ShardingSphereOptimizerTest {
         String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..4=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($2, $4)], 
joinType=[inner])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" + 
LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
-                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0, 1]], filters=[[13, null]])" + LINE_SEPARATOR;
+                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t1):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0=[{inputs}], 
expr#1=[CAST($t0):VARCHAR], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "      TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0]], filters=[[13, null]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
     
@@ -259,8 +259,8 @@ public final class ShardingSphereOptimizerTest {
         String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableUnion(all=[false])" + LINE_SEPARATOR
                 + "  TranslatableTableScan(table=[[federate_jdbc, 
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
-                + "  EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=['1':VARCHAR], EXPR$0=[$t2], user_id=[$t0])" + LINE_SEPARATOR
-                + "    TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0, 1]], filters=[[null, before]])" + LINE_SEPARATOR;
+                + "  EnumerableCalc(expr#0=[{inputs}], expr#1=['1':VARCHAR], 
EXPR$0=[$t1], user_id=[$t0])" + LINE_SEPARATOR
+                + "    TranslatableTableScan(table=[[federate_jdbc, 
t_user_info]], fields=[[0]], filters=[[null, before]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
 }

Reply via email to