diff options
author | Roman Udovichenko <rvu@ydb.tech> | 2024-11-10 12:25:12 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-10 12:25:12 +0300 |
commit | 838cda799634345b7a99ce534f659e10c8938da3 (patch) | |
tree | 4b739fe20632a8c6b7154d417f3eea5e625fb395 | |
parent | 13fb53dc2bb07a662a202470b3982fc2c2f5d53a (diff) | |
download | ydb-838cda799634345b7a99ce534f659e10c8938da3.tar.gz |
Fix `TMultiConstraintNode(): requirement Items_.size() failed` error (#11417)
6 files changed, 73 insertions, 8 deletions
diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_datasink_constraints.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_datasink_constraints.cpp index 4d80264abd6..e2d04afe64c 100644 --- a/ydb/library/yql/providers/yt/provider/yql_yt_datasink_constraints.cpp +++ b/ydb/library/yql/providers/yt/provider/yql_yt_datasink_constraints.cpp @@ -128,28 +128,30 @@ private: lambdaNdx = OutLambdaNdx; } + bool emptyInput = false; const auto filter = NYql::HasSetting(op.Settings().Ref(), EYtSettingType::Ordered) ? [](const std::string_view& name) { return TEmptyConstraintNode::Name() == name || TUniqueConstraintNode::Name() == name || TDistinctConstraintNode::Name() == name || TSortedConstraintNode::Name() == name; }: [](const std::string_view& name) { return TEmptyConstraintNode::Name() == name || TUniqueConstraintNode::Name() == name || TDistinctConstraintNode::Name() == name; }; TConstraintNode::TListType argConstraints; if (op.Input().Size() > 1) { TMultiConstraintNode::TMapType multiItems; - bool allEmpty = true; + emptyInput = true; for (ui32 index = 0; index < op.Input().Size(); ++index) { auto section = op.Input().Item(index); if (!section.Ref().GetConstraint<TEmptyConstraintNode>()) { multiItems.push_back(std::make_pair(index, section.Ref().GetConstraintSet())); multiItems.back().second.FilterConstraints(filter); - allEmpty = false; + emptyInput = false; } } if (!multiItems.empty()) { argConstraints.push_back(ctx.MakeConstraint<TMultiConstraintNode>(std::move(multiItems))); - } else if (allEmpty) { + } else if (emptyInput) { argConstraints.push_back(ctx.MakeConstraint<TEmptyConstraintNode>()); } } else { auto set = op.Input().Item(0).Ref().GetConstraintSet(); + emptyInput = nullptr != set.GetConstraint<TEmptyConstraintNode>(); set.FilterConstraints(filter); argConstraints = set.GetAllConstraints(); if (singleLambda) { @@ -197,10 +199,8 @@ private: } SetResultConstraint(input, *input->Child(OutLambdaNdx), op.Output(), ctx); - if (op.Input().Size() == 1) { - if (auto empty = op.Input().Item(0).Ref().GetConstraint<TEmptyConstraintNode>()) { - input->AddConstraint(empty); - } + if (emptyInput) { + input->AddConstraint(ctx.MakeConstraint<TEmptyConstraintNode>()); } return TStatus::Ok; diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_datasource_constraints.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_datasource_constraints.cpp index 66bd28873fd..37f0c758b72 100644 --- a/ydb/library/yql/providers/yt/provider/yql_yt_datasource_constraints.cpp +++ b/ydb/library/yql/providers/yt/provider/yql_yt_datasource_constraints.cpp @@ -165,13 +165,19 @@ public: input.Ptr()->CopyConstraints(section.Ref()); } else { TMultiConstraintNode::TMapType multiItems; + bool allEmpty = true; for (ui32 index = 0; index < read.Input().Size(); ++index) { auto section = read.Input().Item(index); if (!section.Ref().GetConstraint<TEmptyConstraintNode>()) { multiItems.push_back(std::make_pair(index, section.Ref().GetConstraintSet())); + allEmpty = false; } } - input.Ptr()->AddConstraint(ctx.MakeConstraint<TMultiConstraintNode>(std::move(multiItems))); + if (!multiItems.empty()) { + input.Ptr()->AddConstraint(ctx.MakeConstraint<TMultiConstraintNode>(std::move(multiItems))); + } else if (allEmpty) { + input.Ptr()->AddConstraint(ctx.MakeConstraint<TEmptyConstraintNode>()); + } } return TStatus::Ok; } diff --git a/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json index ab92f28fec4..a4e5fea4d9b 100644 --- a/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json @@ -2549,6 +2549,28 @@ } ], "test.test[produce-reduce_lambda_presort_twin_list-default.txt-Results]": [], + "test.test[produce-reduce_multi_in-empty-Analyze]": [ + { + "checksum": "9ca09e642e32d555ae193ebb53450aa7", + "size": 5061, + "uri": "https://{canondata_backend}/1937492/a3be8907a794dd8afc1b0615834f797b64dd9927/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Analyze_/plan.txt" + } + ], + "test.test[produce-reduce_multi_in-empty-Debug]": [ + { + "checksum": "5ee56492dc75920918834c1591b2d875", + "size": 2287, + "uri": "https://{canondata_backend}/1937492/a3be8907a794dd8afc1b0615834f797b64dd9927/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Debug_/opt.yql_patched" + } + ], + "test.test[produce-reduce_multi_in-empty-Plan]": [ + { + "checksum": "9ca09e642e32d555ae193ebb53450aa7", + "size": 5061, + "uri": "https://{canondata_backend}/1937492/a3be8907a794dd8afc1b0615834f797b64dd9927/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Plan_/plan.txt" + } + ], + "test.test[produce-reduce_multi_in-empty-Results]": [], "test.test[produce-reduce_multi_in_keytuple_difftype--Analyze]": [ { "checksum": "f60d354ca933908da1ef3fdfbf613ddc", diff --git a/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json index faf17f1d367..b220a64afba 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json @@ -2533,6 +2533,20 @@ "uri": "https://{canondata_backend}/1809005/7e4dc59583cad760822faf30fa4695e365329148/resource.tar.gz#test.test_produce-reduce_lambda-default.txt-Plan_/plan.txt" } ], + "test.test[produce-reduce_multi_in-empty-Debug]": [ + { + "checksum": "81ca9a9b5818c411daa1c3ceeb35c10d", + "size": 1546, + "uri": "https://{canondata_backend}/1777230/dd70c380673122cd500d799c70016541eabd320a/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Debug_/opt.yql_patched" + } + ], + "test.test[produce-reduce_multi_in-empty-Plan]": [ + { + "checksum": "c6fc2ac654b52d444b9a39e91a5f4421", + "size": 2870, + "uri": "https://{canondata_backend}/1777230/dd70c380673122cd500d799c70016541eabd320a/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Plan_/plan.txt" + } + ], "test.test[produce-reduce_multi_in_sampling--Debug]": [ { "checksum": "6bdbfe3d776ee5a778da5e6c1d80827a", diff --git a/ydb/library/yql/tests/sql/suites/produce/reduce_multi_in-empty.cfg b/ydb/library/yql/tests/sql/suites/produce/reduce_multi_in-empty.cfg new file mode 100644 index 00000000000..ce36bb43371 --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/produce/reduce_multi_in-empty.cfg @@ -0,0 +1,2 @@ +in Input empty.txt +res result.txt diff --git a/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json index 01724867b16..daca745c15e 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json @@ -2675,6 +2675,27 @@ "uri": "https://{canondata_backend}/1689644/a1e3734b9bd90d7ee8a597f60d142b79a8980665/resource.tar.gz#test.test_produce-reduce_lambda_presort_twin_list-default.txt-Results_/results.txt" } ], + "test.test[produce-reduce_multi_in-empty-Debug]": [ + { + "checksum": "c7995250466d47dd34cb816ac34cfee9", + "size": 1477, + "uri": "https://{canondata_backend}/1903280/c00a60b19ed912e070196b77ab74860276ef193c/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Debug_/opt.yql" + } + ], + "test.test[produce-reduce_multi_in-empty-Plan]": [ + { + "checksum": "71b7793dbfeb8423224c943ea3994cd6", + "size": 2870, + "uri": "https://{canondata_backend}/1903280/c00a60b19ed912e070196b77ab74860276ef193c/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Plan_/plan.txt" + } + ], + "test.test[produce-reduce_multi_in-empty-Results]": [ + { + "checksum": "2004d4c4c75a57ebaaffb58738db4ec0", + "size": 1133, + "uri": "https://{canondata_backend}/1903280/c00a60b19ed912e070196b77ab74860276ef193c/resource.tar.gz#test.test_produce-reduce_multi_in-empty-Results_/results.txt" + } + ], "test.test[produce-reduce_multi_in_keytuple_difftype--Debug]": [ { "checksum": "7926309a068a6f63f3ec9f62c715dc41", |