@@ -447,8 +447,28 @@ defmodule Ecto.Query.SubqueryTest do
447447 subquery = from p in Post , select: % { id: p . id , title: p . title }
448448 query = normalize ( from ( p in subquery ( subquery ) , select: map ( p , [ :title ] ) ) )
449449 assert [ { { :. , _ , [ { :& , [ ] , [ 0 ] } , :title ] } , [ ] , [ ] } ] = query . select . fields
450+ end
451+
452+ test "struct/2 with subqueries" do
453+ subquery = from p in Post , select: p
454+ query = normalize ( from ( p in subquery ( subquery ) , select: struct ( p , [ :id , :title ] ) ) )
455+ assert query . select . fields == [
456+ { { :. , [ writable: :always ] , [ { :& , [ ] , [ 0 ] } , :id ] } , [ ] , [ ] } ,
457+ { { :. , [ writable: :always ] , [ { :& , [ ] , [ 0 ] } , :title ] } , [ ] , [ ] }
458+ ]
459+
460+ subquery = from p in Post , select: p
461+ query = normalize ( from ( c in Comment , join: p in subquery ( subquery ) , on: true , select: struct ( p , [ :title ] ) ) )
462+ assert query . select . fields == [ { { :. , [ writable: :always ] , [ { :& , [ ] , [ 1 ] } , :title ] } , [ ] , [ ] } ]
463+
464+ subquery = from p in Post , select: struct ( p , [ :id , :title , :text ] )
465+ query = normalize ( from ( p in subquery ( subquery ) , select: struct ( p , [ :id , :title ] ) ) )
466+ assert query . select . fields == [
467+ { { :. , [ writable: :always ] , [ { :& , [ ] , [ 0 ] } , :id ] } , [ ] , [ ] } ,
468+ { { :. , [ writable: :always ] , [ { :& , [ ] , [ 0 ] } , :title ] } , [ ] , [ ] }
469+ ]
450470
451- assert_raise Ecto.QueryError , ~r/ it is not possible to return a struct subset of a subquery/ , fn ->
471+ assert_raise Ecto.QueryError , ~r/ it is not possible to return a struct subset of a subquery that does not return a schema struct / , fn ->
452472 subquery = from p in Post , select: % { id: p . id , title: p . title }
453473 normalize ( from ( p in subquery ( subquery ) , select: struct ( p , [ :title ] ) ) )
454474 end
0 commit comments