Well, see this example:
iex(1)> alias MusicDB.{Album,Track}
[MusicDB.Album, MusicDB.Track]
iex(2)> import Ecto.Query
Ecto.Query
iex(3)> album_id = 2
2
iex(4)> order_by = [asc: :duration] # atom OK for first source (Track)
[asc: :duration]
iex(5)> query = from(t in Track, [
...(5)> join: a in Album, on: t.album_id == a.id,
...(5)> select: %{
...(5)> a: a.id,
...(5)> t: t.id,
...(5)> d: t.duration
...(5)> },
...(5)> limit: 3,
...(5)> order_by: ^order_by
...(5)> ])
#Ecto.Query<from t in MusicDB.Track, join: a in MusicDB.Album,
on: t.album_id == a.id, order_by: [asc: t.duration], limit: 3,
select: %{a: a.id, t: t.id, d: t.duration}>
iex(6)> query = Ecto.Query.where(query, [_y,z], z.id == ^album_id)
#Ecto.Query<from t in MusicDB.Track, join: a in MusicDB.Album,
on: t.album_id == a.id, where: a.id == ^2, order_by: [asc: t.duration],
limit: 3, select: %{a: a.id, t: t.id, d: t.duration}>
iex(7)> Repo.all(query)
00:19:54.808 [debug] QUERY OK source="tracks" db=3.0ms
SELECT a1."id", t0."id", t0."duration" FROM "tracks" AS t0 INNER JOIN "albums" AS a1 ON t0."album_id" = a1."id" WHERE (a1."id" = $1) ORDER BY t0."duration" LIMIT 3 [2]
[%{a: 2, d: 754, t: 9}, %{a: 2, d: 774, t: 7}, %{a: 2, d: 896, t: 8}]
iex(8)>
i.e.
iex(6)> query = Ecto.Query.where(query, [_y,z], z.id == ^album_id)
So there must be something else in your code interfering with it.
In desperation I’d try
new_query = Ecto.Query.where(qr, [y, _z], y.is_active == true)
and see if that changes the error.