Hello everyone,
A reader (@brownerd) of Northwind Elixir Traders has stumbled upon a weird issue that I am unable to replicate and it seems that it’s platform-specific.
The code in question is this very basic query:
def list_top_n_customers_by_order_count(n \\ 5) when is_integer(n) do
Customer
|> join(:inner, [c], o in assoc(c, :orders))
|> group_by([c, o], c.id)
|> select([c, o], %{id: c.id, name: c.name, num_orders: count(o.id)})
|> order_by([c, o], desc: count(o.id))
|> limit(^n)
|> Repo.all()
end
When I’m running this function, I get the results just fine:
iex(892)> Insights.list_top_n_customers_by_order_count
[
%{id: 20, name: "Ernst Handel", num_orders: 10},
%{id: 63, name: "QUICK-Stop", num_orders: 7},
%{id: 65, name: "Rattlesnake Canyon Grocery", num_orders: 7},
%{id: 87, name: "Wartian Herkku", num_orders: 7},
%{id: 37, name: "Hungry Owl All-Night Grocers", num_orders: 6}
]
When @brownerd runs the same code, he gets this:
** (FunctionClauseError) no function clause matching in anonymous fn/1 in Ecto.Adapters.SQLite3.Connection.group_by/2
The following arguments were given to anonymous fn/1 in Ecto.Adapters.SQLite3.Connection.group_by/2:
# 1
%Ecto.Query.ByExpr{
expr: [{{:., [], [{:&, [], [0]}, :id]}, [], []}],
file: ".../Northwind/northwind_elixir_traders/lib/northwind_elixir_traders/insights.ex",
line: 43,
params: nil,
subqueries: []
}
...
We checked our respective dependencies and there is nothing peculiar about them. We both use:
ecto 3.12.5
ecto_sql 3.12.1
ecto_sqlite3 0.15.1
exqlite 0.29.0
There are two differences in environment:
- @brownerd uses Elixir 1.17, I use 1.18.2 – I doubt that this what causes the issue.
- @brownerd is on a Mac, I’m on Debian – this smells more like the root cause of the issue.
Has anyone here encountered such an issue before? I have also opened an issue here: