This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 3fcfc8e Fixes #14558, NPE occurs when preview SQL by schema.table.
(#14616)
3fcfc8e is described below
commit 3fcfc8e422b8d68b258bbaec4815b9491ed7a629
Author: yx9o <[email protected]>
AuthorDate: Sun Jan 9 11:01:26 2022 +0800
Fixes #14558, NPE occurs when preview SQL by schema.table. (#14616)
---
.../ral/advanced/PreviewDistSQLBackendHandler.java | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
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 301d0b3..9dc372d 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
@@ -19,20 +19,23 @@ package
org.apache.shardingsphere.proxy.backend.text.distsql.ral.advanced;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.StringUtils;
import
org.apache.shardingsphere.distsql.parser.statement.ral.advanced.preview.PreviewStatement;
import org.apache.shardingsphere.infra.binder.LogicSQL;
import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.type.TableAvailable;
import org.apache.shardingsphere.infra.context.kernel.KernelProcessor;
-import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
+import org.apache.shardingsphere.infra.exception.SchemaNotExistedException;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
import
org.apache.shardingsphere.proxy.backend.communication.SQLStatementSchemaHolder;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import
org.apache.shardingsphere.proxy.backend.exception.NoDatabaseSelectedException;
import
org.apache.shardingsphere.proxy.backend.exception.RuleNotExistedException;
import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
import
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
@@ -70,11 +73,11 @@ public final class PreviewDistSQLBackendHandler implements
TextProtocolBackendHa
@Override
public ResponseHeader execute() {
MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
- String defaultSchemaName = connectionSession.getDefaultSchemaName();
- String databaseType =
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(defaultSchemaName).getResource().getDatabaseType());
+ String schemaName = getSchemaName();
+ String databaseType =
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType());
Optional<SQLParserRule> sqlParserRule =
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
SQLStatement sqlStatement = new
ShardingSphereSQLParserEngine(databaseType,
sqlParserRule.get()).parse(previewStatement.getSql(), false);
- SQLStatementContext<?> sqlStatementContext =
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(),
Collections.emptyList(), sqlStatement, defaultSchemaName);
+ SQLStatementContext<?> sqlStatementContext =
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(),
Collections.emptyList(), sqlStatement, schemaName);
// TODO optimize SQLStatementSchemaHolder
if (sqlStatementContext instanceof TableAvailable) {
((TableAvailable)
sqlStatementContext).getTablesContext().getSchemaName().ifPresent(SQLStatementSchemaHolder::set);
@@ -104,4 +107,15 @@ public final class PreviewDistSQLBackendHandler implements
TextProtocolBackendHa
result.add(executionUnit.getSqlUnit().getSql());
return result;
}
+
+ private String getSchemaName() {
+ String result =
StringUtils.isNotBlank(connectionSession.getSchemaName()) ?
connectionSession.getSchemaName() : connectionSession.getDefaultSchemaName();
+ if (StringUtils.isBlank(result)) {
+ throw new NoDatabaseSelectedException();
+ }
+ if (!ProxyContext.getInstance().getAllSchemaNames().contains(result)) {
+ throw new SchemaNotExistedException(result);
+ }
+ return result;
+ }
}