This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 71be1435c6a Remove useless with statement binder logic (#32122)
71be1435c6a is described below
commit 71be1435c6aeda3f331e7ead7267d885ef47e950
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Jul 16 10:31:05 2024 +0800
Remove useless with statement binder logic (#32122)
* Remove useless with statement binder logic
* remove useless unit test
* remove useless unit test
---
.../with/CommonTableExpressionSegmentBinder.java | 52 ----------
.../engine/segment/with/WithSegmentBinder.java | 58 -----------
.../statement/dml/SelectStatementBinder.java | 4 +-
.../expression/type/SubquerySegmentBinderTest.java | 55 -----------
.../statement/SelectStatementBinderTest.java | 107 ---------------------
5 files changed, 1 insertion(+), 275 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java
deleted file mode 100644
index ef5652109f0..00000000000
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.infra.binder.engine.segment.with;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.infra.binder.engine.segment.expression.type.SubquerySegmentBinder;
-import
org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext;
-import
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
-
-import java.util.Map;
-
-/**
- * Common table expression segment binder.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class CommonTableExpressionSegmentBinder {
-
- /**
- * Bind common table expression segment.
- *
- * @param segment common table expression segment
- * @param binderContext SQL statement binder context
- * @param tableBinderContexts table binder contexts
- * @return bound common table expression segment
- */
- public static CommonTableExpressionSegment bind(final
CommonTableExpressionSegment segment, final SQLStatementBinderContext
binderContext,
- final Map<String,
TableSegmentBinderContext> tableBinderContexts) {
- SubquerySegment boundSubquerySegment =
SubquerySegmentBinder.bind(segment.getSubquery(), binderContext,
tableBinderContexts);
- CommonTableExpressionSegment result = new
CommonTableExpressionSegment(segment.getStartIndex(), segment.getStopIndex(),
segment.getAliasSegment(), boundSubquerySegment);
- // TODO bind with columns
- result.getColumns().addAll(segment.getColumns());
- return result;
- }
-}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java
deleted file mode 100644
index 48b1d06d549..00000000000
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.infra.binder.engine.segment.with;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext;
-import
org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext;
-import
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Map;
-
-/**
- * With segment binder.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class WithSegmentBinder {
-
- /**
- * Bind with segment.
- *
- * @param segment with segment
- * @param binderContext SQL statement binder context
- * @param tableBinderContexts table binder contexts
- * @param externalTableBinderContexts external table binder contexts
- * @return bound with segment
- */
- public static WithSegment bind(final WithSegment segment, final
SQLStatementBinderContext binderContext, final Map<String,
TableSegmentBinderContext> tableBinderContexts,
- final Map<String,
TableSegmentBinderContext> externalTableBinderContexts) {
- Collection<CommonTableExpressionSegment> boundCommonTableExpressions =
new LinkedList<>();
- for (CommonTableExpressionSegment each :
segment.getCommonTableExpressions()) {
- CommonTableExpressionSegment boundCommonTableExpression =
CommonTableExpressionSegmentBinder.bind(each, binderContext,
tableBinderContexts);
- boundCommonTableExpressions.add(boundCommonTableExpression);
- each.getAliasName().ifPresent(aliasName ->
externalTableBinderContexts.put(aliasName,
- new
SimpleTableSegmentBinderContext(boundCommonTableExpression.getSubquery().getSelect().getProjections().getProjections())));
- }
- return new WithSegment(segment.getStartIndex(),
segment.getStopIndex(), boundCommonTableExpressions);
- }
-}
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java
index 0e9d3bac0d1..b2cff322e1f 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java
@@ -25,7 +25,6 @@ import
org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableS
import
org.apache.shardingsphere.infra.binder.engine.segment.lock.LockSegmentBinder;
import
org.apache.shardingsphere.infra.binder.engine.segment.projection.ProjectionsSegmentBinder;
import
org.apache.shardingsphere.infra.binder.engine.segment.where.WhereSegmentBinder;
-import
org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder;
import
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder;
import
org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment;
@@ -52,8 +51,6 @@ public final class SelectStatementBinder implements
SQLStatementBinder<SelectSta
public SelectStatement bind(final SelectStatement sqlStatement, final
SQLStatementBinderContext binderContext) {
SelectStatement result = copy(sqlStatement);
Map<String, TableSegmentBinderContext> tableBinderContexts = new
LinkedHashMap<>();
- sqlStatement.getWithSegment()
- .ifPresent(optional ->
result.setWithSegment(WithSegmentBinder.bind(optional, binderContext,
tableBinderContexts, binderContext.getExternalTableBinderContexts())));
Optional<TableSegment> boundTableSegment =
sqlStatement.getFrom().map(optional -> TableSegmentBinder.bind(optional,
binderContext, tableBinderContexts, outerTableBinderContexts));
boundTableSegment.ifPresent(result::setFrom);
result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(),
binderContext, boundTableSegment.orElse(null), tableBinderContexts,
outerTableBinderContexts));
@@ -73,6 +70,7 @@ public final class SelectStatementBinder implements
SQLStatementBinder<SelectSta
sqlStatement.getLimit().ifPresent(result::setLimit);
sqlStatement.getWindow().ifPresent(result::setWindow);
sqlStatement.getModelSegment().ifPresent(result::setModelSegment);
+ sqlStatement.getWithSegment().ifPresent(result::setWithSegment);
result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments());
result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
return result;
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
index 18699ea8fdb..c08d85da16f 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java
@@ -28,20 +28,16 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import
org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLSelectStatement;
-import
org.apache.shardingsphere.sql.parser.statement.oracle.dml.OracleSelectStatement;
import org.junit.jupiter.api.Test;
import java.sql.Types;
@@ -104,57 +100,6 @@ class SubquerySegmentBinderTest {
assertThat(((ColumnProjectionSegment)
column).getColumn().getColumnBoundInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
}
- @Test
- void assertBindUseWithClause() {
- ColumnSegment columnSegment = new ColumnSegment(29, 36, new
IdentifierValue("order_id"));
- ProjectionsSegment projectionsSegment = new ProjectionsSegment(29, 36);
- projectionsSegment.getProjections().add(new
ColumnProjectionSegment(columnSegment));
- OracleSelectStatement oracleSubquerySelectStatement = new
OracleSelectStatement();
- oracleSubquerySelectStatement.setProjections(projectionsSegment);
- oracleSubquerySelectStatement.setFrom(new SimpleTableSegment(new
TableNameSegment(43, 49, new IdentifierValue("t_order"))));
- ExpressionSegment whereExpressionSegment = new ColumnSegment(57, 62,
new IdentifierValue("status"));
- oracleSubquerySelectStatement.setWhere(new WhereSegment(51, 73,
whereExpressionSegment));
- CommonTableExpressionSegment commonTableExpressionSegment = new
CommonTableExpressionSegment(0, 1, new AliasSegment(0, 1, new
IdentifierValue("submit_order")),
- new SubquerySegment(22, 73, oracleSubquerySelectStatement,
"SELECT order_id FROM t_order WHERE status = 'SUBMIT'"));
- WithSegment withSegment = new WithSegment(0, 74,
Collections.singleton(commonTableExpressionSegment));
- OracleSelectStatement oracleSelectStatement = new
OracleSelectStatement();
- oracleSelectStatement.setWithSegment(withSegment);
- oracleSelectStatement.setProjections(new ProjectionsSegment(0, 0));
- SubquerySegment subquerySegment = new SubquerySegment(0, 74,
oracleSelectStatement, "WITH submit_order AS (SELECT order_id FROM t_order
WHERE status = 'SUBMIT')");
- SQLStatementBinderContext sqlStatementBinderContext = new
SQLStatementBinderContext(
- createMetaData(), DefaultDatabase.LOGIC_NAME,
TypedSPILoader.getService(DatabaseType.class, "FIXTURE"),
Collections.emptySet());
- Map<String, TableSegmentBinderContext> outerTableBinderContexts = new
LinkedHashMap<>();
- SubquerySegment actual = SubquerySegmentBinder.bind(subquerySegment,
sqlStatementBinderContext, outerTableBinderContexts);
- assertNotNull(actual.getSelect());
- assertInstanceOf(OracleSelectStatement.class, actual.getSelect());
- assertTrue(actual.getSelect().getWithSegment().isPresent());
-
assertNotNull(actual.getSelect().getWithSegment().get().getCommonTableExpressions());
-
assertThat(actual.getSelect().getWithSegment().get().getCommonTableExpressions().size(),
is(1));
- CommonTableExpressionSegment expressionSegment =
actual.getSelect().getWithSegment().get().getCommonTableExpressions().iterator().next();
- assertNotNull(expressionSegment.getSubquery().getSelect());
- assertInstanceOf(OracleSelectStatement.class,
expressionSegment.getSubquery().getSelect());
-
assertTrue(expressionSegment.getSubquery().getSelect().getFrom().isPresent());
- assertInstanceOf(SimpleTableSegment.class,
expressionSegment.getSubquery().getSelect().getFrom().get());
- assertThat(((SimpleTableSegment)
expressionSegment.getSubquery().getSelect().getFrom().get()).getTableName().getIdentifier().getValue(),
is("t_order"));
-
assertNotNull(expressionSegment.getSubquery().getSelect().getProjections());
-
assertNotNull(expressionSegment.getSubquery().getSelect().getProjections().getProjections());
-
assertThat(expressionSegment.getSubquery().getSelect().getProjections().getProjections().size(),
is(1));
- ProjectionSegment column =
expressionSegment.getSubquery().getSelect().getProjections().getProjections().iterator().next();
- assertInstanceOf(ColumnProjectionSegment.class, column);
- assertThat(((ColumnProjectionSegment)
column).getColumn().getIdentifier().getValue(), is("order_id"));
- assertNotNull(((ColumnProjectionSegment)
column).getColumn().getColumnBoundInfo());
- assertThat(((ColumnProjectionSegment)
column).getColumn().getColumnBoundInfo().getOriginalColumn().getValue(),
is("order_id"));
- assertThat(((ColumnProjectionSegment)
column).getColumn().getColumnBoundInfo().getOriginalTable().getValue(),
is("t_order"));
- assertThat(((ColumnProjectionSegment)
column).getColumn().getColumnBoundInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnProjectionSegment)
column).getColumn().getColumnBoundInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
-
assertTrue(expressionSegment.getSubquery().getSelect().getWhere().isPresent());
- assertNotNull(((ColumnSegment)
expressionSegment.getSubquery().getSelect().getWhere().get().getExpr()).getColumnBoundInfo());
- assertThat(((ColumnSegment)
expressionSegment.getSubquery().getSelect().getWhere().get().getExpr()).getColumnBoundInfo().getOriginalColumn().getValue(),
is("status"));
- assertThat(((ColumnSegment)
expressionSegment.getSubquery().getSelect().getWhere().get().getExpr()).getColumnBoundInfo().getOriginalTable().getValue(),
is("t_order"));
- assertThat(((ColumnSegment)
expressionSegment.getSubquery().getSelect().getWhere().get().getExpr()).getColumnBoundInfo().getOriginalSchema().getValue(),
is(DefaultDatabase.LOGIC_NAME));
- assertThat(((ColumnSegment)
expressionSegment.getSubquery().getSelect().getWhere().get().getExpr()).getColumnBoundInfo().getOriginalDatabase().getValue(),
is(DefaultDatabase.LOGIC_NAME));
- }
-
private ShardingSphereMetaData createMetaData() {
ShardingSphereSchema schema = mock(ShardingSphereSchema.class,
RETURNS_DEEP_STUBS);
when(schema.getTable("t_order").getColumnValues()).thenReturn(Arrays.asList(
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/SelectStatementBinderTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/SelectStatementBinderTest.java
index 461cb717d45..b18d7f05a09 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/SelectStatementBinderTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/SelectStatementBinderTest.java
@@ -18,19 +18,10 @@
package org.apache.shardingsphere.infra.binder.engine.statement;
import
org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
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.parser.sql.SQLStatementParserEngine;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.sql.parser.api.CacheOption;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
@@ -44,17 +35,12 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
import
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import
org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLSelectStatement;
-import
org.apache.shardingsphere.sql.parser.statement.oracle.dml.OracleSelectStatement;
import org.junit.jupiter.api.Test;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import java.util.Properties;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
@@ -131,97 +117,4 @@ class SelectStatementBinderTest {
when(result.getDatabase(DefaultDatabase.LOGIC_NAME).getSchema(DefaultDatabase.LOGIC_NAME).containsTable("t_order")).thenReturn(true);
return result;
}
-
- @Test
- void assertBindOracleWithClause() {
- String sql = "WITH user_temp AS (SELECT t.id, t.user_id, t.user_sn,
t.user_no FROM t_user t), "
- + "product1_temp AS (SELECT * FROM (SELECT t.name, t.detail
FROM t_order_product1 t, user_temp WHERE t.user_sn = user_temp.user_sn) WHERE
ROWNUM = 1), "
- + "product2_temp AS (SELECT * FROM (SELECT t.sub_product_url
FROM t_order_product2 t, user_temp WHERE t.user_no = user_temp.user_no) WHERE
ROWNUM = 1), "
- + "item_temp AS (SELECT COUNT(item.id) n FROM t_order_item
item, user_temp WHERE item.user_id = user_temp.user_id), "
- + "item_ext_temp AS (SELECT * FROM (SELECT c.item_order_url
FROM t_order_item_ext c, t_store r, user_temp WHERE c.item_no = r.item_no AND
c.status = 1 "
- + "OR ((SELECT * FROM item_temp) >= 1) AND r.user_rn =
user_temp.id AND r.store_no = 's1234') WHERE ROWNUM = 1) "
- + "SELECT product1_temp.name, product1_temp.detail,
product2_temp.sub_product_url, item_ext_temp.item_order_url FROM product1_temp,
product2_temp, item_ext_temp";
- ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.emptyMap());
- RuleMetaData ruleMetaData = new RuleMetaData(Collections.emptyList());
- DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "Oracle");
- ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME, databaseType,
resourceMetaData, ruleMetaData, buildSchemas());
- SQLStatementParserEngine parserEngine = new
SQLStatementParserEngine(databaseType, new CacheOption(2000, 65535L), new
CacheOption(128, 1024L));
- ShardingSphereMetaData metaData =
- new
ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
database), resourceMetaData, ruleMetaData, new ConfigurationProperties(new
Properties()));
- SelectStatement selectStatement = (SelectStatement)
parserEngine.parse(sql, false);
- SelectStatement actual = new
SelectStatementBinder().bind(selectStatement, new
SQLStatementBinderContext(selectStatement, metaData,
DefaultDatabase.LOGIC_NAME));
- assertThat(actual, not(selectStatement));
- assertThat(actual, instanceOf(OracleSelectStatement.class));
- assertTrue(actual.getWithSegment().isPresent());
-
assertThat(actual.getWithSegment().get().getCommonTableExpressions().size(),
is(5));
- }
-
- @Test
- void assertBindOracleWithClauseWhenSelectContainsUnionAll() {
- String sql = "WITH cte AS \n"
- + " (SELECT * FROM t_order o LEFT JOIN t_order_item i ON
o.order_id = i.order_id\n"
- + " WHERE o.order_id = ?\n"
- + " UNION ALL \n"
- + " SELECT * FROM \n"
- + " (SELECT *\n"
- + " FROM t_order o\n"
- + " INNER JOIN t_order_item i ON o.order_id =
i.order_id\n"
- + " ) tt\n"
- + " WHERE ROWNUM = 1)\n"
- + "SELECT * FROM cte\n"
- + "UNION ALL SELECT * FROM cte\n"
- + "UNION ALL SELECT * FROM cte WHERE cte.order_id = ?";
- ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.emptyMap());
- RuleMetaData ruleMetaData = new RuleMetaData(Collections.emptyList());
- DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "Oracle");
- ShardingSphereDatabase database = new
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME, databaseType,
resourceMetaData, ruleMetaData, buildSchemas());
- SQLStatementParserEngine parserEngine = new
SQLStatementParserEngine(databaseType, new CacheOption(2000, 65535L), new
CacheOption(128, 1024L));
- ShardingSphereMetaData metaData =
- new
ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
database), resourceMetaData, ruleMetaData, new ConfigurationProperties(new
Properties()));
- SelectStatement selectStatement = (SelectStatement)
parserEngine.parse(sql, false);
- SelectStatement actual = new
SelectStatementBinder().bind(selectStatement, new
SQLStatementBinderContext(selectStatement, metaData,
DefaultDatabase.LOGIC_NAME));
- assertThat(actual, not(selectStatement));
- assertThat(actual, instanceOf(OracleSelectStatement.class));
- assertTrue(actual.getWithSegment().isPresent());
-
assertThat(actual.getWithSegment().get().getCommonTableExpressions().size(),
is(1));
- }
-
- private Map<String, ShardingSphereSchema> buildSchemas() {
- Map<String, ShardingSphereTable> tables = new HashMap<>(6, 1F);
- tables.put("t_order", new ShardingSphereTable("t_order", Arrays.asList(
- new ShardingSphereColumn("order_id", Types.INTEGER, 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, false),
- 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()));
- tables.put("t_order_item", new ShardingSphereTable("t_order_item",
Arrays.asList(
- new ShardingSphereColumn("item_id", Types.BIGINT, true, false,
false, true, false, false),
- new ShardingSphereColumn("order_id", Types.INTEGER, 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()));
- tables.put("t_user", new ShardingSphereTable("t_user", Arrays.asList(
- new ShardingSphereColumn("id", Types.INTEGER, true, false,
false, true, false, false),
- new ShardingSphereColumn("user_id", Types.INTEGER, false,
false, false, true, false, false),
- new ShardingSphereColumn("user_sn", Types.VARCHAR, false,
false, false, true, false, false),
- new ShardingSphereColumn("user_no", Types.VARCHAR, false,
false, false, true, false, false)), Collections.emptyList(),
Collections.emptyList()));
- tables.put("t_order_product1", new
ShardingSphereTable("t_order_product1", Arrays.asList(
- new ShardingSphereColumn("name", Types.VARCHAR, false, false,
false, true, false, false),
- new ShardingSphereColumn("detail", Types.INTEGER, false,
false, false, true, false, false),
- new ShardingSphereColumn("user_sn", Types.INTEGER, false,
false, false, true, false, false)), Collections.emptyList(),
Collections.emptyList()));
- tables.put("t_order_product2", new
ShardingSphereTable("t_order_product2", Arrays.asList(
- new ShardingSphereColumn("user_no", Types.VARCHAR, true,
false, false, true, false, false),
- new ShardingSphereColumn("sub_product_url", Types.VARCHAR,
true, false, false, true, false, false)), Collections.emptyList(),
Collections.emptyList()));
- tables.put("t_order_item_ext", new
ShardingSphereTable("t_order_item_ext", Arrays.asList(
- new ShardingSphereColumn("item_order_url", Types.VARCHAR,
false, false, false, true, false, false),
- new ShardingSphereColumn("item_no", Types.VARCHAR, false,
false, false, true, false, false),
- new ShardingSphereColumn("status", Types.INTEGER, false,
false, false, true, false, false)), Collections.emptyList(),
Collections.emptyList()));
- tables.put("t_store", new ShardingSphereTable("t_store", Arrays.asList(
- new ShardingSphereColumn("item_no", Types.VARCHAR, false,
false, false, true, false, false),
- new ShardingSphereColumn("user_rn", Types.VARCHAR, false,
false, false, true, false, false),
- new ShardingSphereColumn("store_no", Types.VARCHAR, false,
false, false, true, false, false)), Collections.emptyList(),
Collections.emptyList()));
- return Collections.singletonMap(DefaultDatabase.LOGIC_NAME, new
ShardingSphereSchema(tables, Collections.emptyMap()));
- }
}