@@ -9,6 +9,7 @@ defmodule Ecto.Adapters.SQLite3.Connection do
9
9
alias Ecto.Migration.Reference
10
10
alias Ecto.Migration.Table
11
11
alias Ecto.Query.BooleanExpr
12
+ alias Ecto.Query.ByExpr
12
13
alias Ecto.Query.JoinExpr
13
14
alias Ecto.Query.QueryExpr
14
15
alias Ecto.Query.WithExpr
@@ -844,16 +845,16 @@ defmodule Ecto.Adapters.SQLite3.Connection do
844
845
def handle_call ( fun , _arity ) , do: { :fun , Atom . to_string ( fun ) }
845
846
846
847
defp distinct ( nil , _sources , _query ) , do: [ ]
847
- defp distinct ( % QueryExpr { expr: true } , _sources , _query ) , do: "DISTINCT "
848
- defp distinct ( % QueryExpr { expr: false } , _sources , _query ) , do: [ ]
848
+ defp distinct ( % ByExpr { expr: true } , _sources , _query ) , do: "DISTINCT "
849
+ defp distinct ( % ByExpr { expr: false } , _sources , _query ) , do: [ ]
849
850
850
- defp distinct ( % QueryExpr { expr: exprs } , _sources , query ) when is_list ( exprs ) do
851
+ defp distinct ( % ByExpr { expr: exprs } , _sources , query ) when is_list ( exprs ) do
851
852
raise Ecto.QueryError ,
852
853
query: query ,
853
854
message: "DISTINCT with multiple columns is not supported by SQLite3"
854
855
end
855
856
856
- def select ( % { select: % { fields: fields } , distinct: distinct } = query , sources ) do
857
+ defp select ( % { select: % { fields: fields } , distinct: distinct } = query , sources ) do
857
858
[
858
859
"SELECT " ,
859
860
distinct ( distinct , sources , query ) | select_fields ( fields , sources , query )
@@ -1065,8 +1066,8 @@ defmodule Ecto.Adapters.SQLite3.Connection do
1065
1066
def group_by ( % { group_bys: group_bys } = query , sources ) do
1066
1067
[
1067
1068
" GROUP BY "
1068
- | intersperse_map ( group_bys , ", " , fn % QueryExpr { expr: expression } ->
1069
- intersperse_map ( expression , ", " , & expr ( & 1 , sources , query ) )
1069
+ | intersperse_map ( group_bys , ", " , fn % ByExpr { expr: expression } ->
1070
+ intersperse_map ( expression , ", " , & top_level_expr ( & 1 , sources , query ) )
1070
1071
end )
1071
1072
]
1072
1073
end
@@ -1110,7 +1111,7 @@ defmodule Ecto.Adapters.SQLite3.Connection do
1110
1111
end
1111
1112
1112
1113
defp order_by_expr ( { dir , expression } , sources , query ) do
1113
- str = expr ( expression , sources , query )
1114
+ str = top_level_expr ( expression , sources , query )
1114
1115
1115
1116
case dir do
1116
1117
:asc ->
@@ -1219,6 +1220,21 @@ defmodule Ecto.Adapters.SQLite3.Connection do
1219
1220
[ ?( , expr ( expression , sources , query ) , ?) ]
1220
1221
end
1221
1222
1223
+ defp top_level_expr ( % Ecto.SubQuery { query: query } , sources , parent_query ) do
1224
+ combinations =
1225
+ Enum . map ( query . combinations , fn { type , combination_query } ->
1226
+ { type , put_in ( combination_query . aliases [ @ parent_as ] , { parent_query , sources } ) }
1227
+ end )
1228
+
1229
+ query = put_in ( query . combinations , combinations )
1230
+ query = put_in ( query . aliases [ @ parent_as ] , { parent_query , sources } )
1231
+ [ all ( query , subquery_as_prefix ( sources ) ) ]
1232
+ end
1233
+
1234
+ defp top_level_expr ( other , sources , parent_query ) do
1235
+ expr ( other , sources , parent_query )
1236
+ end
1237
+
1222
1238
##
1223
1239
## Expression generation
1224
1240
##
0 commit comments