use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.
the class ExplainSQLHandler method onExecute.
@Override
@SneakyThrows
protected Future<Void> onExecute(SQLRequest<MySqlExplainStatement> request, MycatDataContext dataContext, Response response) {
MySqlExplainStatement explainAst = request.getAst();
explainAst.accept0(new MySqlASTVisitorAdapter() {
@Override
public boolean visit(SQLExprTableSource x) {
if (x.getSchema() == null) {
x.setSchema(dataContext.getDefaultSchema());
}
return super.visit(x);
}
});
if (explainAst.isDescribe()) {
SQLName tableName = explainAst.getTableName();
if (tableName instanceof SQLIdentifierExpr && dataContext.getDefaultSchema() != null) {
explainAst.setTableName(new SQLPropertyExpr(new SQLIdentifierExpr(dataContext.getDefaultSchema()), ((SQLIdentifierExpr) tableName).getName()));
}
return response.proxySelectToPrototype(explainAst.toUnformattedString(), Collections.emptyList());
}
SQLStatement statement = request.getAst().getStatement();
boolean forUpdate = false;
if (statement instanceof SQLSelectStatement) {
forUpdate = ((SQLSelectStatement) explainAst.getStatement()).getSelect().getFirstQueryBlock().isForUpdate();
}
ResultSetBuilder builder = ResultSetBuilder.create().addColumnInfo("plan", JDBCType.VARCHAR);
try {
HackRouter hackRouter = new HackRouter(statement, dataContext);
if (hackRouter.analyse()) {
Pair<String, String> plan = hackRouter.getPlan();
builder.addObjectRowPayload(Arrays.asList("targetName: " + plan.getKey() + " sql: " + plan.getValue()));
} else {
List<SQLCommentHint> hints = explainAst.getHints();
if (hints != null) {
statement.setHeadHints(hints);
}
DrdsSqlWithParams drdsSqlWithParams = DrdsRunnerHelper.preParse(statement, dataContext.getDefaultSchema());
Plan plan;
if (statement instanceof SQLInsertStatement || statement instanceof SQLUpdateStatement || statement instanceof SQLDeleteStatement) {
plan = UpdateSQLHandler.getPlan(drdsSqlWithParams);
} else {
plan = DrdsRunnerHelper.getPlan(drdsSqlWithParams);
}
List<String> explain = plan.explain(dataContext, drdsSqlWithParams, true);
for (String s1 : explain) {
builder.addObjectRowPayload(Arrays.asList(s1));
}
}
} catch (Throwable th) {
LOGGER.error("", th);
builder.addObjectRowPayload(Arrays.asList(th.toString()));
}
return response.sendResultSet(RowIterable.create(builder.build()));
}
use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.
the class ShardingJoinRBOMegreTest method parse.
public static Explain parse(String sql) {
DrdsSqlCompiler drds = getDrds();
DrdsSqlWithParams drdsSqlWithParams = DrdsRunnerHelper.preParse(sql, null);
OptimizationContext optimizationContext = new OptimizationContext();
MycatRel dispatch = drds.dispatch(optimizationContext, drdsSqlWithParams);
Plan plan = new PlanImpl(dispatch, DrdsExecutorCompiler.getCodeExecuterContext(optimizationContext.relNodeContext.getConstantMap(), dispatch, false), drdsSqlWithParams.getAliasList());
return new Explain(plan, drdsSqlWithParams);
}
use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.
the class ExecutorProviderImpl method prepare.
@Override
public PrepareExecutor prepare(Plan plan) {
CodeExecuterContext codeExecuterContext = plan.getCodeExecuterContext();
PrepareExecutor bindable = codeExecuterContext.bindable;
if (bindable != null)
return bindable;
try {
return codeExecuterContext.bindable = PrepareExecutor.of((newMycatDataContext, mycatRowMetaData) -> {
DrdsSqlWithParams drdsSql = newMycatDataContext.getDrdsSql();
CalciteCompiler mycatCalciteCompiler = new CalciteCompiler();
PhysicalPlan factory = mycatCalciteCompiler.convert(plan.getMycatRel());
factory = fixCast(factory);
RexConverter rexConverter = mycatCalciteCompiler.getRexConverter();
Map<Integer, IndexedParameterLinkFunction> indexedMap = rexConverter.getIndexedParameterLinkFunctionMap();
List<Object> params = drdsSql.getParams();
if (!indexedMap.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
Object o = params.get(i);
IndexedParameterLinkFunction indexedParameterLinkFunction = indexedMap.get(i);
if (indexedParameterLinkFunction != null) {
BindVariable base = (BindVariable) indexedParameterLinkFunction.getBase();
base.setObject(o);
}
}
}
List<SessionVariable> sessionMap = rexConverter.getSessionVariableFunctionMap();
for (SessionVariable sessionVariable : sessionMap) {
sessionVariable.setSession(newMycatDataContext.getContext());
}
AsyncMycatDataContextImpl.SqlMycatDataContextImpl sqlMycatDataContext = new AsyncMycatDataContextImpl.SqlMycatDataContextImpl(newMycatDataContext.getContext(), plan.getCodeExecuterContext(), drdsSql);
RootContext rootContext = new RootContext(sqlMycatDataContext);
Observable<VectorSchemaRoot> schemaRootObservable = factory.execute(rootContext);
return PrepareExecutor.ArrowObservable.of(mycatRowMetaData, schemaRootObservable);
}, getArrayBindable(codeExecuterContext));
} catch (Exception exception) {
LOGGER.error("", exception);
}
return null;
}
use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.
the class UpdateSQLHandler method executeUpdate.
public static Future<Void> executeUpdate(DrdsSqlWithParams drdsSqlWithParams, MycatDataContext dataContext, Response receiver, String schemaName) {
Plan plan = getPlan(drdsSqlWithParams);
PlanImplementor planImplementor = DrdsRunnerHelper.getPlanImplementor(dataContext, receiver, drdsSqlWithParams);
return DrdsRunnerHelper.impl(plan, planImplementor);
}
use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.
the class UpdateSQLHandler method getPlan.
@Nullable
public static Plan getPlan(DrdsSqlWithParams drdsSqlWithParams) {
UpdatePlanCache updatePlanCache = MetaClusterCurrent.wrapper(UpdatePlanCache.class);
Plan plan = updatePlanCache.computeIfAbsent(drdsSqlWithParams.getParameterizedSQL(), s -> {
DrdsSqlCompiler drdsRunner = MetaClusterCurrent.wrapper(DrdsSqlCompiler.class);
OptimizationContext optimizationContext = new OptimizationContext();
MycatRel dispatch = drdsRunner.dispatch(optimizationContext, drdsSqlWithParams);
return DrdsExecutorCompiler.convertToExecuter(dispatch);
});
return plan;
}
Aggregations