Skip to content

Commit 9c507f9

Browse files
pavelvelikhovPavel Velikhov
andauthored
[NEW RBO] Fixed order by support (#29359)
Co-authored-by: Pavel Velikhov <[email protected]>
1 parent e8ea1aa commit 9c507f9

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

ydb/core/kqp/opt/rbo/kqp_rewrite_select.cpp

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,24 @@ TExprNode::TPtr ReplacePgOps(TExprNode::TPtr input, TExprContext &ctx) {
339339
}
340340
}
341341

342+
TVector<TInfoUnit> GetSortDependencies(TExprNode::TPtr sort) {
343+
TVector<TInfoUnit> result;
344+
345+
for (auto sortItem : sort->Child(1)->Children()) {
346+
auto sortLambda = sortItem->Child(1);
347+
TVector<TInfoUnit> lambdaMembers;
348+
349+
GetAllMembers(sortLambda, lambdaMembers);
350+
for (auto m: lambdaMembers) {
351+
if (std::find(result.begin(), result.end(), m) == result.end()) {
352+
result.push_back(m);
353+
}
354+
}
355+
}
356+
357+
return result;
358+
}
359+
342360
TExprNode::TPtr BuildSort(TExprNode::TPtr input, TExprNode::TPtr sort, TExprContext &ctx) {
343361
TVector<TExprNode::TPtr> sortElements;
344362

@@ -807,6 +825,7 @@ TExprNode::TPtr RewriteSelect(const TExprNode::TPtr &node, TExprContext &ctx, co
807825

808826
finalColumnOrder.clear();
809827
THashMap<TString, TExprNode::TPtr> aggProjectionMap;
828+
TVector<TString> finalProjection;
810829

811830
for (auto resultItem : result->Child(1)->Children()) {
812831
auto column = resultItem->Child(0);
@@ -904,6 +923,25 @@ TExprNode::TPtr RewriteSelect(const TExprNode::TPtr &node, TExprContext &ctx, co
904923
.Lambda(lambda)
905924
.Done().Ptr());
906925
// clang-format on
926+
927+
finalProjection.push_back(columnName);
928+
}
929+
930+
// Sort clause may contain extra columns that we need to keep in the projection in order for sort to work
931+
auto sort = GetSetting(setItem->Tail(), "sort");
932+
if (sort) {
933+
auto sortDependencies = GetSortDependencies(sort);
934+
for (auto iu : sortDependencies) {
935+
if (std::find(finalProjection.begin(), finalProjection.end(), iu.GetFullName()) == finalProjection.end()) {
936+
// clang-format off
937+
resultElements.push_back(Build<TKqpOpMapElementRename>(ctx, node->Pos())
938+
.Input(resultExpr)
939+
.Variable().Value(iu.GetFullName()).Build()
940+
.From().Value(iu.GetFullName()).Build()
941+
.Done().Ptr());
942+
// clang-format on
943+
}
944+
}
907945
}
908946

909947
// clang-format off
@@ -916,11 +954,34 @@ TExprNode::TPtr RewriteSelect(const TExprNode::TPtr &node, TExprContext &ctx, co
916954
.Value("true")
917955
.Build()
918956
.Done().Ptr();
919-
// clang-format onto
957+
// clang-format on
920958

921-
auto sort = GetSetting(setItem->Tail(), "sort");
922959
if (sort) {
923960
setItemPtr = BuildSort(setItemPtr, sort, ctx);
961+
962+
TVector<TExprNode::TPtr> projectElements;
963+
964+
for (auto c : finalProjection) {
965+
// clang-format off
966+
projectElements.push_back(Build<TKqpOpMapElementRename>(ctx, node->Pos())
967+
.Input(setItemPtr)
968+
.Variable().Value(c).Build()
969+
.From().Value(c).Build()
970+
.Done().Ptr());
971+
// clang-format on
972+
}
973+
974+
// clang-format off
975+
setItemPtr = Build<TKqpOpMap>(ctx, node->Pos())
976+
.Input(setItemPtr)
977+
.MapElements()
978+
.Add(projectElements)
979+
.Build()
980+
.Project()
981+
.Value("true")
982+
.Build()
983+
.Done().Ptr();
984+
// clang-format on
924985
}
925986

926987
setItemsResults.push_back(setItemPtr);

ydb/core/kqp/ut/rbo/kqp_rbo_pg_ut.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,18 @@ Y_UNIT_TEST_SUITE(KqpRboPg) {
846846
}
847847

848848
std::vector<std::string> queries = {
849+
R"(
850+
--!syntax_pg
851+
SET TablePathPrefix = "/Root/";
852+
SELECT a FROM t1
853+
ORDER BY a+1 DESC;
854+
)",
855+
R"(
856+
--!syntax_pg
857+
SET TablePathPrefix = "/Root/";
858+
SELECT a FROM t1
859+
ORDER BY a+1 DESC, c ASC;
860+
)",
849861
R"(
850862
--!syntax_pg
851863
SET TablePathPrefix = "/Root/";
@@ -869,6 +881,8 @@ Y_UNIT_TEST_SUITE(KqpRboPg) {
869881
};
870882

871883
std::vector<std::string> results = {
884+
R"([["3"];["2"];["1"];["0"]])",
885+
R"([["3"];["2"];["1"];["0"]])",
872886
R"([["3"];["2"];["1"];["0"]])",
873887
R"([["3";"4"];["2";"3"];["1";"2"];["0";"1"]])",
874888
R"([["3"];["2"];["2"];["1"];["1"];["0"];["0"]])"

0 commit comments

Comments
 (0)