Composed query with groupBy clause in subquery fails
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 45/100
Direção de pesquisa
Comece rastreando a tradução, pelo SQLProvider, de consultas F# compostas com uma cláusula groupBy e inspecione a subconsulta gerada para a reprodução. A tarefa estará concluída quando a subconsulta IN selecionar apenas a coluna agregada solicitada, enquanto a seleção explícita da chave de agrupamento continuar incluindo-a; adicione ou execute um teste de regressão que cubra ambos os casos.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Describe the bug
SqlException "Only one expression can be specified in the select list when the subquery is not introduced with EXISTS." returned when using a composed query when the subquery has a groupBy clause. This is because SQLProvider includes the groupBy key in the select clause even if you haven't asked for it.
To Reproduce
Steps to reproduce the behavior:
- Take a query that uses a subquery with a groupBy clause, e.g.:
let test =
let lastAddresses =
query {
for a in dbContext.Address do
where (a.Deleted.IsNone)
groupBy a.UserId into g
select (g.Max(fun a -> a.Id))
}
let result =
query {
for a in dbContext.Address do
where (lastAddresses.Contains(a.Id))
select a
}
result
- Run the query, and you get the SqlException described above.
- Inspecting the SQL produced, you can see the problem:
SELECT *
FROM [address] as [a]
WHERE (([a].[Id] IN (
SELECT [a].[UserId] as '[a].[UserId]', MAX([a].[Id]) as '[a].[MAX_Id]'
FROM [address] as [a]
WHERE (([a].[Deleted] IS NOT NULL))
GROUP BY [a].[UserId]))
)
- Basically SQLProvider is including
[a].[UserId] as '[a].[UserId]'in the select clause of the subquery. TheINclause is only expecting a single column in the subquery so fails.
Expected behavior
SQLProvider should only return the columns requested in the query. The SQL produced should be:
SELECT *
FROM [address] as [a]
WHERE (([a].[Id] IN (
SELECT MAX([a].[Id]) as '[a].[MAX_Id]'
FROM [address] as [a]
WHERE (([a].[Deleted] IS NOT NULL))
GROUP BY [a].[UserId]))
)
Additional context
If we wanted the groupBy key included in the select statement, we could do so by requesting it explicitly, so there is no reason why SQLProvider should do this for us unsolicitedly:
let test =
let lastAddresses =
query {
for a in dbContext.Address do
where (a.Deleted.IsNone)
groupBy a.UserId into g
select (g.Key, g.Max(fun a -> a.Id))
}
let result =
query {
for a in dbContext.Address do
where (lastAddresses.Contains(a.Id))
select a
}
result
- Linguagem predominante
- F#
- Estrelas
- 627
- Forks
- 148
- Merge médio
- 2h 2min
- PRs com merge (30d)
- 1
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Sem guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de fsprojects/SQLProvider
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 55/100
fsprojects/SQLProvider#877 · 1 comentário ·
-
enhancement
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 55/100
fsprojects/SQLProvider#872 · 2 comentários ·
-
Repo Assist?Abertaenhancement
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 10/100
fsprojects/SQLProvider#870 · 1 comentário ·
-
postgresql
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 58/100
fsprojects/SQLProvider#869 · 2 comentários ·
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 42/100
fsprojects/SQLProvider#868 · 2 comentários ·
Todas as issues de fsprojects/SQLProvider
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
tursodatabase/turso#10002 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
mariadb-operator/mariadb-operator#1962 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
arabold/docs-mcp-server#548 ·
Mantenedores costumam responder em até 1 dia
-
bug difficulty: easy
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
MetroLogic/fluxapay_contract#1022 ·
Mantenedores costumam responder em até 1 dia