This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 8e648315f2f Optimize close cursor statement logic to support close all
(#18489)
8e648315f2f is described below
commit 8e648315f2fe1b4f0e30cb976fc4a04a7e75fe57
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Jun 21 17:20:23 2022 +0800
Optimize close cursor statement logic to support close all (#18489)
* Optimize close cursor statement logic to support close all
* Optimize close cursor statement logic to support close all
* optimize unit test
* add more unit test
* fix checkstyle
---
.../merge/ddl/fetch/FetchStreamMergedResult.java | 4 +++-
.../token/generator/impl/CursorTokenGenerator.java | 5 +++--
.../engine/type/ShardingRouteEngineFactory.java | 4 ++++
.../fetch/FetchOrderByValueQueuesHolderTest.java | 4 ++--
.../rewrite/token/CursorTokenGeneratorTest.java | 21 ++++++++++++++++-----
.../engine/type/ShardingRouteEngineFactoryTest.java | 15 +++++++++++++++
.../binder/statement/ddl/CloseStatementContext.java | 3 ++-
.../statement/ddl/CursorStatementContext.java | 5 +++--
.../binder/statement/ddl/FetchStatementContext.java | 5 +++--
.../binder/statement/ddl/MoveStatementContext.java | 5 +++--
.../infra/binder/type/CursorAvailable.java | 4 +++-
.../impl/SchemaAssignedDatabaseBackendHandler.java | 12 +++++++++++-
.../text/distsql/ral/advanced/PreviewHandler.java | 5 ++++-
.../impl/OpenGaussDDLStatementSQLVisitor.java | 1 +
.../impl/PostgreSQLDDLStatementSQLVisitor.java | 1 +
.../common/statement/ddl/AlterTableStatement.java | 1 -
.../sql/common/statement/ddl/CloseStatement.java | 13 +++++++++++++
.../postgresql/ddl/PostgreSQLFetchStatement.java | 2 +-
.../statement/ddl/impl/CloseStatementAssert.java | 19 +++++++++++++------
.../statement/ddl/CloseStatementTestCase.java | 4 ++++
.../src/main/resources/case/ddl/close.xml | 2 +-
.../resources/scenario/sharding/case/ddl/close.xml | 5 +++++
22 files changed, 111 insertions(+), 29 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchStreamMergedResult.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchStreamMergedResult.java
index 9bb11f7b6c1..03432bf1441 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchStreamMergedResult.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchStreamMergedResult.java
@@ -21,6 +21,7 @@ import
org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByItem
import
org.apache.shardingsphere.infra.binder.statement.ddl.FetchStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.memory.JDBCMemoryQueryResult;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.stream.JDBCStreamQueryResult;
@@ -57,7 +58,8 @@ public final class FetchStreamMergedResult extends
StreamMergedResult {
directionType =
fetchStatementContext.getSqlStatement().getDirection().flatMap(DirectionSegment::getDirectionType).orElse(DirectionType.NEXT);
fetchCount =
fetchStatementContext.getSqlStatement().getDirection().flatMap(DirectionSegment::getCount).orElse(1L);
SelectStatementContext selectStatementContext =
fetchStatementContext.getCursorStatementContext().getSelectStatementContext();
- String cursorName =
fetchStatementContext.getCursorName().getIdentifier().getValue().toLowerCase();
+ String cursorName = fetchStatementContext.getCursorName().map(optional
-> optional.getIdentifier().getValue().toLowerCase())
+ .orElseThrow(() -> new ShardingSphereException("Can not get
cursorName from fetchStatementContext."));
List<FetchOrderByValueGroup> fetchOrderByValueGroups =
getFetchOrderByValueGroups(queryResults, selectStatementContext, schema,
cursorName);
addOrderedResultSetsToQueue(fetchOrderByValueGroups, queryResults);
setMinResultSetRowCount(cursorName);
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/CursorTokenGenerator.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/CursorTokenGenerator.java
index 5d626fd96e6..d45ed027edd 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/CursorTokenGenerator.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/CursorTokenGenerator.java
@@ -38,13 +38,14 @@ public final class CursorTokenGenerator implements
OptionalSQLTokenGenerator<SQL
@Override
public boolean isGenerateSQLToken(final SQLStatementContext<?>
sqlStatementContext) {
- return sqlStatementContext instanceof CursorAvailable;
+ return sqlStatementContext instanceof CursorAvailable &&
((CursorAvailable) sqlStatementContext).getCursorName().isPresent();
}
@Override
public SQLToken generateSQLToken(final SQLStatementContext<?>
sqlStatementContext) {
Preconditions.checkArgument(sqlStatementContext instanceof
CursorAvailable, "SQLStatementContext must implementation CursorAvailable
interface.");
- CursorNameSegment cursorName = ((CursorAvailable)
sqlStatementContext).getCursorName();
+ Preconditions.checkArgument(((CursorAvailable)
sqlStatementContext).getCursorName().isPresent(), "Can not get cursor name from
SQLStatementContext.");
+ CursorNameSegment cursorName = ((CursorAvailable)
sqlStatementContext).getCursorName().get();
return new CursorToken(cursorName.getStartIndex(),
cursorName.getStopIndex(), cursorName.getIdentifier(), sqlStatementContext,
shardingRule);
}
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
index 77f4ae7750a..cadc34b7872 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.sharding.route.engine.type;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import
org.apache.shardingsphere.infra.binder.statement.ddl.CloseStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.binder.type.CursorAvailable;
import org.apache.shardingsphere.infra.binder.type.TableAvailable;
@@ -128,6 +129,9 @@ public final class ShardingRouteEngineFactory {
private static ShardingRouteEngine getCursorRouteEngine(final ShardingRule
shardingRule, final ShardingSphereDatabase database, final
SQLStatementContext<?> sqlStatementContext,
final
ShardingConditions shardingConditions, final ConfigurationProperties props,
final Collection<String> tableNames) {
+ if (sqlStatementContext instanceof CloseStatementContext &&
((CloseStatementContext) sqlStatementContext).getSqlStatement().isCloseAll()) {
+ return new ShardingDatabaseBroadcastRoutingEngine();
+ }
if (shardingRule.isAllBroadcastTables(tableNames)) {
return new ShardingUnicastRoutingEngine(sqlStatementContext,
tableNames);
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchOrderByValueQueuesHolderTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchOrderByValueQueuesHolderTest.java
index b8e3001208e..d8b23948318 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchOrderByValueQueuesHolderTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/merge/ddl/fetch/FetchOrderByValueQueuesHolderTest.java
@@ -41,7 +41,7 @@ public final class FetchOrderByValueQueuesHolderTest {
assertTrue(FetchOrderByValueGroupsHolder.getOrderByValueGroups().containsKey("t_order_cursor"));
assertTrue(FetchOrderByValueGroupsHolder.getMinGroupRowCounts().containsKey("t_order_cursor"));
FetchOrderByValueGroupsHolder.remove();
-
assertFalse(FetchOrderByValueGroupsHolder.getOrderByValueGroups().containsKey("t_order_cursor"));
-
assertFalse(FetchOrderByValueGroupsHolder.getMinGroupRowCounts().containsKey("t_order_cursor"));
+
assertTrue(FetchOrderByValueGroupsHolder.getOrderByValueGroups().isEmpty());
+
assertTrue(FetchOrderByValueGroupsHolder.getMinGroupRowCounts().isEmpty());
}
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/CursorTokenGeneratorTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/CursorTokenGeneratorTest.java
index db9971ef3ff..4afb1e224c5 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/CursorTokenGeneratorTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/CursorTokenGeneratorTest.java
@@ -29,6 +29,8 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.cursor.Cursor
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
import org.junit.Test;
+import java.util.Optional;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
@@ -40,17 +42,26 @@ public final class CursorTokenGeneratorTest {
public void assertIsGenerateSQLToken() {
CursorTokenGenerator generator = new CursorTokenGenerator();
assertFalse(generator.isGenerateSQLToken(mock(SelectStatementContext.class)));
-
assertTrue(generator.isGenerateSQLToken(mock(CursorStatementContext.class)));
-
assertTrue(generator.isGenerateSQLToken(mock(CloseStatementContext.class)));
-
assertTrue(generator.isGenerateSQLToken(mock(MoveStatementContext.class)));
-
assertTrue(generator.isGenerateSQLToken(mock(FetchStatementContext.class)));
+ Optional<CursorNameSegment> cursorName = Optional.of(new
CursorNameSegment(0, 0, new IdentifierValue("t_order_cursor")));
+ CursorStatementContext cursorStatementContext =
mock(CursorStatementContext.class);
+ when(cursorStatementContext.getCursorName()).thenReturn(cursorName);
+ assertTrue(generator.isGenerateSQLToken(cursorStatementContext));
+ CloseStatementContext closeStatementContext =
mock(CloseStatementContext.class);
+ when(closeStatementContext.getCursorName()).thenReturn(cursorName);
+ assertTrue(generator.isGenerateSQLToken(closeStatementContext));
+ MoveStatementContext moveStatementContext =
mock(MoveStatementContext.class);
+ when(moveStatementContext.getCursorName()).thenReturn(cursorName);
+ assertTrue(generator.isGenerateSQLToken(moveStatementContext));
+ FetchStatementContext fetchStatementContext =
mock(FetchStatementContext.class);
+ when(fetchStatementContext.getCursorName()).thenReturn(cursorName);
+ assertTrue(generator.isGenerateSQLToken(fetchStatementContext));
}
@Test
public void assertGenerateSQLToken() {
CursorTokenGenerator generator = new CursorTokenGenerator();
CursorStatementContext statementContext =
mock(CursorStatementContext.class);
- when(statementContext.getCursorName()).thenReturn(new
CursorNameSegment(0, 0, new IdentifierValue("t_order_cursor")));
+ when(statementContext.getCursorName()).thenReturn(Optional.of(new
CursorNameSegment(0, 0, new IdentifierValue("t_order_cursor"))));
SQLToken actual = generator.generateSQLToken(statementContext);
assertTrue(actual instanceof CursorToken);
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
index 3cfc05ac012..e37e642087a 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.sharding.route.engine.type;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dcl.GrantStatementContext;
+import
org.apache.shardingsphere.infra.binder.statement.ddl.CloseStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
@@ -57,6 +58,7 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLGrantStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussCloseStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussCursorStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dcl.OracleGrantStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dal.PostgreSQLSetStatement;
@@ -410,6 +412,19 @@ public final class ShardingRouteEngineFactoryTest {
assertThat(actual, instanceOf(ShardingIgnoreRoutingEngine.class));
}
+ @Test
+ public void assertNewInstanceForCloseAllStatement() {
+ CloseStatementContext closeStatementContext =
mock(CloseStatementContext.class, RETURNS_DEEP_STUBS);
+ OpenGaussCloseStatement closeStatement =
mock(OpenGaussCloseStatement.class);
+ when(closeStatement.isCloseAll()).thenReturn(true);
+ tableNames.add("t_order");
+
when(closeStatementContext.getTablesContext().getTableNames()).thenReturn(tableNames);
+
when(closeStatementContext.getSqlStatement()).thenReturn(closeStatement);
+
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
+ ShardingRouteEngine actual =
ShardingRouteEngineFactory.newInstance(shardingRule, database,
closeStatementContext, shardingConditions, props);
+ assertThat(actual,
instanceOf(ShardingDatabaseBroadcastRoutingEngine.class));
+ }
+
private Collection<SimpleTableSegment> createSimpleTableSegments() {
return Collections.singletonList(new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order"))));
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CloseStatementContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CloseStatementContext.java
index b3371e339ee..10f96a71dca 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CloseStatementContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CloseStatementContext.java
@@ -31,6 +31,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CloseStatem
import java.util.Collection;
import java.util.Collections;
+import java.util.Optional;
/**
* Close statement context.
@@ -48,7 +49,7 @@ public final class CloseStatementContext extends
CommonSQLStatementContext<Close
}
@Override
- public CursorNameSegment getCursorName() {
+ public Optional<CursorNameSegment> getCursorName() {
return getSqlStatement().getCursorName();
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementContext.java
index 58ee20772bc..19c2f35f217 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CursorStatementContext.java
@@ -39,6 +39,7 @@ import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
/**
* Cursor statement context.
@@ -81,8 +82,8 @@ public final class CursorStatementContext extends
CommonSQLStatementContext<Open
}
@Override
- public CursorNameSegment getCursorName() {
- return getSqlStatement().getCursorName();
+ public Optional<CursorNameSegment> getCursorName() {
+ return Optional.of(getSqlStatement().getCursorName());
}
@Override
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/FetchStatementContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/FetchStatementContext.java
index 1ce2a103a34..309a41f1f74 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/FetchStatementContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/FetchStatementContext.java
@@ -31,6 +31,7 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.
import java.util.Collection;
import java.util.Collections;
+import java.util.Optional;
/**
* Fetch statement context.
@@ -48,8 +49,8 @@ public final class FetchStatementContext extends
CommonSQLStatementContext<OpenG
}
@Override
- public CursorNameSegment getCursorName() {
- return getSqlStatement().getCursorName();
+ public Optional<CursorNameSegment> getCursorName() {
+ return Optional.of(getSqlStatement().getCursorName());
}
@Override
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/MoveStatementContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/MoveStatementContext.java
index 6150bdefcd7..7b5a325a604 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/MoveStatementContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/MoveStatementContext.java
@@ -31,6 +31,7 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.
import java.util.Collection;
import java.util.Collections;
+import java.util.Optional;
/**
* Move statement context.
@@ -48,8 +49,8 @@ public final class MoveStatementContext extends
CommonSQLStatementContext<OpenGa
}
@Override
- public CursorNameSegment getCursorName() {
- return getSqlStatement().getCursorName();
+ public Optional<CursorNameSegment> getCursorName() {
+ return Optional.of(getSqlStatement().getCursorName());
}
@Override
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/type/CursorAvailable.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/type/CursorAvailable.java
index 58313043aa5..4b55f98dfa2 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/type/CursorAvailable.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/type/CursorAvailable.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.infra.binder.type;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.cursor.CursorNameSegment;
+import java.util.Optional;
+
/**
* Cursor available.
*/
@@ -29,5 +31,5 @@ public interface CursorAvailable {
*
* @return cursor name segment
*/
- CursorNameSegment getCursorName();
+ Optional<CursorNameSegment> getCursorName();
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
index 51c660334a1..870157a6f89 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
@@ -91,7 +91,17 @@ public final class SchemaAssignedDatabaseBackendHandler
implements DatabaseBacke
}
private void prepareCursorStatementContext(final CursorAvailable
statementContext, final ConnectionSession connectionSession) {
- String cursorName =
statementContext.getCursorName().getIdentifier().getValue().toLowerCase();
+ if (statementContext.getCursorName().isPresent()) {
+ String cursorName =
statementContext.getCursorName().get().getIdentifier().getValue().toLowerCase();
+ prepareCursorStatementContext(statementContext, connectionSession,
cursorName);
+ }
+ if (statementContext instanceof CloseStatementContext &&
((CloseStatementContext) statementContext).getSqlStatement().isCloseAll()) {
+ FetchOrderByValueGroupsHolder.remove();
+ connectionSession.getCursorDefinitions().clear();
+ }
+ }
+
+ private void prepareCursorStatementContext(final CursorAvailable
statementContext, final ConnectionSession connectionSession, final String
cursorName) {
if (statementContext instanceof CursorStatementContext) {
connectionSession.getCursorDefinitions().put(cursorName,
(CursorStatementContext) statementContext);
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewHandler.java
index c8b0e921cee..60e1c377af4 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewHandler.java
@@ -117,7 +117,10 @@ public final class PreviewHandler extends
QueryableRALBackendHandler<PreviewStat
}
private void setUpCursorDefinition(final SQLStatementContext<?>
sqlStatementContext) {
- String cursorName = ((CursorAvailable)
sqlStatementContext).getCursorName().getIdentifier().getValue().toLowerCase();
+ if (!((CursorAvailable)
sqlStatementContext).getCursorName().isPresent()) {
+ return;
+ }
+ String cursorName = ((CursorAvailable)
sqlStatementContext).getCursorName().get().getIdentifier().getValue().toLowerCase();
CursorStatementContext cursorStatementContext =
getConnectionSession().getCursorDefinitions().get(cursorName);
Preconditions.checkArgument(null != cursorStatementContext, "Cursor %s
does not exist.", cursorName);
((CursorDefinitionAware)
sqlStatementContext).setUpCursorDefinition(cursorStatementContext);
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussDDLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussDDLStatementSQLVisitor.java
index 9448b6ba85b..b1c0d14f069 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussDDLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussDDLStatementSQLVisitor.java
@@ -994,6 +994,7 @@ public final class OpenGaussDDLStatementSQLVisitor extends
OpenGaussStatementSQL
if (null != ctx.cursorName()) {
result.setCursorName((CursorNameSegment) visit(ctx.cursorName()));
}
+ result.setCloseAll(null != ctx.ALL());
return result;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
index b22b855d2c0..bd97da0b9b4 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
@@ -1095,6 +1095,7 @@ public final class PostgreSQLDDLStatementSQLVisitor
extends PostgreSQLStatementS
if (null != ctx.cursorName()) {
result.setCursorName((CursorNameSegment) visit(ctx.cursorName()));
}
+ result.setCloseAll(null != ctx.ALL());
return result;
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
index bc238f11fbc..2b0b951adba 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
@@ -86,5 +86,4 @@ public abstract class AlterTableStatement extends
AbstractSQLStatement implement
public Optional<ConvertTableDefinitionSegment> getConvertTableDefinition()
{
return Optional.ofNullable(convertTableDefinition);
}
-
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/CloseStatement.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/CloseStatement.java
index 9217f34e9ab..a8dc01ae6df 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/CloseStatement.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/CloseStatement.java
@@ -23,6 +23,8 @@ import lombok.ToString;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.cursor.CursorNameSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
+import java.util.Optional;
+
/**
* Close statement.
*/
@@ -32,4 +34,15 @@ import
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStat
public abstract class CloseStatement extends AbstractSQLStatement implements
DDLStatement {
private CursorNameSegment cursorName;
+
+ private boolean closeAll;
+
+ /**
+ * Get cursor name.
+ *
+ * @return cursor name
+ */
+ public Optional<CursorNameSegment> getCursorName() {
+ return Optional.ofNullable(cursorName);
+ }
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLFetchStatement.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLFetchStatement.java
index 158e55170a5..3cd064abb1b 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLFetchStatement.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLFetchStatement.java
@@ -35,7 +35,7 @@ import java.util.Optional;
@Setter
@ToString
public final class PostgreSQLFetchStatement extends AbstractSQLStatement
implements DDLStatement, PostgreSQLStatement {
-
+
private CursorNameSegment cursorName;
private DirectionSegment direction;
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/CloseStatementAssert.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/CloseStatementAssert.java
index f804d615999..d538da0a1f3 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/CloseStatementAssert.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/CloseStatementAssert.java
@@ -25,8 +25,10 @@ import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.S
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.value.IdentifierValueAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.ddl.CloseStatementTestCase;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
/**
* Close statement assert.
@@ -43,15 +45,20 @@ public final class CloseStatementAssert {
*/
public static void assertIs(final SQLCaseAssertContext assertContext,
final CloseStatement actual, final CloseStatementTestCase expected) {
assertCursorName(assertContext, actual, expected);
+ assertCloseAll(assertContext, actual, expected);
}
private static void assertCursorName(final SQLCaseAssertContext
assertContext, final CloseStatement actual, final CloseStatementTestCase
expected) {
if (null != expected.getCursorName()) {
- assertNotNull(assertContext.getText("Actual cursor name should
exist."), actual.getCursorName());
- IdentifierValueAssert.assertIs(assertContext,
actual.getCursorName().getIdentifier(), expected.getCursorName(), "Close");
- SQLSegmentAssert.assertIs(assertContext, actual.getCursorName(),
expected.getCursorName());
+ assertTrue(assertContext.getText("Actual cursor name should
exist."), actual.getCursorName().isPresent());
+ IdentifierValueAssert.assertIs(assertContext,
actual.getCursorName().get().getIdentifier(), expected.getCursorName(),
"Close");
+ SQLSegmentAssert.assertIs(assertContext,
actual.getCursorName().get(), expected.getCursorName());
} else {
- assertNull(assertContext.getText("Actual cursor name should not
exist."), actual.getCursorName());
+ assertFalse(assertContext.getText("Actual cursor name should not
exist."), actual.getCursorName().isPresent());
}
}
+
+ private static void assertCloseAll(final SQLCaseAssertContext
assertContext, final CloseStatement actual, final CloseStatementTestCase
expected) {
+ assertThat(assertContext.getText("Cursor's close all assertion error:
"), actual.isCloseAll(), is(expected.isCloseAll()));
+ }
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/CloseStatementTestCase.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/CloseStatementTestCase.java
index fa5007806eb..84a17234137 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/CloseStatementTestCase.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/CloseStatementTestCase.java
@@ -22,6 +22,7 @@ import lombok.Setter;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.cursor.ExpectedCursorName;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
+import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
/**
@@ -33,4 +34,7 @@ public final class CloseStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "cursor-name")
private ExpectedCursorName cursorName;
+
+ @XmlAttribute(name = "close-all")
+ private boolean closeAll;
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/close.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/close.xml
index 79b68d58965..1f98d922916 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/close.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/close.xml
@@ -20,5 +20,5 @@
<close sql-case-id="close_cursor">
<cursor-name name="t_order_cursor" start-index="6" stop-index="19" />
</close>
- <close sql-case-id="close_all_cursor" />
+ <close sql-case-id="close_all_cursor" close-all="true" />
</sql-parser-test-cases>
diff --git
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/ddl/close.xml
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/ddl/close.xml
index ab9fd5112a3..838bd52626c 100644
---
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/ddl/close.xml
+++
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/ddl/close.xml
@@ -26,4 +26,9 @@
<input sql="CLOSE "t_account_cursor"" />
<output sql="CLOSE "t_account_cursor_t_account_0"" />
</rewrite-assertion>
+
+ <rewrite-assertion id="close_all_cursor" db-types="openGauss">
+ <input sql="CLOSE ALL;" />
+ <output sql="CLOSE ALL;" />
+ </rewrite-assertion>
</rewrite-assertions>