len() of an expression with an empty primary key generates invalid SQL
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 70/100
Direção de pesquisa
O bug está em QueryExpression.__len__ em expression.py (linhas 1163-1174), que segue o ramo de coluna única quando a chave primária está vazia e emite SELECT count(DISTINCT ). Compare com Aggregation.__len__, que envolve a consulta em uma subconsulta e funciona. Execute a reprodução da issue contra dj.U() & File e contra uma subconsulta restrita dj.U().aggr(...). Está concluído quando len() retorna 1 ou 0 para esses casos e os novos testes cobrem tabelas vazias e não vazias.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
len() raises QuerySyntaxError for any query expression whose primary key is empty and that is not an Aggregation, including dj.U() & table, which the query-algebra spec documents as a single-row result.
Versions: v2.3.4 and master at 68fdea59, MySQL 8.0.
Reproduction
@schema
class File(dj.Manual):
definition = """
file_id : int32
---
filename : varchar(255)
"""
File.insert([(1, "a"), (2, "b")])
len(dj.U().aggr(File, n="count(*)")) # 1
len(dj.U() & File) # QuerySyntaxError
len(dj.U().aggr(File, n="count(*)").make_subquery()) # QuerySyntaxError
len(dj.U().aggr(File, n="count(*)").make_subquery() & "n = 2") # QuerySyntaxError
Expected: 1 for each, or 0 when the restriction leaves no row. to_dicts() and bool() on the same expressions work.
Cause
QueryExpression.__len__ (expression.py:1163-1174) picks the single-column branch when len(primary_key) <= 1, so an empty primary key produces:
SELECT count(DISTINCT ) FROM ...
Aggregation.__len__ is not affected, because it counts SELECT count(1) FROM (<subquery>).
Proposed fix
When the primary key is empty, the expression holds at most one row, so return int(bool(result)), or count over SELECT 1 FROM ... LIMIT 1. Add tests for len(dj.U() & T) on empty and non-empty T, and for len() of a restricted dj.U() aggregate subquery.
Related: #1580 (restricting a dj.U() aggregation).
- Linguagem predominante
- Python
- Estrelas
- 197
- Forks
- 98
- Merge médio
- 15h 31min
- PRs com merge (30d)
- 9
Preparar o ambiente
- Inclui um Dockerfile ou arquivo Docker Compose
- Sem modelo de pull request
- Ler o 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 datajoint/datajoint-python
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
datajoint/datajoint-python#1539 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
_job_start_time records the populating host's local time, with no zoneTalvez já em andamento @dimitri-yatsenko assumiu hoje. Aberta
datajoint/datajoint-python#1584 · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
database.name should namespace schema names on MySQL, as it does on PostgreSQLTalvez já em andamento @dimitri-yatsenko assumiu há 3 dias. Abertafeature
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 15/100
datajoint/datajoint-python#1582 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 40/100
datajoint/datajoint-python#1580 ·
Mantenedores costumam responder em até 1 dia
-
A column copied by a foreign key loses the parent's core type (int32 becomes int)Talvez já em andamento @dimitri-yatsenko assumiu há 3 dias. Aberta
Dificuldade 3/5 Meio dia Facilidade para iniciantes 25/100
datajoint/datajoint-python#1578 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de datajoint/datajoint-python
Issues semelhantes
-
SSM GetParameter throttling during concurrent workflow launchesTalvez já em andamento @alexiswl assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 80/100
-
[Bug] Dev image build fails: `npm install` in the root Dockerfile runs out of memory (exit 134)Talvez já em andamento @andest01 assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
Rename FunctionalRole BOT_DEV to DEV_STAFFTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Abertaenhancement good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 79/100
pesu-dev/discord_bot#97 ·
-
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 88/100
gradio-app/gradio#13964 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 93/100
BSData/horus-heresy-3rd-edition#3232 · 1 comentário ·
Mantenedores costumam responder em até 1 dia