diff options
author | udovichenko-r <rvu@ydb.tech> | 2023-02-15 18:36:07 +0300 |
---|---|---|
committer | udovichenko-r <rvu@ydb.tech> | 2023-02-15 18:36:07 +0300 |
commit | 9232b7176df551168ce9e28354c7044ef0ac8409 (patch) | |
tree | f1e35b38b240858d9ce9ed91db5546647ce260ca | |
parent | 97277c3c732822a86b3ad9f9407a8ee72176031f (diff) | |
download | ydb-9232b7176df551168ce9e28354c7044ef0ac8409.tar.gz |
[yql] Deep clone saved expr root to avoid restoring partially modified graph
-rw-r--r-- | ydb/library/yql/core/facade/yql_facade.cpp | 15 | ||||
-rw-r--r-- | ydb/library/yql/core/facade/yql_facade.h | 1 |
2 files changed, 12 insertions, 4 deletions
diff --git a/ydb/library/yql/core/facade/yql_facade.cpp b/ydb/library/yql/core/facade/yql_facade.cpp index 62167050011..d8e58e61ab1 100644 --- a/ydb/library/yql/core/facade/yql_facade.cpp +++ b/ydb/library/yql/core/facade/yql_facade.cpp @@ -605,7 +605,7 @@ TProgram::TFutureStatus TProgram::ValidateAsync(const TString& username, IOutput return NThreading::MakeFuture<TStatus>(IGraphTransformer::TStatus::Error); } - SavedExprRoot_ = ExprRoot_; + SaveExprRoot(); return openSession.Apply([this](const TFuture<void>& f) { YQL_LOG_CTX_ROOT_SESSION_SCOPE(GetSessionId()); @@ -679,6 +679,8 @@ TProgram::TFutureStatus TProgram::OptimizeAsync( if (!openSession.Initialized()) return NThreading::MakeFuture<TStatus>(IGraphTransformer::TStatus::Error); + SaveExprRoot(); + return openSession.Apply([this](const TFuture<void>& f) { YQL_LOG_CTX_ROOT_SESSION_SCOPE(GetSessionId()); try { @@ -748,7 +750,7 @@ TProgram::TFutureStatus TProgram::OptimizeAsyncWithConfig( if (!openSession.Initialized()) return NThreading::MakeFuture<TStatus>(IGraphTransformer::TStatus::Error); - SavedExprRoot_ = ExprRoot_; + SaveExprRoot(); return openSession.Apply([this](const TFuture<void>& f) { YQL_LOG_CTX_ROOT_SESSION_SCOPE(GetSessionId()); @@ -830,7 +832,7 @@ TProgram::TFutureStatus TProgram::RunAsync( return NThreading::MakeFuture<TStatus>(IGraphTransformer::TStatus::Error); } - SavedExprRoot_ = ExprRoot_; + SaveExprRoot(); return openSession.Apply([this](const TFuture<void>& f) { YQL_LOG_CTX_ROOT_SESSION_SCOPE(GetSessionId()); @@ -902,7 +904,7 @@ TProgram::TFutureStatus TProgram::RunAsyncWithConfig( return NThreading::MakeFuture<TStatus>(IGraphTransformer::TStatus::Error); } - SavedExprRoot_ = ExprRoot_; + SaveExprRoot(); return openSession.Apply([this](const TFuture<void>& f) { YQL_LOG_CTX_ROOT_SESSION_SCOPE(GetSessionId()); @@ -917,6 +919,11 @@ TProgram::TFutureStatus TProgram::RunAsyncWithConfig( }); } +void TProgram::SaveExprRoot() { + TNodeOnNodeOwnedMap deepClones; + SavedExprRoot_ = ExprCtx_->DeepCopy(*ExprRoot_, *ExprCtx_, deepClones, /*internStrings*/false, /*copyTypes*/true, /*copyResult*/false, {}); +} + TFuture<IGraphTransformer::TStatus> TProgram::AsyncTransformWithFallback(bool applyAsyncChanges) { return AsyncTransform(*Transformer_, ExprRoot_, *ExprCtx_, applyAsyncChanges).Apply([this](const TFuture<IGraphTransformer::TStatus>& res) { diff --git a/ydb/library/yql/core/facade/yql_facade.h b/ydb/library/yql/core/facade/yql_facade.h index f20516d5450..1ab1deeed20 100644 --- a/ydb/library/yql/core/facade/yql_facade.h +++ b/ydb/library/yql/core/facade/yql_facade.h @@ -341,6 +341,7 @@ private: TString TakeSessionId(); NThreading::TFuture<IGraphTransformer::TStatus> AsyncTransformWithFallback(bool applyAsyncChanges); + void SaveExprRoot(); private: const NKikimr::NMiniKQL::IFunctionRegistry* FunctionRegistry_; |