@@ -1181,7 +1181,7 @@ defmodule Ecto.Query.Planner do
11811181
11821182 defp prewalk ( { :type , _ , [ arg , type ] } , kind , query , expr , acc , adapter ) do
11831183 { arg , acc } = prewalk ( arg , kind , query , expr , acc , adapter )
1184- type = field_type! ( kind , query , expr , type )
1184+ type = field_type! ( kind , query , expr , type , true )
11851185 { % Ecto.Query.Tagged { value: arg , tag: type , type: Ecto.Type . type ( type ) } , acc }
11861186 end
11871187
@@ -1700,25 +1700,31 @@ defmodule Ecto.Query.Planner do
17001700 end
17011701 end
17021702
1703- defp field_type! ( kind , query , expr , { composite , { ix , field } } ) when is_integer ( ix ) do
1704- { composite , type! ( kind , query , expr , ix , field ) }
1703+ defp field_type! ( kind , query , expr , type , allow_virtuals? \\ false )
1704+
1705+ defp field_type! ( kind , query , expr , { composite , { ix , field } } , allow_virtuals? ) when is_integer ( ix ) do
1706+ { composite , type! ( kind , query , expr , ix , field , allow_virtuals? ) }
17051707 end
1706- defp field_type! ( kind , query , expr , { ix , field } ) when is_integer ( ix ) do
1707- type! ( kind , query , expr , ix , field )
1708+
1709+ defp field_type! ( kind , query , expr , { ix , field } , allow_virtuals? ) when is_integer ( ix ) do
1710+ type! ( kind , query , expr , ix , field , allow_virtuals? )
17081711 end
1709- defp field_type! ( _kind , _query , _expr , type ) do
1712+
1713+ defp field_type! ( _kind , _query , _expr , type , _ ) do
17101714 type
17111715 end
17121716
1713- defp type! ( _kind , _query , _expr , nil , _field ) , do: :any
1717+ defp type! ( kind , query , expr , schema , field , allow_virtuals? \\ false )
17141718
1715- defp type! ( kind , query , expr , ix , field ) when is_integer ( ix ) do
1719+ defp type! ( _kind , _query , _expr , nil , _field , _allow_virtuals? ) , do: :any
1720+
1721+ defp type! ( kind , query , expr , ix , field , allow_virtuals? ) when is_integer ( ix ) do
17161722 case get_source! ( kind , query , ix ) do
17171723 { :fragment , _ , _ } ->
17181724 :any
17191725
17201726 { _ , schema , _ } ->
1721- type! ( kind , query , expr , schema , field )
1727+ type! ( kind , query , expr , schema , field , allow_virtuals? )
17221728
17231729 % Ecto.SubQuery { select: select } ->
17241730 case subquery_type_for ( select , field ) do
@@ -1728,11 +1734,14 @@ defmodule Ecto.Query.Planner do
17281734 end
17291735 end
17301736
1731- defp type! ( kind , query , expr , schema , field ) when is_atom ( schema ) do
1737+ defp type! ( kind , query , expr , schema , field , allow_virtuals? ) when is_atom ( schema ) do
17321738 cond do
17331739 type = schema . __schema__ ( :type , field ) ->
17341740 type
17351741
1742+ type = allow_virtuals? && schema . __schema__ ( :virtual_type , field ) ->
1743+ type
1744+
17361745 Map . has_key? ( schema . __struct__ ( ) , field ) ->
17371746 error! query , expr , "field `#{ field } ` in `#{ kind } ` is a virtual field in schema #{ inspect schema } "
17381747
0 commit comments