Skip to content

Commit a442e72

Browse files
author
William Wilkinson
committed
Add cross lateral join support for MyXql.
1 parent c406abe commit a442e72

File tree

3 files changed

+15
-2
lines changed

3 files changed

+15
-2
lines changed

lib/ecto/adapters/myxql/connection.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ if Code.ensure_loaded?(MyXQL) do
388388
end
389389

390390
defp join_on(:cross, true, _sources, _query), do: []
391+
defp join_on(:cross_lateral, true, _sources, _query), do: []
391392
defp join_on(_qual, expr, sources, query), do: [" ON " | expr(expr, sources, query)]
392393

393394
defp join_qual(:inner, _), do: " INNER JOIN "
@@ -397,7 +398,7 @@ if Code.ensure_loaded?(MyXQL) do
397398
defp join_qual(:right, _), do: " RIGHT OUTER JOIN "
398399
defp join_qual(:full, _), do: " FULL OUTER JOIN "
399400
defp join_qual(:cross, _), do: " CROSS JOIN "
400-
defp join_qual(qual, _), do: error!(nil, "#{qual} is not supported in the MyXQL Adapter")
401+
defp join_qual(:cross_lateral, _), do: "CROSS JOIN LATERAL "
401402

402403
defp where(%{wheres: wheres} = query, sources) do
403404
boolean(" WHERE ", wheres, sources, query)

lib/ecto/adapters/tds/connection.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ if Code.ensure_loaded?(Tds) do
526526
defp join_qual(:cross), do: "CROSS JOIN "
527527
defp join_qual(:inner_lateral), do: "CROSS APPLY "
528528
defp join_qual(:left_lateral), do: "OUTER APPLY "
529-
defp join_qual(qual), do: error!(nil, "#{qual} is not supported in the Tds Adapter")
529+
defp join_qual(:cross_lateral), do: error!(nil, "cross lateral joins are not supported in the Tds Adapter")
530530

531531
defp where(%Query{wheres: wheres} = query, sources) do
532532
boolean(" WHERE ", wheres, sources, query)

test/ecto/adapters/myxql_test.exs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,18 @@ defmodule Ecto.Adapters.MyXQLTest do
10061006
~s{WHERE ((s0.`id` > 0) AND (s0.`id` < ?))}
10071007
end
10081008

1009+
test "cross lateral join with fragment" do
1010+
query = Schema
1011+
|> join(:cross_lateral, [p], q in fragment("SELECT * FROM schema2 AS s2 WHERE s2.id = ? AND s2.field = ?", p.x, ^10))
1012+
|> select([p, q], {p.id, q.z})
1013+
|> where([p], p.id > 0 and p.id < ^100)
1014+
|> plan()
1015+
assert all(query) ==
1016+
~s{SELECT s0."id", f1."z" FROM "schema" AS s0 CROSS JOIN LATERAL } <>
1017+
~s{(SELECT * FROM schema2 AS s2 WHERE s2.id = s0."x" AND s2.field = $1) AS f1 } <>
1018+
~s{WHERE ((s0."id" > 0) AND (s0."id" < $2))}
1019+
end
1020+
10091021
test "cross join" do
10101022
query = from(p in Schema, cross_join: c in Schema2, select: {p.id, c.id}) |> plan()
10111023
assert all(query) ==

0 commit comments

Comments
 (0)