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 &quot;t_account_cursor&quot;" />
         <output sql="CLOSE &quot;t_account_cursor_t_account_0&quot;" />
     </rewrite-assertion>
+
+    <rewrite-assertion id="close_all_cursor" db-types="openGauss">
+        <input sql="CLOSE ALL;" />
+        <output sql="CLOSE ALL;" />
+    </rewrite-assertion>
 </rewrite-assertions>

Reply via email to