@@ -149,7 +149,7 @@ if Code.ensure_loaded?(Tds) do
149149
150150 @ parent_as __MODULE__
151151 alias Ecto.Query
152- alias Ecto.Query . { BooleanExpr , JoinExpr , QueryExpr , WithExpr }
152+ alias Ecto.Query . { BooleanExpr , ByExpr , JoinExpr , QueryExpr , WithExpr }
153153
154154 @ impl true
155155 def all ( query , as_prefix \\ [ ] ) do
@@ -390,10 +390,10 @@ if Code.ensure_loaded?(Tds) do
390390 end
391391
392392 defp distinct ( nil , _sources , _query ) , do: [ ]
393- defp distinct ( % QueryExpr { expr: true } , _sources , _query ) , do: "DISTINCT "
394- defp distinct ( % QueryExpr { expr: false } , _sources , _query ) , do: [ ]
393+ defp distinct ( % ByExpr { expr: true } , _sources , _query ) , do: "DISTINCT "
394+ defp distinct ( % ByExpr { expr: false } , _sources , _query ) , do: [ ]
395395
396- defp distinct ( % QueryExpr { expr: exprs } , _sources , query ) when is_list ( exprs ) do
396+ defp distinct ( % ByExpr { expr: exprs } , _sources , query ) when is_list ( exprs ) do
397397 error! (
398398 query ,
399399 "DISTINCT with multiple columns is not supported by MsSQL. " <>
@@ -584,8 +584,8 @@ if Code.ensure_loaded?(Tds) do
584584 defp group_by ( % { group_bys: group_bys } = query , sources ) do
585585 [
586586 " GROUP BY "
587- | Enum . map_intersperse ( group_bys , ", " , fn % QueryExpr { expr: expr } ->
588- Enum . map_intersperse ( expr , ", " , & expr ( & 1 , sources , query ) )
587+ | Enum . map_intersperse ( group_bys , ", " , fn % ByExpr { expr: expr } ->
588+ Enum . map_intersperse ( expr , ", " , & top_level_expr ( & 1 , sources , query ) )
589589 end )
590590 ]
591591 end
@@ -595,14 +595,14 @@ if Code.ensure_loaded?(Tds) do
595595 defp order_by ( % { order_bys: order_bys } = query , sources ) do
596596 [
597597 " ORDER BY "
598- | Enum . map_intersperse ( order_bys , ", " , fn % QueryExpr { expr: expr } ->
598+ | Enum . map_intersperse ( order_bys , ", " , fn % ByExpr { expr: expr } ->
599599 Enum . map_intersperse ( expr , ", " , & order_by_expr ( & 1 , sources , query ) )
600600 end )
601601 ]
602602 end
603603
604604 defp order_by_expr ( { dir , expr } , sources , query ) do
605- str = expr ( expr , sources , query )
605+ str = top_level_expr ( expr , sources , query )
606606
607607 case dir do
608608 :asc -> str
@@ -708,6 +708,21 @@ if Code.ensure_loaded?(Tds) do
708708 [ ?( , expr ( expr , sources , query ) , ?) ]
709709 end
710710
711+ defp top_level_expr ( % Ecto.SubQuery { query: query } , sources , parent_query ) do
712+ combinations =
713+ Enum . map ( query . combinations , fn { type , combination_query } ->
714+ { type , put_in ( combination_query . aliases [ @ parent_as ] , { parent_query , sources } ) }
715+ end )
716+
717+ query = put_in ( query . combinations , combinations )
718+ query = put_in ( query . aliases [ @ parent_as ] , { parent_query , sources } )
719+ [ all ( query , subquery_as_prefix ( sources ) ) ]
720+ end
721+
722+ defp top_level_expr ( other , sources , parent_query ) do
723+ expr ( other , sources , parent_query )
724+ end
725+
711726 # :^ - represents parameter ix is index number
712727 defp expr ( { :^ , [ ] , [ idx ] } , _sources , _query ) do
713728 "@#{ idx + 1 } "
@@ -787,15 +802,8 @@ if Code.ensure_loaded?(Tds) do
787802 error! ( query , "Tds adapter does not support aggregate filters" )
788803 end
789804
790- defp expr ( % Ecto.SubQuery { query: query } , sources , parent_query ) do
791- combinations =
792- Enum . map ( query . combinations , fn { type , combination_query } ->
793- { type , put_in ( combination_query . aliases [ @ parent_as ] , { parent_query , sources } ) }
794- end )
795-
796- query = put_in ( query . combinations , combinations )
797- query = put_in ( query . aliases [ @ parent_as ] , { parent_query , sources } )
798- [ ?( , all ( query , subquery_as_prefix ( sources ) ) , ?) ]
805+ defp expr ( % Ecto.SubQuery { } = subquery , sources , parent_query ) do
806+ [ ?( , top_level_expr ( subquery , sources , parent_query ) , ?) ]
799807 end
800808
801809 defp expr ( { :fragment , _ , [ kw ] } , _sources , query ) when is_list ( kw ) or tuple_size ( kw ) == 3 do
@@ -873,7 +881,13 @@ if Code.ensure_loaded?(Tds) do
873881 [ op_to_binary ( left , sources , query ) , op | op_to_binary ( right , sources , query ) ]
874882
875883 { :fun , fun } ->
876- [ fun , ?( , modifier , Enum . map_intersperse ( args , ", " , & expr ( & 1 , sources , query ) ) , ?) ]
884+ [
885+ fun ,
886+ ?( ,
887+ modifier ,
888+ Enum . map_intersperse ( args , ", " , & top_level_expr ( & 1 , sources , query ) ) ,
889+ ?)
890+ ]
877891 end
878892 end
879893
0 commit comments