@@ -52,8 +52,10 @@ func replaceIdxSortHelper(ctx *sql.Context, scope *plan.Scope, node sql.Node, so
5252 if hasOverlapping (sfExprs , mysqlRanges ) {
5353 return n , transform .SameTree , nil
5454 }
55+
56+ isReverse := sortNode .SortFields [0 ].Order == sql .Descending
5557 // if the lookup does not need any reversing, do nothing
56- if sortNode . SortFields [ 0 ]. Order != sql . Descending {
58+ if ( isReverse && lookup . IsReverse ) || ( ! isReverse && ! lookup . IsReverse ) {
5759 return n , transform .NewTree , nil
5860 }
5961
@@ -67,7 +69,7 @@ func replaceIdxSortHelper(ctx *sql.Context, scope *plan.Scope, node sql.Node, so
6769 lookup .IsPointLookup ,
6870 lookup .IsEmptyRange ,
6971 lookup .IsSpatialLookup ,
70- true ,
72+ isReverse ,
7173 )
7274 newIdxTbl , err := plan .NewStaticIndexedAccessForTableNode (ctx , n .TableNode , lookup )
7375 if err != nil {
@@ -158,7 +160,8 @@ func replaceIdxSortHelper(ctx *sql.Context, scope *plan.Scope, node sql.Node, so
158160 if sortNode == nil {
159161 continue
160162 }
161- sortFields := sortNode .SortFields
163+ sortFields := make ([]sql.SortField , len (sortNode .SortFields ))
164+ sameSortFields := true
162165 for i , sortField := range sortNode .SortFields {
163166 col , sameExpr , _ := transform .Expr (sortField .Column , func (e sql.Expression ) (sql.Expression , transform.TreeIdentity , error ) {
164167 if gt , ok := e .(* expression.GetField ); ok {
@@ -168,7 +171,10 @@ func replaceIdxSortHelper(ctx *sql.Context, scope *plan.Scope, node sql.Node, so
168171 }
169172 return e , transform .SameTree , nil
170173 })
171- if ! sameExpr {
174+ if sameExpr {
175+ sortFields [i ] = sortField
176+ } else {
177+ sameSortFields = false
172178 col2 , _ := col .(sql.Expression2 )
173179 sortFields [i ] = sql.SortField {
174180 Column : col ,
@@ -178,10 +184,12 @@ func replaceIdxSortHelper(ctx *sql.Context, scope *plan.Scope, node sql.Node, so
178184 }
179185 }
180186 }
181- newSort := sortNode .WithSortFields (sortFields )
182- // The sort node is used to find table aliases and we need to get the table aliases inside the SubqueryAlias
183- newSort .Child = c .Child
184- newChildren [i ], same , err = replaceIdxSortHelper (ctx , scope , child , newSort )
187+ if ! sameSortFields {
188+ // The Sort node is used to find table aliases, but table aliases can't be found inside SubqueryAlias
189+ // nodes, so we need to construct a new Sort node with the SubqueryAlias's child
190+ newSort := plan .NewSort (sortFields , c .Child )
191+ newChildren [i ], same , err = replaceIdxSortHelper (ctx , scope , child , newSort )
192+ }
185193 case * plan.JoinNode :
186194 // It's (probably) not possible to have Sort as child of Join without Subquery/SubqueryAlias,
187195 // and in the case where there is a Subq/SQA it's taken care of through finalizeSubqueries
0 commit comments