diff --git a/lib/ecto/adapters/myxql/connection.ex b/lib/ecto/adapters/myxql/connection.ex index 1c7572aa7..ae378bebf 100644 --- a/lib/ecto/adapters/myxql/connection.ex +++ b/lib/ecto/adapters/myxql/connection.ex @@ -914,7 +914,7 @@ if Code.ensure_loaded?(MyXQL) do defp fragment_expr(parts, sources, query) do Enum.map(parts, fn {:raw, part} -> part - {:expr, expr} -> expr(expr, sources, query) + {:expr, expr} -> op_to_binary(expr, sources, query) end) |> parens_for_select() end diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index 983b335de..45c177cdd 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -1165,7 +1165,7 @@ if Code.ensure_loaded?(Postgrex) do defp fragment_expr(parts, sources, query) do Enum.map(parts, fn {:raw, part} -> part - {:expr, expr} -> expr(expr, sources, query) + {:expr, expr} -> maybe_paren(expr, sources, query) end) |> parens_for_select() end diff --git a/lib/ecto/adapters/tds/connection.ex b/lib/ecto/adapters/tds/connection.ex index 7d49c6b3d..c4053b765 100644 --- a/lib/ecto/adapters/tds/connection.ex +++ b/lib/ecto/adapters/tds/connection.ex @@ -1010,7 +1010,7 @@ if Code.ensure_loaded?(Tds) do defp fragment_expr(parts, sources, query) do Enum.map(parts, fn {:raw, part} -> part - {:expr, expr} -> expr(expr, sources, query) + {:expr, expr} -> op_to_binary(expr, sources, query) end) |> parens_for_select() end diff --git a/test/ecto/adapters/myxql_test.exs b/test/ecto/adapters/myxql_test.exs index 16a8e9741..34641e0d4 100644 --- a/test/ecto/adapters/myxql_test.exs +++ b/test/ecto/adapters/myxql_test.exs @@ -681,6 +681,12 @@ defmodule Ecto.Adapters.MyXQLTest do assert_raise Ecto.QueryError, fn -> all(query) end + + query = Schema |> select([r], fragment("CAST(? AS INT)", r.x and r.y)) |> plan() + assert all(query) == ~s{SELECT CAST((s0.`x` AND s0.`y`) AS INT) FROM `schema` AS s0} + + query = Schema |> select([r], fragment("CAST(? AS INT)", r.x or r.y)) |> plan() + assert all(query) == ~s{SELECT CAST((s0.`x` OR s0.`y`) AS INT) FROM `schema` AS s0} end test "literals" do diff --git a/test/ecto/adapters/postgres_test.exs b/test/ecto/adapters/postgres_test.exs index d283cafbc..cea992a37 100644 --- a/test/ecto/adapters/postgres_test.exs +++ b/test/ecto/adapters/postgres_test.exs @@ -861,6 +861,12 @@ defmodule Ecto.Adapters.PostgresTest do assert_raise Ecto.QueryError, fn -> all(query) end + + query = Schema |> select([r], fragment("?::integer", r.x and r.y)) |> plan() + assert all(query) == ~s{SELECT (s0."x" AND s0."y")::integer FROM "schema" AS s0} + + query = Schema |> select([r], fragment("?::integer", r.x or r.y)) |> plan() + assert all(query) == ~s{SELECT (s0."x" OR s0."y")::integer FROM "schema" AS s0} end test "literals" do diff --git a/test/ecto/adapters/tds_test.exs b/test/ecto/adapters/tds_test.exs index c9a01b213..0c45630f7 100644 --- a/test/ecto/adapters/tds_test.exs +++ b/test/ecto/adapters/tds_test.exs @@ -719,6 +719,12 @@ defmodule Ecto.Adapters.TdsTest do fn -> all(query) end + + query = Schema |> select([r], fragment("CAST(? AS INT)", r.x and r.y)) |> plan() + assert all(query) == ~s{SELECT CAST((s0.[x] AND s0.[y]) AS INT) FROM [schema] AS s0} + + query = Schema |> select([r], fragment("CAST(? AS INT)", r.x or r.y)) |> plan() + assert all(query) == ~s{SELECT CAST((s0.[x] OR s0.[y]) AS INT) FROM [schema] AS s0} end test "literals" do