You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/08/10 12:25:14 UTC

[shardingsphere] branch master updated: fix select statement exception with calcite dialect function (#11745)

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 ba5fe48  fix select statement exception with calcite dialect function (#11745)
ba5fe48 is described below

commit ba5fe48a2f2c05adfa64768c4e98b7b53756bf03
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Tue Aug 10 20:24:48 2021 +0800

    fix select statement exception with calcite dialect function (#11745)
    
    * fix select statement exception with calcite dialect function
    
    * fix integration test
    
    * fix integration test
---
 .../sql/federate/execute/FederateJDBCExecutor.java |  1 +
 .../optimize/context/OptimizeContextFactory.java   | 11 +++++++++-
 .../tbl/select_dialect_function_with_federate.xml  | 25 ++++++++++++++++++++++
 .../cases/dql/dql-integration-test-cases.xml       |  4 ++++
 .../src/test/resources/env/tbl/dataset.xml         |  9 ++++++++
 .../test/resources/env/tbl/init-sql/h2/init.sql    |  4 ++++
 .../test/resources/env/tbl/init-sql/mysql/init.sql |  2 ++
 .../resources/env/tbl/init-sql/oracle/init.sql     |  2 ++
 .../resources/env/tbl/init-sql/postgresql/init.sql |  2 ++
 .../resources/env/tbl/init-sql/sqlserver/init.sql  |  2 ++
 .../src/test/resources/env/tbl/rules.yaml          | 10 +++++++++
 11 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java
index 9905ce3..9c38e5c 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederateJDBCExecutor.java
@@ -120,6 +120,7 @@ public final class FederateJDBCExecutor implements FederateExecutor {
         Properties result = new Properties();
         result.setProperty(CalciteConnectionProperty.LEX.camelName(), factory.getProperties().getProperty(CalciteConnectionProperty.LEX.camelName()));
         result.setProperty(CalciteConnectionProperty.CONFORMANCE.camelName(), factory.getProperties().getProperty(CalciteConnectionProperty.CONFORMANCE.camelName()));
+        result.setProperty(CalciteConnectionProperty.FUN.camelName(), factory.getProperties().getProperty(CalciteConnectionProperty.FUN.camelName()));
         return result;
     }
     
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
index 06bf005..82e3291 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
@@ -32,6 +32,7 @@ import org.apache.calcite.prepare.CalciteCatalogReader;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.schema.Schema;
+import org.apache.calcite.sql.fun.SqlLibrary;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParser;
 import org.apache.calcite.sql.parser.SqlParser.Config;
@@ -67,6 +68,8 @@ public final class OptimizeContextFactory {
     
     private static final String CONFORMANCE_CAMEL_NAME = CalciteConnectionProperty.CONFORMANCE.camelName();
     
+    private static final String FUN_CAMEL_NAME = CalciteConnectionProperty.FUN.camelName();
+    
     private final DatabaseType databaseType;
     
     @Getter
@@ -107,40 +110,46 @@ public final class OptimizeContextFactory {
         if (databaseType instanceof MySQLDatabaseType || databaseType == null) {
             properties.setProperty(LEX_CAMEL_NAME, Lex.MYSQL.name());
             properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.MYSQL_5.name());
+            properties.setProperty(FUN_CAMEL_NAME, SqlLibrary.MYSQL.fun);
             return;
         }
         if (databaseType instanceof H2DatabaseType) {
             // TODO No suitable type of Lex
             properties.setProperty(LEX_CAMEL_NAME, Lex.MYSQL.name());
             properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.LENIENT.name());
+            properties.setProperty(FUN_CAMEL_NAME, SqlLibrary.STANDARD.fun);
             return;
         }
         if (databaseType instanceof MariaDBDatabaseType) {
             properties.setProperty(LEX_CAMEL_NAME, Lex.MYSQL.name());
             properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.MYSQL_5.name());
+            properties.setProperty(FUN_CAMEL_NAME, SqlLibrary.MYSQL.fun);
             return;
         }
         if (databaseType instanceof OracleDatabaseType) {
             properties.setProperty(LEX_CAMEL_NAME, Lex.ORACLE.name());
             properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.ORACLE_12.name());
+            properties.setProperty(FUN_CAMEL_NAME, SqlLibrary.ORACLE.fun);
             return;
         }
         if (databaseType instanceof PostgreSQLDatabaseType) {
             // TODO No suitable type of Lex and conformance
             properties.setProperty(LEX_CAMEL_NAME, Lex.JAVA.name());
             properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.BABEL.name());
-//            properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.LENIENT.name());
+            properties.setProperty(FUN_CAMEL_NAME, SqlLibrary.POSTGRESQL.fun);
             return;
         }
         if (databaseType instanceof SQL92DatabaseType) {
             // TODO No suitable type of Lex
             properties.setProperty(LEX_CAMEL_NAME, Lex.MYSQL.name());
             properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.STRICT_92.name());
