Search in sources :

Example 6 with Plan

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()));
}
Also used : MySqlExplainStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExplainStatement) MySqlASTVisitorAdapter(com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter) ResultSetBuilder(io.mycat.beans.mycat.ResultSetBuilder) SQLName(com.alibaba.druid.sql.ast.SQLName) SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLPropertyExpr(com.alibaba.druid.sql.ast.expr.SQLPropertyExpr) Plan(io.mycat.calcite.spm.Plan) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) HackRouter(io.mycat.prototypeserver.mysql.HackRouter) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) SQLCommentHint(com.alibaba.druid.sql.ast.SQLCommentHint) SneakyThrows(lombok.SneakyThrows)

Example 7 with Plan

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);
}
Also used : DrdsSqlCompiler(io.mycat.DrdsSqlCompiler) MycatRel(io.mycat.calcite.MycatRel) OptimizationContext(io.mycat.calcite.rewriter.OptimizationContext) Plan(io.mycat.calcite.spm.Plan) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) PlanImpl(io.mycat.calcite.spm.PlanImpl)

Example 8 with Plan

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;
}
Also used : ResultSetBuilder(io.mycat.beans.mycat.ResultSetBuilder) SneakyThrows(lombok.SneakyThrows) NewMycatDataContext(org.apache.calcite.runtime.NewMycatDataContext) LoggerFactory(org.slf4j.LoggerFactory) SessionVariable(io.ordinate.engine.function.bind.SessionVariable) CalciteCompiler(io.ordinate.engine.builder.CalciteCompiler) Utilities(org.apache.calcite.runtime.Utilities) Observable(io.reactivex.rxjava3.core.Observable) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) Map(java.util.Map) RowBaseIterator(io.mycat.api.collector.RowBaseIterator) EnumerableInterpretable(org.apache.calcite.adapter.enumerable.EnumerableInterpretable) CalciteSystemProperty(org.apache.calcite.config.CalciteSystemProperty) IClassBodyEvaluator(org.codehaus.commons.compiler.IClassBodyEvaluator) FieldVector(org.apache.arrow.vector.FieldVector) Logger(org.slf4j.Logger) PhysicalPlan(io.ordinate.engine.physicalplan.PhysicalPlan) io.mycat.calcite(io.mycat.calcite) VectorSchemaRoot(org.apache.arrow.vector.VectorSchemaRoot) RexConverter(io.ordinate.engine.builder.RexConverter) Enumerable(org.apache.calcite.linq4j.Enumerable) BindVariable(io.ordinate.engine.function.bind.BindVariable) RootContext(io.ordinate.engine.record.RootContext) ArrayBindable(org.apache.calcite.runtime.ArrayBindable) List(java.util.List) AsyncMycatDataContextImpl(io.mycat.AsyncMycatDataContextImpl) CompilerFactoryFactory(org.codehaus.commons.compiler.CompilerFactoryFactory) StringReader(java.io.StringReader) MysqlPayloadObject(io.mycat.api.collector.MysqlPayloadObject) IndexedParameterLinkFunction(io.ordinate.engine.function.bind.IndexedParameterLinkFunction) MycatDataContext(io.mycat.MycatDataContext) NotNull(org.jetbrains.annotations.NotNull) ICompilerFactory(org.codehaus.commons.compiler.ICompilerFactory) Plan(io.mycat.calcite.spm.Plan) PhysicalPlan(io.ordinate.engine.physicalplan.PhysicalPlan) CalciteCompiler(io.ordinate.engine.builder.CalciteCompiler) AsyncMycatDataContextImpl(io.mycat.AsyncMycatDataContextImpl) SessionVariable(io.ordinate.engine.function.bind.SessionVariable) Observable(io.reactivex.rxjava3.core.Observable) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) RootContext(io.ordinate.engine.record.RootContext) RexConverter(io.ordinate.engine.builder.RexConverter) List(java.util.List) MysqlPayloadObject(io.mycat.api.collector.MysqlPayloadObject) BindVariable(io.ordinate.engine.function.bind.BindVariable) Map(java.util.Map) IndexedParameterLinkFunction(io.ordinate.engine.function.bind.IndexedParameterLinkFunction)

Example 9 with Plan

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);
}
Also used : Plan(io.mycat.calcite.spm.Plan) PlanImplementor(io.mycat.calcite.plan.PlanImplementor)

Example 10 with Plan

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;
}
Also used : MycatRel(io.mycat.calcite.MycatRel) OptimizationContext(io.mycat.calcite.rewriter.OptimizationContext) UpdatePlanCache(io.mycat.calcite.spm.UpdatePlanCache) Plan(io.mycat.calcite.spm.Plan) Nullable(org.jetbrains.annotations.Nullable)

Aggregations

Plan (io.mycat.calcite.spm.Plan)16 MycatRel (io.mycat.calcite.MycatRel)9 OptimizationContext (io.mycat.calcite.rewriter.OptimizationContext)9 DrdsSqlWithParams (io.mycat.DrdsSqlWithParams)7 PlanImpl (io.mycat.calcite.spm.PlanImpl)7 DrdsSqlCompiler (io.mycat.DrdsSqlCompiler)4 MysqlPayloadObject (io.mycat.api.collector.MysqlPayloadObject)4 SneakyThrows (lombok.SneakyThrows)4 XaSqlConnection (cn.mycat.vertx.xa.XaSqlConnection)3 SQLInsertStatement (com.alibaba.druid.sql.ast.statement.SQLInsertStatement)3 io.mycat (io.mycat)3 ExecutorProvider (io.mycat.calcite.ExecutorProvider)3 PrepareExecutor (io.mycat.calcite.PrepareExecutor)3 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)2 AsyncMycatDataContextImpl (io.mycat.AsyncMycatDataContextImpl)2 RowBaseIterator (io.mycat.api.collector.RowBaseIterator)2 ResultSetBuilder (io.mycat.beans.mycat.ResultSetBuilder)2 MycatInsertRel (io.mycat.calcite.physical.MycatInsertRel)2 MycatUpdateRel (io.mycat.calcite.physical.MycatUpdateRel)2 PlanImplementor (io.mycat.calcite.plan.PlanImplementor)2