@@ -1736,7 +1736,16 @@ class TSelectCore: public IRealSource {
1736
1736
return nullptr ;
1737
1737
}
1738
1738
1739
- return Y (" let" , label, BuildSortSpec (OrderBy, label, false , AssumeSorted));
1739
+ auto sorted = BuildSortSpec (OrderBy, label, false , AssumeSorted);
1740
+ if (ExtraSortColumns.empty ()) {
1741
+ return Y (" let" , label, sorted);
1742
+ }
1743
+ auto body = Y ();
1744
+ for (const auto & [column, _] : ExtraSortColumns) {
1745
+ body = L (body, Y (" let" , " row" , Y (" RemoveMember" , " row" , Q (column))));
1746
+ }
1747
+ body = L (body, Y (" let" , " res" , " row" ));
1748
+ return Y (" let" , label, Y (" OrderedMap" , sorted, BuildLambda (Pos, Y (" row" ), body, " res" )));
1740
1749
}
1741
1750
1742
1751
TNodePtr BuildCleanupColumns (TContext& ctx, const TString& label) override {
@@ -1801,6 +1810,31 @@ class TSelectCore: public IRealSource {
1801
1810
}
1802
1811
return Source->AddColumn (ctx, column);
1803
1812
}
1813
+
1814
+ if (OrderByInit && !Distinct && !GroupBy) {
1815
+ bool reliable = column.IsReliable ();
1816
+ column.SetAsNotReliable ();
1817
+ auto maybeExist = IRealSource::AddColumn (ctx, column);
1818
+ if (reliable) {
1819
+ column.ResetAsReliable ();
1820
+ }
1821
+ if (maybeExist && maybeExist.GetRef ()) {
1822
+ return true ;
1823
+ }
1824
+
1825
+ auto maybeSourceExist = Source->AddColumn (ctx, column);
1826
+ if (!maybeSourceExist.Defined ()) {
1827
+ return maybeSourceExist;
1828
+ }
1829
+
1830
+ // order by references column which is missing in projection, but may exists in source
1831
+ const auto columnName = column.GetColumnName ();
1832
+ if (columnName) {
1833
+ ExtraSortColumns.emplace (*columnName, TNodePtr (&column));
1834
+ }
1835
+ return true ;
1836
+ }
1837
+
1804
1838
return IRealSource::AddColumn (ctx, column);
1805
1839
}
1806
1840
@@ -2139,6 +2173,17 @@ class TSelectCore: public IRealSource {
2139
2173
++column;
2140
2174
++isNamedColumn;
2141
2175
}
2176
+
2177
+ for (const auto & [columnName, column]: ExtraSortColumns) {
2178
+ auto body = Y ();
2179
+ if (haveCompositeTerms) {
2180
+ body = L (body, Y (" let" , " row" , Y (" Apply" , " addCompositTerms" , " row" )));
2181
+ }
2182
+ body = L (body, Y (" let" , " res" , column));
2183
+ TPosition pos = column->GetPos ();
2184
+ auto projectItem = Y (" SqlProjectItem" , " projectCoreType" , BuildQuotedAtom (pos, columnName), BuildLambda (pos, Y (" row" ), body, " res" ));
2185
+ sqlProjectArgs = L (sqlProjectArgs, projectItem);
2186
+ }
2142
2187
}
2143
2188
2144
2189
auto block (Y (Y (" let" , " projectCoreType" , Y (" TypeOf" , " core" ))));
@@ -2199,6 +2244,7 @@ class TSelectCore: public IRealSource {
2199
2244
const bool SelectStream;
2200
2245
const TWriteSettings Settings;
2201
2246
const TColumnsSets UniqueSets, DistinctSets;
2247
+ TMap<TString, TNodePtr> ExtraSortColumns;
2202
2248
};
2203
2249
2204
2250
class TProcessSource : public IRealSource {
0 commit comments