+            properties.setProperty(FUN_CAMEL_NAME, SqlLibrary.STANDARD.fun);
             return;
         }
         if (databaseType instanceof SQLServerDatabaseType) {
             properties.setProperty(LEX_CAMEL_NAME, Lex.SQL_SERVER.name());
             properties.setProperty(CONFORMANCE_CAMEL_NAME, SqlConformanceEnum.SQL_SERVER_2008.name());
+            properties.setProperty(FUN_CAMEL_NAME, SqlLibrary.STANDARD.fun);
             return;
         }
         throw new ShardingSphereException("No matching DatabaseType found");
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/tbl/select_dialect_function_with_federate.xml b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/tbl/select_dialect_function_with_federate.xml
new file mode 100644
index 0000000..4eedbdc
--- /dev/null
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/tbl/select_dialect_function_with_federate.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<dataset>
+    <metadata>
+        <column name="user_id" />
+        <column name="content" />
+    </metadata>
+    <row values="10, SUM:2110." />
+    <row values="11, SUM:2112." />
+</dataset>
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
index 2f3f898..518cd7a 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
@@ -535,4 +535,8 @@
     <test-case sql="SELECT o.*, i.* FROM t_order_federate o, t_order_item_federate i WHERE o.order_id = ? AND i.item_id = ?" scenario-types="db,dbtbl_with_readwrite_splitting,dbtbl_with_readwrite_splitting_and_encrypt">
         <assertion parameters="1000:int, 100000:int" expected-data-file="select_across_single_tables_with_federate.xml" />
     </test-case>
+
+    <test-case sql="SELECT user_id, CONCAT('SUM:', total, '.') content FROM (SELECT user_id, SUM(order_id_sharding) AS total FROM t_order_federate_sharding GROUP BY user_id HAVING SUM(order_id_sharding) > ?) AS temp" db-types="MySQL,PostgreSQL" scenario-types="tbl">
+        <assertion parameters="1000:int" expected-data-file="select_dialect_function_with_federate.xml" />
+    </test-case>
 </integration-test-cases>
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/dataset.xml b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/dataset.xml
index 9fc6673..7b1616c 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/dataset.xml
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/dataset.xml
@@ -37,6 +37,11 @@
         <column name="id" type="numeric" />
         <column name="status" type="varchar" />
     </metadata>
+    <metadata data-nodes="tbl.t_order_federate_sharding_${0..1}">
+        <column name="order_id_sharding" type="numeric" />
+        <column name="user_id" type="numeric" />
+        <column name="status" type="varchar" />
+    </metadata>
     <row data-node="tbl.t_single_table" values="1, 1000, init" />
     <row data-node="tbl.t_single_table" values="2, 1001, init" />
     <row data-node="tbl.t_single_table" values="3, 1002, init" />
@@ -102,4 +107,8 @@
     <row data-node="tbl.t_order_item_9" values="110900, 1109, 11, init, 2017-08-19" />
     <row data-node="tbl.t_order_item_9" values="110901, 1109, 11, init, 2017-08-19" />
     <row data-node="tbl.t_broadcast_table" values="1, init" />
+    <row data-node="tbl.t_order_federate_sharding_0" values="1010, 10, init" />
+    <row data-node="tbl.t_order_federate_sharding_0" values="1100, 10, init" />
+    <row data-node="tbl.t_order_federate_sharding_1" values="1011, 11, init" />
+    <row data-node="tbl.t_order_federate_sharding_1" values="1101, 11, init" />
 </dataset>
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/h2/init.sql b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/h2/init.sql
index 562b343..42772f1 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/h2/init.sql
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/h2/init.sql
@@ -17,8 +17,10 @@
 
 DROP TABLE IF EXISTS t_order_0;
 DROP TABLE IF EXISTS t_order_item_0;
+DROP TABLE IF EXISTS t_order_federate_sharding_0;
 DROP TABLE IF EXISTS t_order_1;
 DROP TABLE IF EXISTS t_order_item_1;
