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 44321bafc54 Add sql binder it and add select shorthand test case 
example (#34085)
44321bafc54 is described below

commit 44321bafc5451f34f70980c27f53235468058a83
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Tue Dec 17 14:50:31 2024 +0800

    Add sql binder it and add select shorthand test case example (#34085)
    
    * Add sql binder it and add select shorthand test case example
    
    * fix unit test
    
    * add new SQLBinderCasesRegistry and SQLBinderTestCasesRegistry
    
    * revise java doc
    
    * move test logic to test package
    
    * modify jar load case
---
 test/it/binder/pom.xml                             | 152 +++++++++++++++++
 .../test/it/sql/binder/SQLBinderIT.java            | 187 +++++++++++++++++++++
 .../test/it/sql/binder/SQLBinderITSettings.java}   |  35 ++--
 .../registry/SQLBinderTestCasesRegistry.java}      |  35 ++--
 .../sql/registry/SQLBinderCasesRegistry.java}      |  35 ++--
 .../sql/binder/dialect/mysql/MySQLBinderIT.java}   |  29 +---
 .../binder/src/test/resources/cases/dml/select.xml |  90 ++++++++++
 .../src/test/resources/sqls/dml/select.xml}        |  24 +--
 .../segment/projection/ProjectionAssert.java       |  36 +++-
 .../asserts/segment/table/TableAssert.java         |  20 ++-
 .../ExpectedColumnBoundInfo.java}                  |  32 ++--
 .../ExpectedTableBoundInfo.java}                   |  17 +-
 .../column/ExpectedOriginalColumn.java}            |  24 +--
 .../column/ExpectedOriginalTable.java}             |  24 +--
 .../table/ExpectedOriginalDatabase.java}           |  24 +--
 .../table/ExpectedOriginalSchema.java}             |  24 +--
 .../impl/column/ExpectedColumnProjection.java      |   4 +
 .../shorthand/ExpectedShorthandProjection.java     |   4 +
 .../segment/impl/table/ExpectedSimpleTable.java    |   4 +
 .../parser/internal/loader/CaseLoaderTemplate.java |  15 +-
 test/it/pom.xml                                    |   1 +
 21 files changed, 607 insertions(+), 209 deletions(-)

diff --git a/test/it/binder/pom.xml b/test/it/binder/pom.xml
new file mode 100644
index 00000000000..ad118b4367d
--- /dev/null
+++ b/test/it/binder/pom.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.shardingsphere</groupId>
+        <artifactId>shardingsphere-test-it</artifactId>
+        <version>5.5.2-SNAPSHOT</version>
+    </parent>
+    <artifactId>shardingsphere-test-it-binder</artifactId>
+    <name>${project.artifactId}</name>
+    
+    <properties>
+        <maven.deploy.skip>true</maven.deploy.skip>
+    </properties>
+    
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-test-it-parser</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-infra-binder</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-sql92</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-mysql</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-postgresql</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-oracle</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-sqlserver</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-opengauss</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-firebird</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-hive</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-presto</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-doris</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-sql-clickhouse</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-test-util</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-junit-jupiter</artifactId>
+            <version>${mockito.version}</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git 
a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java
 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java
