schema null error

This commit is contained in:
yanhuqing
2020-08-07 16:04:08 +08:00
parent 32c99550f9
commit 4a86b7519a
4 changed files with 27 additions and 14 deletions
@@ -13,6 +13,7 @@ import com.actiontech.dble.backend.mysql.nio.handler.query.impl.join.JoinHandler
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.join.NotInHandler;
import com.actiontech.dble.backend.mysql.nio.handler.util.CallBackHandler;
import com.actiontech.dble.config.ErrorCode;
import com.actiontech.dble.config.model.SchemaConfig;
import com.actiontech.dble.plan.common.exception.MySQLOutPutException;
import com.actiontech.dble.plan.common.item.Item;
import com.actiontech.dble.plan.common.item.Item.ItemType;
@@ -61,12 +62,19 @@ class JoinNodeHandlerBuilder extends BaseHandlerBuilder {
pdVisitor.visit();
sql = pdVisitor.getSql().toString();
}
SchemaConfig schemaConfig;
String schemaName = this.session.getSource().getSchema();
if (schemaName != null) {
schemaConfig = schemaConfigMap.get(schemaName);
} else {
schemaConfig = schemaConfigMap.entrySet().iterator().next().getValue(); //random schemaConfig
}
RouteResultsetNode[] rrssArray;
// maybe some node is view
if (sql == null) {
rrssArray = mergeBuilder.construct().getNodes();
rrssArray = mergeBuilder.construct(schemaConfig).getNodes();
} else {
rrssArray = mergeBuilder.constructByStatement(sql, node.getAst()).getNodes();
rrssArray = mergeBuilder.constructByStatement(sql, node.getAst(), schemaConfig).getNodes();
}
this.needCommon = mergeBuilder.getNeedCommonFlag();
buildMergeHandler(node, rrssArray);
@@ -27,6 +27,7 @@ import java.util.HashMap;
import java.util.Map;
public class MergeBuilder {
private boolean needCommonFlag;
private PlanNode node;
private NonBlockingSession session;
@@ -47,19 +48,19 @@ public class MergeBuilder {
* @return RouteResultset
* @throws SQLException SQLException
*/
public RouteResultset construct() throws SQLException {
public RouteResultset construct(SchemaConfig schemaConfig) throws SQLException {
pdVisitor.visit();
String sql = pdVisitor.getSql().toString();
return constructByQuery(sql);
return constructByQuery(sql, schemaConfig);
}
public RouteResultset constructByQuery(String sql) throws SQLException {
public RouteResultset constructByQuery(String sql, SchemaConfig schemaConfig) throws SQLException {
SQLStatementParser parser = new MySqlStatementParser(sql);
SQLSelectStatement select = (SQLSelectStatement) parser.parseStatement();
return constructByStatement(sql, select);
return constructByStatement(sql, select, schemaConfig);
}
public RouteResultset constructByStatement(String sql, SQLSelectStatement select) throws SQLException {
public RouteResultset constructByStatement(String sql, SQLSelectStatement select, SchemaConfig schemaConfig) throws SQLException {
ServerSchemaStatVisitor visitor = new ServerSchemaStatVisitor();
DruidSingleUnitSelectParser druidParser = new DruidSingleUnitSelectParser();
@@ -72,7 +73,7 @@ public class MergeBuilder {
}
}
druidParser.setSchemaMap(tableConfigMap);
return RouterUtil.routeFromParserComplex(druidParser, tableConfigMap, rrs, select, sql, pool, visitor, session.getSource(), node);
return RouterUtil.routeFromParserComplex(schemaConfig, druidParser, tableConfigMap, rrs, select, sql, pool, visitor, session.getSource(), node);
}
@@ -5,9 +5,11 @@
package com.actiontech.dble.backend.mysql.nio.handler.builder;
import com.actiontech.dble.DbleServer;
import com.actiontech.dble.backend.mysql.nio.handler.builder.sqlvisitor.PushDownVisitor;
import com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler;
import com.actiontech.dble.config.ErrorCode;
import com.actiontech.dble.config.model.SchemaConfig;
import com.actiontech.dble.config.model.TableConfig;
import com.actiontech.dble.config.model.TableConfig.TableTypeEnum;
import com.actiontech.dble.plan.common.exception.MySQLOutPutException;
@@ -52,12 +54,13 @@ class TableNodeHandlerBuilder extends BaseHandlerBuilder {
pdVisitor.visit();
sql = pdVisitor.getSql().toString();
}
SchemaConfig schemaConfig = DbleServer.getInstance().getConfig().getSchemas().get(node.getSchema());
RouteResultsetNode[] rrssArray;
// maybe some node is view
if (sql == null) {
rrssArray = mergeBuilder.construct().getNodes();
rrssArray = mergeBuilder.construct(schemaConfig).getNodes();
} else {
rrssArray = mergeBuilder.constructByStatement(sql, node.getAst()).getNodes();
rrssArray = mergeBuilder.constructByStatement(sql, node.getAst(), schemaConfig).getNodes();
}
this.needCommon = mergeBuilder.getNeedCommonFlag();
buildMergeHandler(node, rrssArray);
@@ -75,10 +78,11 @@ class TableNodeHandlerBuilder extends BaseHandlerBuilder {
throw new MySQLOutPutException(ErrorCode.ER_QUERYHANDLER, "", "unexpected exception!");
List<RouteResultsetNode> rrssList = new ArrayList<>();
MergeBuilder mergeBuilder = new MergeBuilder(session, node, needCommon, pdVisitor);
SchemaConfig schemaConfig = DbleServer.getInstance().getConfig().getSchemas().get(node.getSchema());
if (tableConfig == null || tableConfig.getTableType() == TableTypeEnum.TYPE_GLOBAL_TABLE) {
for (Item filter : filters) {
node.setWhereFilter(filter);
RouteResultsetNode[] rrssArray = mergeBuilder.construct().getNodes();
RouteResultsetNode[] rrssArray = mergeBuilder.construct(schemaConfig).getNodes();
rrssList.addAll(Arrays.asList(rrssArray));
}
if (filters.size() == 1) {
@@ -89,7 +93,7 @@ class TableNodeHandlerBuilder extends BaseHandlerBuilder {
for (Item filter : filters) {
node.setWhereFilter(filter);
pdVisitor.visit();
RouteResultsetNode[] rrssArray = mergeBuilder.construct().getNodes();
RouteResultsetNode[] rrssArray = mergeBuilder.construct(schemaConfig).getNodes();
rrssList.addAll(Arrays.asList(rrssArray));
}
if (tryGlobal) {
@@ -124,10 +124,10 @@ public final class RouterUtil {
}
public static RouteResultset routeFromParserComplex(DruidParser druidParser, Map<String, SchemaConfig> schemaMap, RouteResultset rrs, SQLStatement statement,
public static RouteResultset routeFromParserComplex(SchemaConfig schemaConfig, DruidParser druidParser, Map<String, SchemaConfig> schemaMap, RouteResultset rrs, SQLStatement statement,
String originSql, LayerCachePool cachePool, ServerSchemaStatVisitor visitor,
ServerConnection sc, PlanNode node) throws SQLException {
druidParser.parser(null, rrs, statement, originSql, cachePool, visitor, sc);
druidParser.parser(schemaConfig, rrs, statement, originSql, cachePool, visitor, sc);
if (rrs.isFinishedExecute()) {
return null;
}