From abf0485f7701ef65e6ed59983d55a2d5933568ac Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Wed, 5 Oct 2022 21:43:06 +0000 Subject: [PATCH 1/3] Fixes exists expressions --- lib/ecto/adapters/sqlite3/connection.ex | 4 ++++ test/ecto/integration/crud_test.exs | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/ecto/adapters/sqlite3/connection.ex b/lib/ecto/adapters/sqlite3/connection.ex index 50c4d04..af54b92 100644 --- a/lib/ecto/adapters/sqlite3/connection.ex +++ b/lib/ecto/adapters/sqlite3/connection.ex @@ -1340,6 +1340,10 @@ defmodule Ecto.Adapters.SQLite3.Connection do ["json_extract(", expr(expr, sources, query), ", '$", path, "')"] end + def expr({:exists, _, [subquery]} = ex, sources, query) do + ["exists", expr(subquery, sources, query)] + end + def expr({fun, _, args}, sources, query) when is_atom(fun) and is_list(args) do {modifier, args} = case args do diff --git a/test/ecto/integration/crud_test.exs b/test/ecto/integration/crud_test.exs index 1279470..e74f784 100644 --- a/test/ecto/integration/crud_test.exs +++ b/test/ecto/integration/crud_test.exs @@ -233,5 +233,15 @@ defmodule Ecto.Integration.CrudTest do assert [_] = TestRepo.all(from(a in Account, where: a.email == "hi@hi.com")) assert [_] = TestRepo.all(from(a in Account, where: a.email == "HI@HI.COM")) end + + test "handles exists subquery" do + account1 = TestRepo.insert!(%Account{name: "Main"}) + user1 = TestRepo.insert!(%User{name: "John"}, []) + TestRepo.insert!(%AccountUser{user_id: user1.id, account_id: account1.id}) + + subquery = from(au in AccountUser, where: au.user_id == parent_as(:user).id, select: 1) + + assert [_] = TestRepo.all(from(a in Account, as: :user, where: exists(subquery))) + end end end From 02d1f0ee7315630674aca5108e9627686869baf1 Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Wed, 5 Oct 2022 21:50:54 +0000 Subject: [PATCH 2/3] Fix warning --- lib/ecto/adapters/sqlite3/connection.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ecto/adapters/sqlite3/connection.ex b/lib/ecto/adapters/sqlite3/connection.ex index af54b92..669d0a3 100644 --- a/lib/ecto/adapters/sqlite3/connection.ex +++ b/lib/ecto/adapters/sqlite3/connection.ex @@ -1340,7 +1340,7 @@ defmodule Ecto.Adapters.SQLite3.Connection do ["json_extract(", expr(expr, sources, query), ", '$", path, "')"] end - def expr({:exists, _, [subquery]} = ex, sources, query) do + def expr({:exists, _, [subquery]}, sources, query) do ["exists", expr(subquery, sources, query)] end From 4bd557e65a9bbac0dd8815829c42a4a5320f2fdf Mon Sep 17 00:00:00 2001 From: Jeff Newman Date: Thu, 6 Oct 2022 13:54:17 +0000 Subject: [PATCH 3/3] mix format --- test/ecto/integration/crud_test.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/ecto/integration/crud_test.exs b/test/ecto/integration/crud_test.exs index e74f784..ef8d036 100644 --- a/test/ecto/integration/crud_test.exs +++ b/test/ecto/integration/crud_test.exs @@ -239,7 +239,8 @@ defmodule Ecto.Integration.CrudTest do user1 = TestRepo.insert!(%User{name: "John"}, []) TestRepo.insert!(%AccountUser{user_id: user1.id, account_id: account1.id}) - subquery = from(au in AccountUser, where: au.user_id == parent_as(:user).id, select: 1) + subquery = + from(au in AccountUser, where: au.user_id == parent_as(:user).id, select: 1) assert [_] = TestRepo.all(from(a in Account, as: :user, where: exists(subquery))) end