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>