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;
+    }
 }

Reply via email to