aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorudovichenko-r <rvu@ydb.tech>2023-02-15 18:36:07 +0300
committerudovichenko-r <rvu@ydb.tech>2023-02-15 18:36:07 +0300
commit9232b7176df551168ce9e28354c7044ef0ac8409 (patch)
treef1e35b38b240858d9ce9ed91db5546647ce260ca
parent97277c3c732822a86b3ad9f9407a8ee72176031f (diff)
downloadydb-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.cpp15
-rw-r--r--ydb/library/yql/core/facade/yql_facade.h1
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_;