@@ -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+
342360TExprNode::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);
0 commit comments