This is an automated email from the ASF dual-hosted git repository.
tuichenchuxin 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 aac0d3026e0 Fix NoSuchElementException when execute preview cursor
statement (#18241)
aac0d3026e0 is described below
commit aac0d3026e00575114701be603ec189a02a45747
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Jun 8 17:49:24 2022 +0800
Fix NoSuchElementException when execute preview cursor statement (#18241)
---
.../data/impl/SchemaAssignedDatabaseBackendHandler.java | 7 ++++---
.../distsql/ral/advanced/PreviewDistSQLBackendHandler.java | 13 +++++++++++++
2 files changed, 17 insertions(+), 3 deletions(-)
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 e57ee177f3e..051dcfdb6f9 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
@@ -95,14 +95,15 @@ public final class SchemaAssignedDatabaseBackendHandler
implements DatabaseBacke
if (statementContext instanceof CursorStatementContext) {
connectionSession.getCursorDefinitions().put(cursorName,
(CursorStatementContext) statementContext);
}
- if (statementContext instanceof CloseStatementContext) {
- FetchOrderByValueQueuesHolder.get().remove(cursorName);
- }
if (statementContext instanceof CursorDefinitionAware) {
CursorStatementContext cursorStatementContext =
connectionSession.getCursorDefinitions().get(cursorName);
Preconditions.checkArgument(null != cursorStatementContext,
"Cursor %s does not exist.", cursorName);
((CursorDefinitionAware)
statementContext).setUpCursorDefinition(cursorStatementContext);
}
+ if (statementContext instanceof CloseStatementContext) {
+ FetchOrderByValueQueuesHolder.get().remove(cursorName);
+ connectionSession.getCursorDefinitions().remove(cursorName);
+ }
}
@Override
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
index 10b2121f1d4..536807169b7 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
@@ -22,7 +22,10 @@ import com.google.common.base.Strings;
import
org.apache.shardingsphere.distsql.parser.statement.ral.advanced.PreviewStatement;
import org.apache.shardingsphere.infra.binder.LogicSQL;
import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
+import org.apache.shardingsphere.infra.binder.aware.CursorDefinitionAware;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementContext;
+import org.apache.shardingsphere.infra.binder.type.CursorAvailable;
import org.apache.shardingsphere.infra.binder.type.TableAvailable;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.context.kernel.KernelProcessor;
@@ -107,6 +110,9 @@ public final class PreviewDistSQLBackendHandler extends
QueryableRALBackendHandl
if (sqlStatementContext instanceof TableAvailable) {
((TableAvailable)
sqlStatementContext).getTablesContext().getDatabaseName().ifPresent(SQLStatementDatabaseHolder::set);
}
+ if (sqlStatementContext instanceof CursorAvailable &&
sqlStatementContext instanceof CursorDefinitionAware) {
+ setUpCursorDefinition(sqlStatementContext);
+ }
ShardingSphereDatabase database =
ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
if (!database.isComplete()) {
throw new RuleNotExistedException();
@@ -119,6 +125,13 @@ public final class PreviewDistSQLBackendHandler extends
QueryableRALBackendHandl
return
executionUnits.stream().map(this::buildRow).collect(Collectors.toList());
}
+ private void setUpCursorDefinition(final SQLStatementContext<?>
sqlStatementContext) {
+ String cursorName = ((CursorAvailable)
sqlStatementContext).getCursorName().getIdentifier().getValue().toLowerCase();
+ CursorStatementContext cursorStatementContext =
connectionSession.getCursorDefinitions().get(cursorName);
+ Preconditions.checkArgument(null != cursorStatementContext, "Cursor %s
does not exist.", cursorName);
+ ((CursorDefinitionAware)
sqlStatementContext).setUpCursorDefinition(cursorStatementContext);
+ }
+
private List<Object> buildRow(final ExecutionUnit unit) {
return Arrays.asList(unit.getDataSourceName(),
unit.getSqlUnit().getSql());
}