+DROP TABLE IF EXISTS t_order_federate_sharding_1;
 DROP TABLE IF EXISTS t_order_2;
 DROP TABLE IF EXISTS t_order_item_2;
 DROP TABLE IF EXISTS t_order_3;
@@ -40,10 +42,12 @@ DROP TABLE IF EXISTS t_single_table;
 
 CREATE TABLE t_order_0 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE t_order_item_0 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE t_order_federate_sharding_0 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_0 ON t_order_0 (order_id);
 
 CREATE TABLE t_order_1 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE t_order_item_1 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE t_order_federate_sharding_1 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_1 ON t_order_1 (order_id);
 
 CREATE TABLE t_order_2 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/mysql/init.sql b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/mysql/init.sql
index 6c76788..c154dbf 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/mysql/init.sql
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/mysql/init.sql
@@ -27,10 +27,12 @@ CREATE DATABASE tbl;
 
 CREATE TABLE tbl.t_order_0 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE tbl.t_order_item_0 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE tbl.t_order_federate_sharding_0 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_0 ON tbl.t_order_0 (order_id);
 
 CREATE TABLE tbl.t_order_1 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE tbl.t_order_item_1 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE tbl.t_order_federate_sharding_1 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_1 ON tbl.t_order_1 (order_id);
 
 CREATE TABLE tbl.t_order_2 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/oracle/init.sql b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/oracle/init.sql
index d8ce3a5..b40ecf0 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/oracle/init.sql
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/oracle/init.sql
@@ -24,10 +24,12 @@ CREATE SCHEMA tbl;
 
 CREATE TABLE tbl.t_order_0 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE tbl.t_order_item_0 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE tbl.t_order_federate_sharding_0 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_0 ON tbl.t_order_0 (order_id);
 
 CREATE TABLE tbl.t_order_1 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE tbl.t_order_item_1 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE tbl.t_order_federate_sharding_1 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_1 ON tbl.t_order_1 (order_id);
 
 CREATE TABLE tbl.t_order_2 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/postgresql/init.sql b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/postgresql/init.sql
index d41990a..77ab375 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/postgresql/init.sql
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/postgresql/init.sql
@@ -46,10 +46,12 @@ DROP TABLE IF EXISTS t_single_table;
 
 CREATE TABLE t_order_0 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE t_order_item_0 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE t_order_federate_sharding_0 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_0 ON t_order_0 (order_id);
 
 CREATE TABLE t_order_1 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE t_order_item_1 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE t_order_federate_sharding_1 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_1 ON t_order_1 (order_id);
 
 CREATE TABLE t_order_2 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/sqlserver/init.sql b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/sqlserver/init.sql
index e10e8a0..1d8bb92 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/sqlserver/init.sql
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/init-sql/sqlserver/init.sql
@@ -24,10 +24,12 @@ CREATE DATABASE tbl;
 
 CREATE TABLE tbl.t_order_0 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE tbl.t_order_item_0 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE tbl.t_order_federate_sharding_0 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_0 ON tbl.t_order_0 (order_id);
 
 CREATE TABLE tbl.t_order_1 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
 CREATE TABLE tbl.t_order_item_1 (item_id INT NOT NULL, order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, creation_date DATE, PRIMARY KEY (item_id));
+CREATE TABLE tbl.t_order_federate_sharding_1 (order_id_sharding INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id_sharding));
 CREATE INDEX order_index_t_order_1 ON tbl.t_order_1 (order_id);
 
 CREATE TABLE tbl.t_order_2 (order_id INT NOT NULL, user_id INT NOT NULL, status VARCHAR(45) NULL, PRIMARY KEY (order_id));
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/rules.yaml b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/rules.yaml
index 86336d2..a8b8ff8 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/rules.yaml
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/env/tbl/rules.yaml
@@ -39,6 +39,12 @@ rules:
         standard:
           shardingColumn: order_id
           shardingAlgorithmName: standard_test
+    t_order_federate_sharding:
+      actualDataNodes: tbl.t_order_federate_sharding_${0..1}
+      tableStrategy:
+        standard:
+          shardingColumn: order_id_sharding
+          shardingAlgorithmName: table_inline_order_id
   bindingTables:
     - t_order,t_order_item,t_order_details
   broadcastTables:
@@ -48,6 +54,10 @@ rules:
   shardingAlgorithms:
     standard_test:
       type: STANDARD_TEST
+    table_inline_order_id:
+      type: INLINE
+      props:
+        algorithm-expression: t_order_federate_sharding_${order_id_sharding % 2}
   
   keyGenerators:
     constant: