Skip to content

Commit 83f4fbe

Browse files
pavelvelikhovPavel Velikhov
and
Pavel Velikhov
authored
New RBO prototype (#13704)
Co-authored-by: Pavel Velikhov <pavelvelikhov@localhost.localdomain>
1 parent b2f257e commit 83f4fbe

20 files changed

+2716
-6
lines changed

ydb/core/kqp/compile_service/kqp_compile_actor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ void ApplyServiceConfig(TKikimrConfiguration& kqpConfig, const TTableServiceConf
654654
kqpConfig.EnableSpilling = serviceConfig.GetEnableQueryServiceSpilling();
655655
kqpConfig.EnableSnapshotIsolationRW = serviceConfig.GetEnableSnapshotIsolationRW();
656656
kqpConfig.AllowMultiBroadcasts = serviceConfig.GetAllowMultiBroadcasts();
657+
kqpConfig.EnableNewRBO = serviceConfig.GetEnableNewRBO();
657658

658659
if (const auto limit = serviceConfig.GetResourceManager().GetMkqlHeavyProgramMemoryLimit()) {
659660
kqpConfig._KqpYqlCombinerMemoryLimit = std::max(1_GB, limit - (limit >> 2U));

ydb/core/kqp/compile_service/kqp_compile_service.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,8 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
318318

319319
bool enableSnapshotIsolationRW = TableServiceConfig.GetEnableSnapshotIsolationRW();
320320

321+
bool enableNewRBO = TableServiceConfig.GetEnableNewRBO();
322+
321323
TableServiceConfig.Swap(event.MutableConfig()->MutableTableServiceConfig());
322324
LOG_INFO(*TlsActivationContext, NKikimrServices::KQP_COMPILE_SERVICE, "Updated config");
323325

@@ -350,8 +352,9 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
350352
TableServiceConfig.GetEnableSnapshotIsolationRW() != enableSnapshotIsolationRW ||
351353
TableServiceConfig.GetAllowMultiBroadcasts() != allowMultiBroadcasts ||
352354
TableServiceConfig.GetDefaultEnableShuffleElimination() != defaultEnableShuffleElimination ||
353-
TableServiceConfig.GetEnableQueryServiceSpilling() != enableSpilling
354-
) {
355+
TableServiceConfig.GetEnableQueryServiceSpilling() != enableSpilling ||
356+
TableServiceConfig.GetEnableNewRBO() != enableNewRBO)
357+
{
355358

356359
QueryCache->Clear();
357360

ydb/core/kqp/expr_nodes/kqp_expr_nodes.json

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,82 @@
724724
{"Index": 2, "Name": "IssueCode", "Type": "TCoAtom"},
725725
{"Index": 3, "Name": "Message", "Type": "TExprBase"}
726726
]
727+
},
728+
{
729+
"Name": "TKqpOpRead",
730+
"Base": "TCallable",
731+
"Match": {"Type": "Callable", "Name": "KqpOpRead"},
732+
"Children": [
733+
{"Index": 0, "Name": "Table", "Type": "TKqpTable"},
734+
{"Index": 1, "Name": "Alias", "Type": "TCoAtom"},
735+
{"Index": 2, "Name": "Columns", "Type": "TCoAtomList"}
736+
]
737+
},
738+
{
739+
"Name": "TKqpOpEmptySource",
740+
"Base": "TCallable",
741+
"Match": {"Type": "Callable", "Name": "KqpOpEmptySource"}
742+
},
743+
{
744+
"Name": "TKqpOpMapElement",
745+
"Base": "TCallable",
746+
"Match": {"Type": "Callable", "Name": "KqpOpMapElement"},
747+
"Children": [
748+
{"Index": 0, "Name": "Input", "Type": "TExprBase"},
749+
{"Index": 1, "Name": "Variable", "Type": "TCoAtom"},
750+
{"Index": 2, "Name": "Lambda", "Type": "TCoLambda"}
751+
]
752+
},
753+
{
754+
"Name": "TKqpOpElementList",
755+
"ListBase" : "TKqpOpMapElement"
756+
},
757+
{
758+
"Name": "TKqpOpMap",
759+
"Base": "TCallable",
760+
"Match": {"Type": "Callable", "Name": "KqpOpMap"},
761+
"Children": [
762+
{"Index": 0, "Name": "Input", "Type": "TExprBase"},
763+
{"Index": 1, "Name": "MapElements", "Type": "TKqpOpElementList"}
764+
]
765+
},
766+
{
767+
"Name": "TKqpOpFilter",
768+
"Base": "TCallable",
769+
"Match": {"Type": "Callable", "Name": "KqpOpFilter"},
770+
"Children": [
771+
{"Index": 0, "Name": "Input", "Type": "TExprBase"},
772+
{"Index": 1, "Name": "Lambda", "Type": "TCoLambda"}
773+
]
774+
},
775+
{
776+
"Name": "TKqpOpJoin",
777+
"Base": "TCallable",
778+
"Match": {"Type": "Callable", "Name": "KqpOpJoin"},
779+
"Children": [
780+
{"Index": 0, "Name": "LeftInput", "Type": "TExprBase"},
781+
{"Index": 1, "Name": "RightInput", "Type": "TExprBase"},
782+
{"Index": 2, "Name": "JoinKind", "Type":"TCoAtom"},
783+
{"Index": 3, "Name": "JoinKeys", "Type": "TDqJoinKeyTupleList"}
784+
]
785+
},
786+
{
787+
"Name": "TKqpOpLimit",
788+
"Base": "TCallable",
789+
"Match": {"Type": "Callable", "Name": "KqpOpLimit"},
790+
"Children": [
791+
{"Index": 0, "Name": "Input", "Type": "TExprBase"},
792+
{"Index": 1, "Name": "Count", "Type": "TExprBase"}
793+
]
794+
},
795+
{
796+
"Name": "TKqpOpRoot",
797+
"Base": "TCallable",
798+
"Match" : {"Type": "Callable", "Name": "KqpOpRoot"},
799+
"Children": [
800+
{"Index": 0, "Name": "Input", "Type": "TExprBase"}
801+
]
727802
}
803+
728804
]
729805
}

ydb/core/kqp/host/kqp_host.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,9 +1371,12 @@ class TKqpHost : public IKqpHost {
13711371

13721372
YQL_ENSURE(queryAst->Root);
13731373
TExprNode::TPtr queryExpr;
1374+
YQL_CLOG(INFO, CoreDq) << "Good place to weld in";
1375+
13741376
if (!CompileExpr(*queryAst->Root, queryExpr, ctx, ModuleResolver.get(), nullptr)) {
13751377
return result;
13761378
}
1379+
YQL_CLOG(INFO, CoreDq) << "Compiled query:\n" << KqpExprToPrettyString(*queryExpr, ctx);
13771380

13781381
if (!CheckIsBatch(queryExpr, ctx)) {
13791382
return result;
@@ -1532,8 +1535,14 @@ class TKqpHost : public IKqpHost {
15321535
return nullptr;
15331536
}
15341537

1535-
return MakeIntrusive<TAsyncPrepareYqlResult>(compileResult.QueryExpr.Get(), ctx, *YqlTransformer, SessionCtx->QueryPtr(),
1536-
query.Text, sqlVersion, TransformCtx, compileResult.KeepInCache, compileResult.CommandTagName, DataProvidersFinalizer);
1538+
if (SessionCtx->Config().EnableNewRBO) {
1539+
return MakeIntrusive<TAsyncPrepareYqlResult>(compileResult.QueryExpr.Get(), ctx, *YqlTransformerNewRBO, SessionCtx->QueryPtr(),
1540+
query.Text, sqlVersion, TransformCtx, compileResult.KeepInCache, compileResult.CommandTagName, DataProvidersFinalizer);
1541+
}
1542+
else {
1543+
return MakeIntrusive<TAsyncPrepareYqlResult>(compileResult.QueryExpr.Get(), ctx, *YqlTransformer, SessionCtx->QueryPtr(),
1544+
query.Text, sqlVersion, TransformCtx, compileResult.KeepInCache, compileResult.CommandTagName, DataProvidersFinalizer);
1545+
}
15371546
}
15381547

15391548
IAsyncQueryResultPtr PrepareDataQueryAstInternal(const TKqpQueryRef& queryAst, const TPrepareSettings& settings,
@@ -1933,6 +1942,8 @@ class TKqpHost : public IKqpHost {
19331942
const auto &yqlCoreOptFlags = SessionCtx->ConfigPtr()->YqlCoreOptimizerFlags;
19341943
TypesCtx->OptimizerFlags.insert(yqlCoreOptFlags.begin(), yqlCoreOptFlags.end());
19351944

1945+
TypesCtx->IgnoreExpandPg = SessionCtx->ConfigPtr()->EnableNewRBO;
1946+
19361947
bool addExternalDataSources = queryType == EKikimrQueryType::Script || queryType == EKikimrQueryType::Query
19371948
|| (queryType == EKikimrQueryType::YqlScript || queryType == EKikimrQueryType::YqlScriptStreaming) && AppData()->FeatureFlags.GetEnableExternalDataSources();
19381949
if (addExternalDataSources && FederatedQuerySetup) {
@@ -2007,6 +2018,23 @@ class TKqpHost : public IKqpHost {
20072018
.AddRun(&NullProgressWriter)
20082019
.Build();
20092020

2021+
YqlTransformerNewRBO = TTransformationPipeline(TypesCtx)
2022+
.AddServiceTransformers()
2023+
.Add(TLogExprTransformer::Sync("YqlTransformerNewRBO", NYql::NLog::EComponent::ProviderKqp,
2024+
NYql::NLog::ELevel::TRACE), "LogYqlTransformNewRBO")
2025+
.AddPreTypeAnnotation()
2026+
.AddExpressionEvaluation(*FuncRegistry)
2027+
.Add(new TFailExpressionEvaluation(queryType), "FailExpressionEvaluation")
2028+
.AddIOAnnotation(false)
2029+
.AddTypeAnnotation()
2030+
.Add(TCollectParametersTransformer::Sync(SessionCtx->QueryPtr()), "CollectParameters")
2031+
.AddPostTypeAnnotation()
2032+
.AddOptimization(true, false, TIssuesIds::CORE_OPTIMIZATION)
2033+
.Add(GetDqIntegrationPeepholeTransformer(true, TypesCtx), "DqIntegrationPeephole")
2034+
.Add(TLogExprTransformer::Sync("Optimized expr"), "LogExpr")
2035+
.AddRun(&NullProgressWriter)
2036+
.Build();
2037+
20102038
DataQueryAstTransformer = TTransformationPipeline(TypesCtx)
20112039
.AddServiceTransformers()
20122040
.AddIntentDeterminationTransformer()
@@ -2041,6 +2069,7 @@ class TKqpHost : public IKqpHost {
20412069
SetupSession(queryType);
20422070

20432071
YqlTransformer->Rewind();
2072+
YqlTransformerNewRBO->Rewind();
20442073

20452074
ResultProviderConfig->FillSettings = FillSettings;
20462075
ResultProviderConfig->CommittedResults.clear();
@@ -2077,6 +2106,7 @@ class TKqpHost : public IKqpHost {
20772106
IDataProvider::TFillSettings FillSettings;
20782107
TIntrusivePtr<TResultProviderConfig> ResultProviderConfig;
20792108
TAutoPtr<IGraphTransformer> YqlTransformer;
2109+
TAutoPtr<IGraphTransformer> YqlTransformerNewRBO;
20802110
TAutoPtr<IGraphTransformer> DataQueryAstTransformer;
20812111
TExprNode::TPtr FakeWorld;
20822112
TKqpAsyncResultBase<IKqpHost::TQueryResult>::TAsyncTransformStatusCallback DataProvidersFinalizer;

ydb/core/kqp/host/kqp_runner.cpp

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <ydb/core/kqp/opt/kqp_statistics_transformer.h>
88
#include <ydb/core/kqp/opt/kqp_column_statistics_requester.h>
99
#include <ydb/core/kqp/opt/kqp_constant_folding_transformer.h>
10+
#include <ydb/core/kqp/opt/kqp_new_rbo_transformer.h>
1011
#include <ydb/core/kqp/opt/logical/kqp_opt_cbo.h>
1112

1213

@@ -20,11 +21,13 @@
2021
#include <yql/essentials/core/type_ann/type_ann_expr.h>
2122
#include <yql/essentials/utils/log/log.h>
2223
#include <yql/essentials/core/services/yql_transform_pipeline.h>
24+
#include <yql/essentials/core/yql_graph_transformer.h>
2325
#include <yql/essentials/core/yql_opt_proposed_by_data.h>
2426

2527
#include <ydb/library/yql/providers/dq/common/yql_dq_settings.h>
2628
#include <ydb/library/yql/providers/dq/opt/dqs_opt.h>
2729

30+
2831
#include <util/generic/is_in.h>
2932

3033
namespace NKikimr {
@@ -153,6 +156,8 @@ class TKqpRunner : public IKqpRunner {
153156
YQL_ENSURE(TransformCtx->QueryCtx->Type == EKikimrQueryType::Dml);
154157
YQL_ENSURE(TMaybeNode<TKiDataQueryBlocks>(query));
155158

159+
YQL_CLOG(DEBUG, CoreDq) << "Before any rewrites: " << KqpExprToPrettyString(*query, ctx);
160+
156161
return PrepareQueryInternal(cluster, TKiDataQueryBlocks(query), ctx, settings);
157162
}
158163

@@ -192,6 +197,8 @@ class TKqpRunner : public IKqpRunner {
192197
YQL_ENSURE(IsIn({EKikimrQueryType::Query, EKikimrQueryType::Script}, TransformCtx->QueryCtx->Type));
193198
YQL_ENSURE(TMaybeNode<TKiDataQueryBlocks>(query));
194199

200+
YQL_CLOG(DEBUG, CoreDq) << "Before any rewrites: " << KqpExprToPrettyString(*query, ctx);
201+
195202
const auto dataQueryBlocks = TKiDataQueryBlocks(query);
196203

197204
if (IsOlapQuery(dataQueryBlocks)) {
@@ -267,21 +274,35 @@ class TKqpRunner : public IKqpRunner {
267274

268275
TExprNode::TPtr query = kqlQueryBlocks->Ptr();
269276
YQL_CLOG(DEBUG, ProviderKqp) << "Initial KQL query: " << KqpExprToPrettyString(*query, ctx);
277+
YQL_CLOG(DEBUG, CoreDq) << "Initial KQL query: " << KqpExprToPrettyString(*query, ctx);
278+
270279

271280
TransformCtx->Reset();
272281
BuildQueryCtx->Reset();
273282
Transformer->Rewind();
283+
NewRBOTransformer->Rewind();
274284

275285
TransformCtx->DataQueryBlocks = dataQueryBlocks;
276286

277-
return MakeIntrusive<TPrepareQueryAsyncResult>(query, *Transformer, ctx, *TransformCtx);
287+
if (Config->EnableNewRBO) {
288+
YQL_CLOG(INFO, CoreDq) << "Taking the new RBO branch";
289+
return MakeIntrusive<TPrepareQueryAsyncResult>(query, *NewRBOTransformer, ctx, *TransformCtx);
290+
//return MakeIntrusive<TPrepareQueryAsyncResult>(query, *Transformer, ctx, *TransformCtx);
291+
}
292+
else {
293+
YQL_CLOG(INFO, CoreDq) << "Taking the old RBO branch";
294+
return MakeIntrusive<TPrepareQueryAsyncResult>(query, *Transformer, ctx, *TransformCtx);
295+
}
278296
}
279297

280298
void CreateGraphTransformer(const TIntrusivePtr<TTypeAnnotationContext>& typesCtx, const TIntrusivePtr<TKikimrSessionContext>& sessionCtx,
281299
const NMiniKQL::IFunctionRegistry& funcRegistry)
282300
{
283301
auto preparedExplainTransformer = CreateKqpExplainPreparedTransformer(
284302
Gateway, Cluster, TransformCtx, &funcRegistry, *typesCtx, OptimizeCtx);
303+
304+
auto newRBOPreparedExplainTransformer = CreateKqpExplainPreparedTransformer(
305+
Gateway, Cluster, TransformCtx, &funcRegistry, *typesCtx, OptimizeCtx);
285306

286307
auto physicalOptimizePipeline = TTransformationPipeline(typesCtx)
287308
.AddServiceTransformers()
@@ -313,6 +334,28 @@ class TKqpRunner : public IKqpRunner {
313334
.Add(CreateKqpCheckPhysicalQueryTransformer(), "CheckKqlPhysicalQuery")
314335
.Build(false));
315336

337+
auto newRBOPhysicalOptimizeTransformer = CreateKqpQueryBlocksTransformer(TTransformationPipeline(typesCtx)
338+
.AddServiceTransformers()
339+
.Add(Log("NewRBOPhysicalOptimize"), "LogNewRBOPhysicalOptimize")
340+
.AddPreTypeAnnotation()
341+
//.AddExpressionEvaluation(funcRegistry)
342+
.AddIOAnnotation()
343+
.AddTypeAnnotationTransformer(CreateKqpTypeAnnotationTransformer(Cluster, sessionCtx->TablesPtr(),
344+
*typesCtx, Config))
345+
.Add(CreateKqpCheckQueryTransformer(), "CheckKqlQuery")
346+
.AddPostTypeAnnotation(/* forSubgraph */ true)
347+
//.AddCommonOptimization()
348+
349+
.Add(CreateKqpPgRewriteTransformer(OptimizeCtx, *typesCtx), "RewritePgSelect")
350+
.Add(CreateKqpNewRBOTransformer(OptimizeCtx, *typesCtx, Config), "NewRBOTransformer")
351+
352+
//.Add(CreatePhysicalDataProposalsInspector(*typesCtx), "ProvidersPhysicalOptimize")
353+
//.Add(CreateKqpFinalizingOptTransformer(OptimizeCtx), "FinalizingOptimize")
354+
//.Add(CreateKqpQueryPhasesTransformer(), "QueryPhases")
355+
//.Add(CreateKqpQueryEffectsTransformer(OptimizeCtx), "QueryEffects")
356+
//.Add(CreateKqpCheckPhysicalQueryTransformer(), "CheckKqlPhysicalQuery")
357+
.Build(false));
358+
316359
auto physicalBuildTxsTransformer = CreateKqpQueryBlocksTransformer(TTransformationPipeline(typesCtx)
317360
.AddServiceTransformers()
318361
.Add(Log("PhysicalBuildTxs"), "LogPhysicalBuildTxs")
@@ -330,6 +373,23 @@ class TKqpRunner : public IKqpRunner {
330373
"BuildPhysicalTxs")
331374
.Build(false));
332375

376+
auto newRBOPhysicalBuildTxsTransformer = CreateKqpQueryBlocksTransformer(TTransformationPipeline(typesCtx)
377+
.AddServiceTransformers()
378+
.Add(Log("PhysicalBuildTxs"), "LogPhysicalBuildTxs")
379+
.AddTypeAnnotationTransformer(CreateKqpTypeAnnotationTransformer(Cluster, sessionCtx->TablesPtr(), *typesCtx, Config))
380+
.AddPostTypeAnnotation(/* forSubgraph */ true)
381+
.Add(
382+
CreateKqpBuildTxsTransformer(
383+
OptimizeCtx,
384+
BuildQueryCtx,
385+
CreateTypeAnnotationTransformer(
386+
CreateKqpTypeAnnotationTransformer(Cluster, sessionCtx->TablesPtr(), *typesCtx, Config),
387+
*typesCtx),
388+
*typesCtx,
389+
Config),
390+
"BuildPhysicalTxs")
391+
.Build(false));
392+
333393
auto physicalBuildQueryTransformer = TTransformationPipeline(typesCtx)
334394
.AddServiceTransformers()
335395
.Add(Log("PhysicalBuildQuery"), "LogPhysicalBuildQuery")
@@ -339,6 +399,15 @@ class TKqpRunner : public IKqpRunner {
339399
.Add(CreateKqpStatisticsTransformer(OptimizeCtx, *typesCtx, Config, Pctx), "Statistics")
340400
.Build(false);
341401

402+
auto newRBOPhysicalBuildQueryTransformer = TTransformationPipeline(typesCtx)
403+
.AddServiceTransformers()
404+
.Add(Log("PhysicalBuildQuery"), "LogPhysicalBuildQuery")
405+
.AddTypeAnnotationTransformer(CreateKqpTypeAnnotationTransformer(Cluster, sessionCtx->TablesPtr(), *typesCtx, Config))
406+
.AddPostTypeAnnotation()
407+
.Add(CreateKqpBuildPhysicalQueryTransformer(OptimizeCtx, BuildQueryCtx), "BuildPhysicalQuery")
408+
.Add(CreateKqpStatisticsTransformer(OptimizeCtx, *typesCtx, Config, Pctx), "Statistics")
409+
.Build(false);
410+
342411
auto physicalPeepholeTransformer = TTransformationPipeline(typesCtx)
343412
.AddServiceTransformers()
344413
.Add(Log("PhysicalPeephole"), "LogPhysicalPeephole")
@@ -352,13 +421,50 @@ class TKqpRunner : public IKqpRunner {
352421
*typesCtx), *typesCtx, Config), "Peephole")
353422
.Build(false);
354423

424+
auto newRBOPhysicalPeepholeTransformer = TTransformationPipeline(typesCtx)
425+
.AddServiceTransformers()
426+
.Add(Log("PhysicalPeephole"), "LogPhysicalPeephole")
427+
.AddTypeAnnotationTransformer(CreateKqpTypeAnnotationTransformer(Cluster, sessionCtx->TablesPtr(), *typesCtx, Config))
428+
.AddPostTypeAnnotation()
429+
.Add(GetDqIntegrationPeepholeTransformer(false, typesCtx), "DqIntegrationPeephole")
430+
.Add(
431+
CreateKqpTxsPeepholeTransformer(
432+
CreateTypeAnnotationTransformer(
433+
CreateKqpTypeAnnotationTransformer(Cluster, sessionCtx->TablesPtr(), *typesCtx, Config),
434+
*typesCtx), *typesCtx, Config), "Peephole")
435+
.Build(false);
436+
355437
TAutoPtr<IGraphTransformer> compilePhysicalQuery(new TCompilePhysicalQueryTransformer(Cluster,
356438
*TransformCtx,
357439
*OptimizeCtx,
358440
*typesCtx,
359441
funcRegistry,
360442
Config));
361443

444+
TAutoPtr<IGraphTransformer> newRBOCompilePhysicalQuery(new TCompilePhysicalQueryTransformer(Cluster,
445+
*TransformCtx,
446+
*OptimizeCtx,
447+
*typesCtx,
448+
funcRegistry,
449+
Config));
450+
451+
NewRBOTransformer = CreateCompositeGraphTransformer(
452+
{
453+
TTransformStage{ newRBOPhysicalOptimizeTransformer, "NewRBOPhysicalOptimize", TIssuesIds::DEFAULT_ERROR },
454+
LogStage("NewRBOPhysicalOptimize"),
455+
TTransformStage{ newRBOPhysicalBuildTxsTransformer, "NewRBOPhysicalBuildTxs", TIssuesIds::DEFAULT_ERROR },
456+
LogStage("NewRBOPhysicalBuildTxs"),
457+
TTransformStage{ newRBOPhysicalBuildQueryTransformer, "NewRBOPhysicalBuildQuery", TIssuesIds::DEFAULT_ERROR },
458+
LogStage("NewRBOPhysicalBuildQuery"),
459+
TTransformStage{ CreateSaveExplainTransformerInput(*TransformCtx), "NewRBOSaveExplainTransformerInput", TIssuesIds::DEFAULT_ERROR },
460+
TTransformStage{ newRBOPhysicalPeepholeTransformer, "NewRBOPhysicalPeephole", TIssuesIds::DEFAULT_ERROR },
461+
LogStage("NewRBOPhysicalPeephole"),
462+
TTransformStage{ newRBOCompilePhysicalQuery, "CompilePhysicalQuery", TIssuesIds::DEFAULT_ERROR },
463+
TTransformStage{ newRBOPreparedExplainTransformer, "NewRBOExplainQuery", TIssuesIds::DEFAULT_ERROR }, // TODO(sk): only on stats mode or if explain-only
464+
},
465+
false
466+
);
467+
362468
Transformer = CreateCompositeGraphTransformer(
363469
{
364470
TTransformStage{ physicalOptimizeTransformer, "PhysicalOptimize", TIssuesIds::DEFAULT_ERROR },
@@ -404,6 +510,7 @@ class TKqpRunner : public IKqpRunner {
404510
TKqpProviderContext Pctx;
405511

406512
TAutoPtr<IGraphTransformer> Transformer;
513+
TAutoPtr<IGraphTransformer> NewRBOTransformer;
407514

408515
TActorSystem* ActorSystem;
409516
};

0 commit comments

Comments
 (0)