@@ -143,6 +143,15 @@ defmodule Ecto.Query.PlannerTest do
143143 end
144144 end
145145
146+ defmodule Barebone do
147+ use Ecto.Schema
148+
149+ @ primary_key false
150+ schema "barebone" do
151+ field :num , :integer
152+ end
153+ end
154+
146155 defp plan ( query , operation \\ :all ) do
147156 { query , params , key } = Planner . plan ( query , operation , Ecto.TestAdapter )
148157 { cast_params , dump_params } = Enum . unzip ( params )
@@ -939,6 +948,16 @@ defmodule Ecto.Query.PlannerTest do
939948 ]
940949 end
941950
951+ test "plan: tuple source with fragment" do
952+ { query , cast_params , dump_params , cache_key } =
953+ plan ( from { fragment ( "? as num" , ^ 0 ) , Barebone } )
954+
955+ assert { { { :fragment , [ ] , _ } , Barebone , nil } } = query . sources
956+ assert cast_params == [ 0 ]
957+ assert dump_params == [ 0 ]
958+ assert [ :all , { :from , { { :fragment , _ , _ } , Barebone , _ , _ } , [ ] } ] = cache_key
959+ end
960+
942961 describe "plan: CTEs" do
943962 test "with uncacheable queries are uncacheable" do
944963 { _ , _ , _ , cache } =
@@ -2572,6 +2591,16 @@ defmodule Ecto.Query.PlannerTest do
25722591 end
25732592 end
25742593
2594+ test "normalize: tuple source with fragment" do
2595+ { query , _ , _ , select } =
2596+ normalize_with_params ( from { fragment ( "? as num" , ^ 0 ) , Barebone } )
2597+
2598+ % { from: { _ , { :source , { { :fragment , _ , _ } , Barebone } , nil , types } } } = select
2599+ assert types == [ num: :integer ]
2600+ assert { { :fragment , _ , _ } , Barebone } = query . from . source
2601+ assert query . select . fields == [ { { :. , [ writable: :always ] , [ { :& , [ ] , [ 0 ] } , :num ] } , [ ] , [ ] } ]
2602+ end
2603+
25752604 describe "normalize: subqueries in boolean expressions" do
25762605 test "replaces {:subquery, index} with an Ecto.SubQuery struct" do
25772606 subquery = from ( p in Post , select: p . visits )
0 commit comments