Skip to content

Commit 271b544

Browse files
authored
Maybe paren for expr inside fragment (#702)
1 parent 9192a6d commit 271b544

File tree

6 files changed

+21
-3
lines changed

6 files changed

+21
-3
lines changed

lib/ecto/adapters/myxql/connection.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ if Code.ensure_loaded?(MyXQL) do
914914
defp fragment_expr(parts, sources, query) do
915915
Enum.map(parts, fn
916916
{:raw, part} -> part
917-
{:expr, expr} -> expr(expr, sources, query)
917+
{:expr, expr} -> op_to_binary(expr, sources, query)
918918
end)
919919
|> parens_for_select()
920920
end

lib/ecto/adapters/postgres/connection.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1165,7 +1165,7 @@ if Code.ensure_loaded?(Postgrex) do
11651165
defp fragment_expr(parts, sources, query) do
11661166
Enum.map(parts, fn
11671167
{:raw, part} -> part
1168-
{:expr, expr} -> expr(expr, sources, query)
1168+
{:expr, expr} -> maybe_paren(expr, sources, query)
11691169
end)
11701170
|> parens_for_select()
11711171
end

lib/ecto/adapters/tds/connection.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ if Code.ensure_loaded?(Tds) do
10101010
defp fragment_expr(parts, sources, query) do
10111011
Enum.map(parts, fn
10121012
{:raw, part} -> part
1013-
{:expr, expr} -> expr(expr, sources, query)
1013+
{:expr, expr} -> op_to_binary(expr, sources, query)
10141014
end)
10151015
|> parens_for_select()
10161016
end

test/ecto/adapters/myxql_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,12 @@ defmodule Ecto.Adapters.MyXQLTest do
681681
assert_raise Ecto.QueryError, fn ->
682682
all(query)
683683
end
684+
685+
query = Schema |> select([r], fragment("CAST(? AS INT)", r.x and r.y)) |> plan()
686+
assert all(query) == ~s{SELECT CAST((s0.`x` AND s0.`y`) AS INT) FROM `schema` AS s0}
687+
688+
query = Schema |> select([r], fragment("CAST(? AS INT)", r.x or r.y)) |> plan()
689+
assert all(query) == ~s{SELECT CAST((s0.`x` OR s0.`y`) AS INT) FROM `schema` AS s0}
684690
end
685691

686692
test "literals" do

test/ecto/adapters/postgres_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,12 @@ defmodule Ecto.Adapters.PostgresTest do
861861
assert_raise Ecto.QueryError, fn ->
862862
all(query)
863863
end
864+
865+
query = Schema |> select([r], fragment("?::integer", r.x and r.y)) |> plan()
866+
assert all(query) == ~s{SELECT (s0."x" AND s0."y")::integer FROM "schema" AS s0}
867+
868+
query = Schema |> select([r], fragment("?::integer", r.x or r.y)) |> plan()
869+
assert all(query) == ~s{SELECT (s0."x" OR s0."y")::integer FROM "schema" AS s0}
864870
end
865871

866872
test "literals" do

test/ecto/adapters/tds_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,12 @@ defmodule Ecto.Adapters.TdsTest do
719719
fn ->
720720
all(query)
721721
end
722+
723+
query = Schema |> select([r], fragment("CAST(? AS INT)", r.x and r.y)) |> plan()
724+
assert all(query) == ~s{SELECT CAST((s0.[x] AND s0.[y]) AS INT) FROM [schema] AS s0}
725+
726+
query = Schema |> select([r], fragment("CAST(? AS INT)", r.x or r.y)) |> plan()
727+
assert all(query) == ~s{SELECT CAST((s0.[x] OR s0.[y]) AS INT) FROM [schema] AS s0}
722728
end
723729

724730
test "literals" do

0 commit comments

Comments
 (0)