new file mode 100644
index 00000000000..657bc809b53
--- /dev/null
+++ 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java
@@ -0,0 +1,187 @@
+/*
+ * 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.
+ */
+
+package org.apache.shardingsphere.test.it.sql.binder;
+
+import com.google.common.base.Preconditions;
+import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
+import org.apache.shardingsphere.infra.hint.SQLHintUtils;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
+import org.apache.shardingsphere.sql.parser.api.SQLParserEngine;
+import org.apache.shardingsphere.sql.parser.api.SQLStatementVisitorEngine;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
+import 
org.apache.shardingsphere.test.it.sql.binder.cases.binder.registry.SQLBinderTestCasesRegistry;
+import 
org.apache.shardingsphere.test.it.sql.binder.cases.sql.registry.SQLBinderCasesRegistry;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.InternalSQLParserTestParameter;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.SQLStatementAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.SQLParserTestCases;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.sql.SQLCases;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.sql.type.SQLCaseType;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.mockito.Mockito.mock;
+
+public abstract class SQLBinderIT {
+    
+    private static final SQLCases SQL_CASES = 
SQLBinderCasesRegistry.getInstance().getCases();
+    
+    private static final SQLParserTestCases SQL_BINDER_TEST_CASES = 
SQLBinderTestCasesRegistry.getInstance().getCases();
+    
+    @ParameterizedTest(name = "{0} ({1}) -> {2}")
+    @ArgumentsSource(TestCaseArgumentsProvider.class)
+    void assertBind(final String sqlCaseId, final SQLCaseType sqlCaseType, 
final String databaseType) {
+        String sql = SQL_CASES.getSQL(sqlCaseId, sqlCaseType, 
SQL_BINDER_TEST_CASES.get(sqlCaseId).getParameters());
+        SQLParserTestCase expected = SQL_BINDER_TEST_CASES.get(sqlCaseId);
+        SQLStatement actual = bindSQLStatement("H2".equals(databaseType) ? 
"MySQL" : databaseType, sql, new ArrayList<>(expected.getParameters()));
+        SQLStatementAssert.assertIs(new SQLCaseAssertContext(sqlCaseId, sql, 
expected.getParameters(), sqlCaseType), actual, expected);
+    }
+    
+    private SQLStatement bindSQLStatement(final String databaseType, final 
String sql, final List<Object> parameters) {
+        HintValueContext hintValueContext = SQLHintUtils.extractHint(sql);
+        SQLStatement sqlStatement = new 
SQLStatementVisitorEngine(databaseType).visit(new SQLParserEngine(databaseType, 
new CacheOption(128, 1024L)).parse(sql, false));
+        return new 
SQLBindEngine(mockMetaData(TypedSPILoader.getService(DatabaseType.class, 
databaseType)), "foo_db_1", hintValueContext).bind(sqlStatement, 
parameters).getSqlStatement();
+    }
+    
+    private ShardingSphereMetaData mockMetaData(final DatabaseType 
databaseType) {
+        Collection<ShardingSphereDatabase> databases = new LinkedList<>();
+        databases.add(new ShardingSphereDatabase("foo_db_1", databaseType, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), 
mockSchemas(databaseType, "foo_db_1")));
+        databases.add(new ShardingSphereDatabase("foo_db_2", databaseType, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), 
mockSchemas(databaseType, "foo_db_2")));
+        return new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), new 
ConfigurationProperties(new Properties()));
+    }
+    
+    private Collection<ShardingSphereSchema> mockSchemas(final DatabaseType 
databaseType, final String databaseName) {
+        Collection<ShardingSphereSchema> result = new LinkedList<>();
+        String defaultSchemaName = new 
DatabaseTypeRegistry(databaseType).getDefaultSchemaName(databaseName);
+        Collection<ShardingSphereTable> tables = 
"foo_db_1".equalsIgnoreCase(databaseName) ? mockFooDB1Tables() : 
mockFooDB2Tables();
+        result.add(new ShardingSphereSchema(defaultSchemaName, tables, 
Collections.emptyList()));
+        return result;
+    }
+    
+    private Collection<ShardingSphereTable> mockFooDB1Tables() {
+        Collection<ShardingSphereTable> result = new LinkedList<>();
+        result.add(new ShardingSphereTable("t_order", Arrays.asList(
+                new ShardingSphereColumn("order_id", Types.BIGINT, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("user_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("status", Types.VARCHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("merchant_id", Types.INTEGER, false, 
false, false, true, false, true),
+                new ShardingSphereColumn("remark", Types.VARCHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        result.add(new ShardingSphereTable("t_order_item", Arrays.asList(
+                new ShardingSphereColumn("item_id", Types.BIGINT, true, false, 
false, true, false, false),
+                new ShardingSphereColumn("order_id", Types.BIGINT, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("user_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("product_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("quantity", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        result.add(new ShardingSphereTable("t_user", Arrays.asList(
+                new ShardingSphereColumn("user_id", Types.INTEGER, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("user_name", Types.VARCHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("password", Types.VARCHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("email", Types.VARCHAR, false, false, 
false, true, false, false),
+                new ShardingSphereColumn("telephone", Types.CHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        result.add(new ShardingSphereTable("t_merchant", Arrays.asList(
+                new ShardingSphereColumn("merchant_id", Types.INTEGER, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("country_id", Types.SMALLINT, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("merchant_name", Types.VARCHAR, 
false, false, false, true, false, false),
+                new ShardingSphereColumn("business_code", Types.VARCHAR, 
false, false, false, true, false, false),
+                new ShardingSphereColumn("telephone", Types.CHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        return result;
+    }
+    
+    private Collection<ShardingSphereTable> mockFooDB2Tables() {
+        Collection<ShardingSphereTable> result = new LinkedList<>();
+        result.add(new ShardingSphereTable("t_product", Arrays.asList(
+                new ShardingSphereColumn("product_id", Types.INTEGER, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("product_name", Types.VARCHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("category_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("price", Types.DECIMAL, false, false, 
false, true, false, true),
+                new ShardingSphereColumn("status", Types.VARCHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        result.add(new ShardingSphereTable("t_product_detail", Arrays.asList(
+                new ShardingSphereColumn("detail_id", Types.INTEGER, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("product_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("description", Types.VARCHAR, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        result.add(new ShardingSphereTable("t_product_category", Arrays.asList(
+                new ShardingSphereColumn("category_id", Types.INTEGER, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("category_name", Types.VARCHAR, 
false, false, false, true, false, false),
+                new ShardingSphereColumn("parent_id", Types.INTEGER, false, 
false, false, true, false, false),
+                new ShardingSphereColumn("level", Types.TINYINT, false, false, 
false, true, false, false),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        result.add(new ShardingSphereTable("t_country", Arrays.asList(
+                new ShardingSphereColumn("country_id", Types.SMALLINT, true, 
false, false, true, false, false),
+                new ShardingSphereColumn("country_name", Types.VARCHAR, false, 
false, false, true, false, true),
+                new ShardingSphereColumn("continent_name", Types.VARCHAR, 
false, false, false, true, false, true),
+                new ShardingSphereColumn("creation_date", Types.DATE, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        return result;
+    }
+    
+    private static class TestCaseArgumentsProvider implements 
ArgumentsProvider {
+        
+        @Override
+        public Stream<? extends Arguments> provideArguments(final 
ExtensionContext extensionContext) {
+            SQLBinderITSettings settings = 
extensionContext.getRequiredTestClass().getAnnotation(SQLBinderITSettings.class);
+            Preconditions.checkNotNull(settings, "Annotation 
SQLBinderITSettings is required.");
+            return getTestParameters(settings.value()).stream();
+        }
+        
+        private Collection<Arguments> getTestParameters(final String... 
databaseTypes) {
+            Collection<Arguments> result = new LinkedList<>();
+            for (InternalSQLParserTestParameter each : 
SQL_CASES.generateTestParameters(Arrays.stream(databaseTypes).collect(Collectors.toSet())))
 {
+                if (!isPlaceholderWithoutParameter(each)) {
+                    result.add(Arguments.arguments(each.getSqlCaseId(), 
each.getSqlCaseType(), each.getDatabaseType()));
+                }
+            }
+            return result;
+        }
+        
+        private boolean isPlaceholderWithoutParameter(final 
InternalSQLParserTestParameter testParam) {
+            return SQLCaseType.PLACEHOLDER == testParam.getSqlCaseType() && 
SQL_BINDER_TEST_CASES.get(testParam.getSqlCaseId()).getParameters().isEmpty();
+        }
+    }
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderITSettings.java
similarity index 51%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderITSettings.java
index 7354ce47e0d..17fc2ee46b5 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderITSettings.java
@@ -15,30 +15,23 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
+package org.apache.shardingsphere.test.it.sql.binder;
 
-import lombok.Getter;
-import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import java.util.Collection;
-import java.util.LinkedList;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 
 /**
- * Expected simple table.
+ * SQL binder integrate test settings.
  */
-@Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
-    
-    @XmlAttribute
-    private String alias;
-    
-    @XmlElement
-    private ExpectedOwner owner;
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SQLBinderITSettings {
     
-    @XmlElement(name = "index-hint")
-    private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
+    /**
+     * Get to be tested database types.
+     *
+     * @return to be tested database types
+     */
+    String[] value();
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/cases/binder/registry/SQLBinderTestCasesRegistry.java
similarity index 50%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
copy to 
test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/cases/binder/registry/SQLBinderTestCasesRegistry.java
index 019d71b2a5b..792a14de095 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
+++ 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/cases/binder/registry/SQLBinderTestCasesRegistry.java
@@ -15,23 +15,36 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.impl.shorthand;
+package org.apache.shardingsphere.test.it.sql.binder.cases.binder.registry;
 
 import lombok.Getter;
-import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.SQLParserTestCases;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.loader.SQLParserTestCaseLoaderCallback;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.loader.CaseLoaderTemplate;
 
-import javax.xml.bind.annotation.XmlElement;
+import java.io.File;
 
 /**
- * Expected shorthand projection.
+ * SQL binder test cases registry.
  */
 @Getter
-@Setter
-public final class ExpectedShorthandProjection extends 
AbstractExpectedSQLSegment implements ExpectedProjection {
+public final class SQLBinderTestCasesRegistry {
     
-    @XmlElement
-    private ExpectedOwner owner;
+    private static final SQLBinderTestCasesRegistry INSTANCE = new 
SQLBinderTestCasesRegistry();
+    
+    private final SQLParserTestCases cases;
+    
+    private SQLBinderTestCasesRegistry() {
+        File file = new 
File(SQLBinderTestCasesRegistry.class.getProtectionDomain().getCodeSource().getLocation().getPath());
+        cases = new SQLParserTestCases(CaseLoaderTemplate.load(file, "cases/", 
new SQLParserTestCaseLoaderCallback()));
+    }
+    
+    /**
+     * Get instance.
+     *
+     * @return got instance
+     */
+    public static SQLBinderTestCasesRegistry getInstance() {
+        return INSTANCE;
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/cases/sql/registry/SQLBinderCasesRegistry.java
similarity index 52%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
copy to 
test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/cases/sql/registry/SQLBinderCasesRegistry.java
index 019d71b2a5b..6807d49ffaf 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
+++ 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/cases/sql/registry/SQLBinderCasesRegistry.java
@@ -15,23 +15,36 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.impl.shorthand;
+package org.apache.shardingsphere.test.it.sql.binder.cases.sql.registry;
 
 import lombok.Getter;
-import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.sql.SQLCases;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.sql.loader.SQLCaseLoaderCallback;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.loader.CaseLoaderTemplate;
 
-import javax.xml.bind.annotation.XmlElement;
+import java.io.File;
 
 /**
- * Expected shorthand projection.
+ * SQL binder cases registry.
  */
 @Getter
-@Setter
-public final class ExpectedShorthandProjection extends 
AbstractExpectedSQLSegment implements ExpectedProjection {
+public final class SQLBinderCasesRegistry {
     
-    @XmlElement
-    private ExpectedOwner owner;
+    private static final SQLBinderCasesRegistry INSTANCE = new 
SQLBinderCasesRegistry();
+    
+    private final SQLCases cases;
+    
+    private SQLBinderCasesRegistry() {
+        File file = new 
File(SQLBinderCasesRegistry.class.getProtectionDomain().getCodeSource().getLocation().getPath());
+        cases = new SQLCases(CaseLoaderTemplate.load(file, "sqls/", new 
SQLCaseLoaderCallback()));
+    }
+    
+    /**
+     * Get instance.
+     *
+     * @return got instance
+     */
+    public static SQLBinderCasesRegistry getInstance() {
+        return INSTANCE;
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/mysql/MySQLBinderIT.java
similarity index 50%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/mysql/MySQLBinderIT.java
index 7354ce47e0d..1b5cbdf70b0 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/mysql/MySQLBinderIT.java
@@ -15,30 +15,11 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
+package org.apache.shardingsphere.test.it.sql.binder.dialect.mysql;
 
-import lombok.Getter;
-import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
+import org.apache.shardingsphere.test.it.sql.binder.SQLBinderIT;
+import org.apache.shardingsphere.test.it.sql.binder.SQLBinderITSettings;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import java.util.Collection;
-import java.util.LinkedList;
-
-/**
- * Expected simple table.
- */
-@Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
-    
-    @XmlAttribute
-    private String alias;
-    
-    @XmlElement
-    private ExpectedOwner owner;
-    
-    @XmlElement(name = "index-hint")
-    private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
+@SQLBinderITSettings({"MySQL", "H2"})
+class MySQLBinderIT extends SQLBinderIT {
 }
diff --git a/test/it/binder/src/test/resources/cases/dml/select.xml 
b/test/it/binder/src/test/resources/cases/dml/select.xml
new file mode 100644
index 00000000000..7f03799f5f7
--- /dev/null
+++ b/test/it/binder/src/test/resources/cases/dml/select.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<sql-parser-test-cases>
+    <select sql-case-id="select_with_shorthand_projection">
+        <projections start-index="7" stop-index="7">
+            <shorthand-projection start-index="7" stop-index="7">
+                <actual-projections>
+                    <column-projection name="order_id" start-index="0" 
stop-index="0" start-delimiter="`" end-delimiter="`">
+                        <owner name="o" start-index="0" stop-index="0" />
+                        <column-bound>
+                            <original-database name="foo_db_1" />
+                            <original-schema name="foo_db_1" />
+                            <original-table name="t_order" />
+                            <original-column name="order_id" 
start-delimiter="`" end-delimiter="`" />
+                        </column-bound>
+                    </column-projection>
+                    <column-projection name="user_id" start-index="0" 
stop-index="0" start-delimiter="`" end-delimiter="`">
+                        <owner name="o" start-index="0" stop-index="0" />
+                        <column-bound>
+                            <original-database name="foo_db_1" />
+                            <original-schema name="foo_db_1" />
+                            <original-table name="t_order" />
+                            <original-column name="user_id" 
start-delimiter="`" end-delimiter="`" />
+                        </column-bound>
+                    </column-projection>
+                    <column-projection name="status" start-index="0" 
stop-index="0" start-delimiter="`" end-delimiter="`">
+                        <owner name="o" start-index="0" stop-index="0" />
+                        <column-bound>
+                            <original-database name="foo_db_1" />
+                            <original-schema name="foo_db_1" />
+                            <original-table name="t_order" />
+                            <original-column name="status" start-delimiter="`" 
end-delimiter="`" />
+                        </column-bound>
+                    </column-projection>
+                    <column-projection name="merchant_id" start-index="0" 
stop-index="0" start-delimiter="`" end-delimiter="`">
+                        <owner name="o" start-index="0" stop-index="0" />
+                        <column-bound>
+                            <original-database name="foo_db_1" />
+                            <original-schema name="foo_db_1" />
+                            <original-table name="t_order" />
+                            <original-column name="merchant_id" 
start-delimiter="`" end-delimiter="`" />
+                        </column-bound>
+                    </column-projection>
+                    <column-projection name="remark" start-index="0" 
stop-index="0" start-delimiter="`" end-delimiter="`">
+                        <owner name="o" start-index="0" stop-index="0" />
+                        <column-bound>
+                            <original-database name="foo_db_1" />
+                            <original-schema name="foo_db_1" />
+                            <original-table name="t_order" />
+                            <original-column name="remark" start-delimiter="`" 
end-delimiter="`" />
+                        </column-bound>
+                    </column-projection>
+                    <column-projection name="creation_date" start-index="0" 
stop-index="0" start-delimiter="`" end-delimiter="`">
+                        <owner name="o" start-index="0" stop-index="0" />
+                        <column-bound>
+                            <original-database name="foo_db_1" />
+                            <original-schema name="foo_db_1" />
+                            <original-table name="t_order" />
+                            <original-column name="creation_date" 
start-delimiter="`" end-delimiter="`" />
+                        </column-bound>
+                    </column-projection>
+                </actual-projections>
+            </shorthand-projection>
+        </projections>
+        <from start-index="14" stop-index="22">
+            <simple-table name="t_order" start-index="14" stop-index="22" 
alias="o">
+                <table-bound>
+                    <original-database name="foo_db_1" />
+                    <original-schema name="foo_db_1" />
+                </table-bound>
+            </simple-table>
+        </from>
+    </select>
+</sql-parser-test-cases>
diff --git a/test/it/pom.xml 
b/test/it/binder/src/test/resources/sqls/dml/select.xml
similarity index 51%
copy from test/it/pom.xml
copy to test/it/binder/src/test/resources/sqls/dml/select.xml
index 501cad80310..aa09790e7ad 100644
--- a/test/it/pom.xml
+++ b/test/it/binder/src/test/resources/sqls/dml/select.xml
@@ -16,24 +16,6 @@
   ~ limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.shardingsphere</groupId>
-        <artifactId>shardingsphere-test</artifactId>
-        <version>5.5.2-SNAPSHOT</version>
-    </parent>
-    <artifactId>shardingsphere-test-it</artifactId>
-    <packaging>pom</packaging>
-    <name>${project.artifactId}</name>
-    
-    <modules>
-        <module>spi</module>
-        <module>yaml</module>
-        <module>distsql</module>
-        <module>parser</module>
-        <module>optimizer</module>
-        <module>rewriter</module>
-        <module>pipeline</module>
-    </modules>
-</project>
+<sql-cases>
+    <sql-case id="select_with_shorthand_projection" value="SELECT * FROM 
t_order o" db-types="MySQL"/>
+</sql-cases>
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java
index ecaa805fd2c..1f091e7cec7 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java
@@ -48,6 +48,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.impl.top.ExpectedTopProjection;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.sql.type.SQLCaseType;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -128,15 +129,26 @@ public final class ProjectionAssert {
             assertTrue(actual.getOwner().isPresent(), 
assertContext.getText("Actual owner should exist."));
             OwnerAssert.assertIs(assertContext, actual.getOwner().get(), 
expected.getOwner());
         }
+        assertActualProjections(assertContext, actual, expected);
     }
     
-    private static void assertColumnProjection(final SQLCaseAssertContext 
assertContext, final ColumnProjectionSegment actual, final 
ExpectedColumnProjection expected) {
-        assertThat(assertContext.getText("Column projection alias assertion 
error: "), actual.getAliasName().orElse(null), is(expected.getAlias()));
-        if (null != actual.getColumn().getNestedObjectAttributes()) {
-            assertThat(assertContext.getText("Nested Object attributes 
assertion error: "), actual.getColumn().getExpression(), 
is(expected.getName()));
+    private static void assertActualProjections(final SQLCaseAssertContext 
assertContext, final ShorthandProjectionSegment actual, final 
ExpectedShorthandProjection expected) {
+        if (0 == expected.getActualProjections().getSize()) {
+            assertTrue(actual.getActualProjectionSegments().isEmpty(), 
assertContext.getText("Actual projections should not exist."));
         } else {
-            IdentifierValueAssert.assertIs(assertContext, 
actual.getColumn().getIdentifier(), expected, "Column projection");
+            assertFalse(actual.getActualProjectionSegments().isEmpty(), 
assertContext.getText("Actual projections should exist."));
+            assertThat(assertContext.getText("Actual projections size 
assertion error:"), actual.getActualProjectionSegments().size(), 
is(expected.getActualProjections().getSize()));
+            List<ProjectionSegment> actualProjectionSegments = new 
ArrayList<>(actual.getActualProjectionSegments());
+            int index = 0;
+            for (ExpectedProjection each : 
expected.getActualProjections().getExpectedProjections()) {
+                assertProjection(assertContext, 
actualProjectionSegments.get(index++), each);
+            }
         }
+    }
+    
+    private static void assertColumnProjection(final SQLCaseAssertContext 
assertContext, final ColumnProjectionSegment actual, final 
ExpectedColumnProjection expected) {
+        assertThat(assertContext.getText("Column projection alias assertion 
error: "), actual.getAliasName().orElse(null), is(expected.getAlias()));
+        assertColumnSegment(assertContext, actual, expected);
         assertLeftParentheses(assertContext, actual, expected);
         assertRightParentheses(assertContext, actual, expected);
         if (null == expected.getOwner()) {
@@ -147,6 +159,20 @@ public final class ProjectionAssert {
         }
     }
     
+    private static void assertColumnSegment(final SQLCaseAssertContext 
assertContext, final ColumnProjectionSegment actual, final 
ExpectedColumnProjection expected) {
+        if (null != actual.getColumn().getNestedObjectAttributes()) {
+            assertThat(assertContext.getText("Nested Object attributes 
assertion error: "), actual.getColumn().getExpression(), 
is(expected.getName()));
+        } else {
+            IdentifierValueAssert.assertIs(assertContext, 
actual.getColumn().getIdentifier(), expected, "Column projection");
+            if (null != expected.getColumnBound()) {
+                IdentifierValueAssert.assertIs(assertContext, 
actual.getColumn().getColumnBoundInfo().getOriginalDatabase(), 
expected.getColumnBound().getOriginalDatabase(), "Bound Database");
+                IdentifierValueAssert.assertIs(assertContext, 
actual.getColumn().getColumnBoundInfo().getOriginalSchema(), 
expected.getColumnBound().getOriginalSchema(), "Bound Schema");
+                IdentifierValueAssert.assertIs(assertContext, 
actual.getColumn().getColumnBoundInfo().getOriginalTable(), 
expected.getColumnBound().getOriginalTable(), "Bound Table");
+                IdentifierValueAssert.assertIs(assertContext, 
actual.getColumn().getColumnBoundInfo().getOriginalColumn(), 
expected.getColumnBound().getOriginalColumn(), "Bound Column");
+            }
+        }
+    }
+    
     private static void assertLeftParentheses(final SQLCaseAssertContext 
assertContext, final ColumnProjectionSegment actual, final 
ExpectedColumnProjection expected) {
         if (null == expected.getLeftParentheses()) {
             assertFalse(actual.getColumn().getLeftParentheses().isPresent(), 
assertContext.getText("Actual left parentheses should not exist."));
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
index 6285f307889..a13e50f21a0 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java
@@ -121,7 +121,7 @@ public final class TableAssert {
      * @param expected expected table
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final SimpleTableSegment actual, final ExpectedSimpleTable expected) {
-        IdentifierValueAssert.assertIs(assertContext, 
actual.getTableName().getIdentifier(), expected, "Table");
+        assertTableNameSegment(assertContext, actual, expected);
         assertThat(assertContext.getText("Table alias assertion error: "), 
actual.getAliasName().orElse(null), is(expected.getAlias()));
         if (null == expected.getOwner()) {
             assertFalse(actual.getOwner().isPresent(), 
assertContext.getText("Actual owner should not exist."));
@@ -237,13 +237,6 @@ public final class TableAssert {
         }
     }
     
-    /**
-     * Assert actual table function segment is correct with expected table 
function.
-     *
-     * @param assertContext assert context
-     * @param actual actual table function
-     * @param expected expected table function
-     */
     private static void assertTableFunction(final SQLCaseAssertContext 
assertContext, final ExpressionSegment actual, final ExpectedTableFunction 
expected) {
         if (actual instanceof XmlTableFunctionSegment) {
             XmlTableFunctionSegment actualXmlTableFunction = 
(XmlTableFunctionSegment) actual;
@@ -255,4 +248,15 @@ public final class TableAssert {
             assertThat(assertContext.getText("Function text assert error"), 
actual.getText(), is(expected.getText()));
         }
     }
+    
+    private static void assertTableNameSegment(final SQLCaseAssertContext 
assertContext, final SimpleTableSegment actual, final ExpectedSimpleTable 
expected) {
+        IdentifierValueAssert.assertIs(assertContext, 
actual.getTableName().getIdentifier(), expected, "Table");
+        if (null == expected.getTableBound()) {
+            assertFalse(actual.getTableName().getTableBoundInfo().isPresent(), 
assertContext.getText("Actual table bound should not exist."));
+        } else {
+            assertTrue(actual.getTableName().getTableBoundInfo().isPresent(), 
assertContext.getText("Actual table bound should exist."));
+            IdentifierValueAssert.assertIs(assertContext, 
actual.getTableName().getTableBoundInfo().get().getOriginalDatabase(), 
expected.getTableBound().getOriginalDatabase(), "Bound Database");
+            IdentifierValueAssert.assertIs(assertContext, 
actual.getTableName().getTableBoundInfo().get().getOriginalSchema(), 
expected.getTableBound().getOriginalSchema(), "Bound Schema");
+        }
+    }
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedColumnBoundInfo.java
similarity index 58%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedColumnBoundInfo.java
index 565e140fd47..bbbcb1cafde 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedColumnBoundInfo.java
@@ -15,34 +15,34 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.impl.column;
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound;
 
 import lombok.Getter;
 import lombok.Setter;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.generic.ExpectedParentheses;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column.ExpectedOriginalColumn;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column.ExpectedOriginalTable;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalDatabase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalSchema;
 
-import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 
 /**
- * Expected column projection.
+ * Expected column bound info.
  */
 @Getter
 @Setter
-public final class ExpectedColumnProjection extends 
AbstractExpectedIdentifierSQLSegment implements ExpectedProjection {
+public final class ExpectedColumnBoundInfo extends AbstractExpectedSQLSegment {
     
-    @XmlAttribute
-    private String alias;
+    @XmlElement(name = "original-database")
+    private ExpectedOriginalDatabase originalDatabase;
     
-    @XmlElement
-    private ExpectedOwner owner;
+    @XmlElement(name = "original-schema")
+    private ExpectedOriginalSchema originalSchema;
     
-    @XmlElement(name = "left-parentheses")
-    private ExpectedParentheses leftParentheses;
+    @XmlElement(name = "original-table")
+    private ExpectedOriginalTable originalTable;
     
-    @XmlElement(name = "right-parentheses")
-    private ExpectedParentheses rightParentheses;
+    @XmlElement(name = "original-column")
+    private ExpectedOriginalColumn originalColumn;
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedTableBoundInfo.java
similarity index 72%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedTableBoundInfo.java
index 019d71b2a5b..ea47c9c9e86 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedTableBoundInfo.java
@@ -15,23 +15,26 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.impl.shorthand;
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound;
 
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection;
-import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalDatabase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalSchema;
 
 import javax.xml.bind.annotation.XmlElement;
 
 /**
- * Expected shorthand projection.
+ * Expected table bound info.
  */
 @Getter
 @Setter
-public final class ExpectedShorthandProjection extends 
AbstractExpectedSQLSegment implements ExpectedProjection {
+public final class ExpectedTableBoundInfo extends AbstractExpectedSQLSegment {
     
-    @XmlElement
-    private ExpectedOwner owner;
+    @XmlElement(name = "original-database")
+    private ExpectedOriginalDatabase originalDatabase;
+    
+    @XmlElement(name = "original-schema")
+    private ExpectedOriginalSchema originalSchema;
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalColumn.java
similarity index 63%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalColumn.java
index 7354ce47e0d..63249f7b7d1 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalColumn.java
@@ -15,30 +15,12 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column;
 
-import lombok.Getter;
-import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import java.util.Collection;
-import java.util.LinkedList;
-
 /**
- * Expected simple table.
+ * Expected original column.
  */
-@Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
-    
-    @XmlAttribute
-    private String alias;
-    
-    @XmlElement
-    private ExpectedOwner owner;
-    
-    @XmlElement(name = "index-hint")
-    private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
+public final class ExpectedOriginalColumn extends 
AbstractExpectedIdentifierSQLSegment {
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalTable.java
similarity index 63%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalTable.java
index 7354ce47e0d..a7e863a1835 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalTable.java
@@ -15,30 +15,12 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column;
 
-import lombok.Getter;
-import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import java.util.Collection;
-import java.util.LinkedList;
-
 /**
- * Expected simple table.
+ * Expected original table.
  */
-@Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
-    
-    @XmlAttribute
-    private String alias;
-    
-    @XmlElement
-    private ExpectedOwner owner;
-    
-    @XmlElement(name = "index-hint")
-    private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
+public final class ExpectedOriginalTable extends 
AbstractExpectedIdentifierSQLSegment {
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalDatabase.java
similarity index 63%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalDatabase.java
index 7354ce47e0d..fbf3a0ec662 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalDatabase.java
@@ -15,30 +15,12 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table;
 
-import lombok.Getter;
-import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import java.util.Collection;
-import java.util.LinkedList;
-
 /**
- * Expected simple table.
+ * Expected original database.
  */
-@Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
-    
-    @XmlAttribute
-    private String alias;
-    
-    @XmlElement
-    private ExpectedOwner owner;
-    
-    @XmlElement(name = "index-hint")
-    private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
+public final class ExpectedOriginalDatabase extends 
AbstractExpectedIdentifierSQLSegment {
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalSchema.java
similarity index 63%
copy from 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalSchema.java
index 7354ce47e0d..929acb24008 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalSchema.java
@@ -15,30 +15,12 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table;
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table;
 
-import lombok.Getter;
-import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import java.util.Collection;
-import java.util.LinkedList;
-
 /**
- * Expected simple table.
+ * Expected original schema.
  */
-@Getter
-@Setter
-public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegment {
-    
-    @XmlAttribute
-    private String alias;
-    
-    @XmlElement
-    private ExpectedOwner owner;
-    
-    @XmlElement(name = "index-hint")
-    private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
+public final class ExpectedOriginalSchema extends 
AbstractExpectedIdentifierSQLSegment {
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java
index 565e140fd47..7e57759c14d 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedColumnBoundInfo;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.generic.ExpectedParentheses;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner;
@@ -45,4 +46,7 @@ public final class ExpectedColumnProjection extends 
AbstractExpectedIdentifierSQ
     
     @XmlElement(name = "right-parentheses")
     private ExpectedParentheses rightParentheses;
+    
+    @XmlElement(name = "column-bound")
+    private ExpectedColumnBoundInfo columnBound;
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
index 019d71b2a5b..ba9cd77ad0e 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjections;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner;
 
 import javax.xml.bind.annotation.XmlElement;
@@ -34,4 +35,7 @@ public final class ExpectedShorthandProjection extends 
AbstractExpectedSQLSegmen
     
     @XmlElement
     private ExpectedOwner owner;
+    
+    @XmlElement(name = "actual-projections")
+    private final ExpectedProjections actualProjections = new 
ExpectedProjections();
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
index 7354ce47e0d..96421c3d0e3 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedTableBoundInfo;
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
@@ -39,6 +40,9 @@ public final class ExpectedSimpleTable extends 
AbstractExpectedIdentifierSQLSegm
     @XmlElement
     private ExpectedOwner owner;
     
+    @XmlElement(name = "table-bound")
+    private ExpectedTableBoundInfo tableBound;
+    
     @XmlElement(name = "index-hint")
     private final Collection<ExpectedIndexHint> indexHints = new 
LinkedList<>();
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java
index ac0fecb2d35..c1f6ba1430f 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java
@@ -40,9 +40,22 @@ public final class CaseLoaderTemplate {
      * @param <T> type of test case
      * @return loaded cases
      */
-    @SneakyThrows({JAXBException.class, IOException.class})
     public static <T> Map<String, T> load(final String rootDirectory, final 
CaseLoaderCallback<T> callback) {
         File file = new 
File(CaseLoaderTemplate.class.getProtectionDomain().getCodeSource().getLocation().getPath());
+        return load(file, rootDirectory, callback);
+    }
+    
+    /**
+     * Load test cases.
+     *
+     * @param file file
+     * @param rootDirectory root directory
+     * @param callback callback of cases loader
+     * @param <T> type of test case
+     * @return loaded cases
+     */
+    @SneakyThrows({JAXBException.class, IOException.class})
+    public static <T> Map<String, T> load(final File file, final String 
rootDirectory, final CaseLoaderCallback<T> callback) {
         return file.isFile() ? callback.loadFromJar(file, rootDirectory) : 
callback.loadFromDirectory(rootDirectory);
     }
 }
diff --git a/test/it/pom.xml b/test/it/pom.xml
index 501cad80310..fa0a4b30ecf 100644
--- a/test/it/pom.xml
+++ b/test/it/pom.xml
@@ -35,5 +35,6 @@
         <module>optimizer</module>
         <module>rewriter</module>
         <module>pipeline</module>
+        <module>binder</module>
     </modules>
 </project>

Reply via email to