aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorngc224 <ngc224@yandex-team.com>2022-08-05 18:18:44 +0300
committerngc224 <ngc224@yandex-team.com>2022-08-05 18:18:44 +0300
commit7b4f8921a24ccfcc22a3114c6b1b6222b14a836a (patch)
treeceecbb00cce2c802f8b91503a39300eaacfedcec
parent18d6e1a62a6bef20b8547089b142cc976092cbae (diff)
downloadydb-7b4f8921a24ccfcc22a3114c6b1b6222b14a836a.tar.gz
Repeat EvaluateExpressions step after view substitution
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_expr.cpp14
-rw-r--r--ydb/library/yql/core/yql_opt_proposed_by_data.cpp9
-rw-r--r--ydb/library/yql/core/yql_opt_rewrite_io.cpp3
3 files changed, 22 insertions, 4 deletions
diff --git a/ydb/library/yql/core/type_ann/type_ann_expr.cpp b/ydb/library/yql/core/type_ann/type_ann_expr.cpp
index f67d3b41200..38760e8290f 100644
--- a/ydb/library/yql/core/type_ann/type_ann_expr.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_expr.cpp
@@ -592,6 +592,20 @@ TAutoPtr<IGraphTransformer> CreateFullTypeAnnotationTransformer(
CreateConfigureTransformer(typeAnnotationContext),
"Configure",
issueCode));
+
+ // NOTE: add fake EvaluateExpression step to break infinite loop
+ // (created by Repeat on ExprEval step after RewriteIO completion)
+ transformers.push_back(TTransformStage(
+ CreateFunctorTransformer(
+ [](const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) {
+ output = input;
+ ctx.Step.Done(TExprStep::ExprEval);
+ return IGraphTransformer::TStatus::Ok;
+ }
+ ),
+ "EvaluateExpression",
+ issueCode));
+
transformers.push_back(TTransformStage(
CreateIODiscoveryTransformer(typeAnnotationContext),
"IODiscovery",
diff --git a/ydb/library/yql/core/yql_opt_proposed_by_data.cpp b/ydb/library/yql/core/yql_opt_proposed_by_data.cpp
index 23a912303fb..dcb0625c95f 100644
--- a/ydb/library/yql/core/yql_opt_proposed_by_data.cpp
+++ b/ydb/library/yql/core/yql_opt_proposed_by_data.cpp
@@ -124,9 +124,12 @@ private:
bool hasRepeats = HasRepeats;
HasRepeats = false;
if (NewRoots.empty()) {
- return hasRepeats
- ? TStatus::Repeat
- : TStatus::Ok;
+ if (hasRepeats) {
+ return TStatus::Repeat;
+ }
+
+ Finish(ctx);
+ return TStatus::Ok;
}
ChooseRoot(std::move(input), output);
diff --git a/ydb/library/yql/core/yql_opt_rewrite_io.cpp b/ydb/library/yql/core/yql_opt_rewrite_io.cpp
index 40fc5aa22d7..6c844ca829c 100644
--- a/ydb/library/yql/core/yql_opt_rewrite_io.cpp
+++ b/ydb/library/yql/core/yql_opt_rewrite_io.cpp
@@ -36,7 +36,8 @@ IGraphTransformer::TStatus RewriteIO(const TExprNode::TPtr& input, TExprNode::TP
if (
!ctx.Step.IsDone(TExprStep::DiscoveryIO) ||
- !ctx.Step.IsDone(TExprStep::ExpandApplyForLambdas)
+ !ctx.Step.IsDone(TExprStep::ExpandApplyForLambdas) ||
+ !ctx.Step.IsDone(TExprStep::ExprEval)
) {
return IGraphTransformer::TStatus(IGraphTransformer::TStatus::Repeat, true);
}