@@ -37,6 +37,18 @@ defmodule Sqlite.Ecto.Query do
37
37
end
38
38
39
39
def update_all ( query , values ) do
40
+ if query . joins != [ ] do
41
+ raise ArgumentError , "JOINS are not supported on UPDATE statements by SQLite"
42
+ end
43
+
44
+ sources = create_names ( query , :update )
45
+ { table , _name , _model } = elem ( sources , 0 )
46
+
47
+ fields = Enum . map_join ( values , ", " , fn { field , expr } ->
48
+ "#{ quote_id ( field ) } = #{ expr ( expr , sources ) } "
49
+ end )
50
+ where = where ( query . wheres , sources )
51
+ assemble [ "UPDATE" , quote_id ( table ) , "SET" , fields , where ]
40
52
end
41
53
42
54
def delete_all ( query ) do
@@ -370,15 +382,19 @@ defmodule Sqlite.Ecto.Query do
370
382
371
383
## Generic Query Helpers
372
384
373
- defp create_names ( % { sources: sources } ) do
374
- create_names ( sources , 0 , tuple_size ( sources ) ) |> List . to_tuple ( )
385
+ defp create_names ( % { sources: sources } , stmt \\ :select ) do
386
+ create_names ( sources , 0 , tuple_size ( sources ) , stmt ) |> List . to_tuple ( )
375
387
end
376
- defp create_names ( sources , pos , limit ) when pos < limit do
388
+ defp create_names ( sources , pos , limit , stmt ) when pos < limit do
377
389
{ table , model } = elem ( sources , pos )
378
- id = String . first ( table ) <> Integer . to_string ( pos )
379
- [ { table , id , model } | create_names ( sources , pos + 1 , limit ) ]
390
+ if stmt == :select do
391
+ id = String . first ( table ) <> Integer . to_string ( pos )
392
+ else
393
+ id = nil
394
+ end
395
+ [ { table , id , model } | create_names ( sources , pos + 1 , limit , stmt ) ]
380
396
end
381
- defp create_names ( _ , pos , pos ) , do: [ ]
397
+ defp create_names ( _ , pos , pos , _stmt ) , do: [ ]
382
398
383
399
defp select ( % Ecto.Query.SelectExpr { fields: fields } , distinct , sources ) do
384
400
fields = Enum . map_join ( fields , ", " , fn ( f ) ->
@@ -405,7 +421,11 @@ defmodule Sqlite.Ecto.Query do
405
421
406
422
defp expr ( { { :. , _ , [ { :& , _ , [ idx ] } , field ] } , _ , [ ] } , sources ) when is_atom ( field ) do
407
423
{ _ , name , _ } = elem ( sources , idx )
408
- "#{ name } .#{ quote_id ( field ) } "
424
+ if name do
425
+ "#{ name } .#{ quote_id ( field ) } "
426
+ else
427
+ quote_id ( field )
428
+ end
409
429
end
410
430
411
431
defp expr ( { :in , _ , [ left , right ] } , sources ) when is_list ( right ) do
0 commit comments