Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

len() of an expression with an empty primary key generates invalid SQL

Aberta Para iniciantes
#1,581 0 comentários 0 reações 0 responsáveis Ver no GitHub

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
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
mysql, python
Domínio
databases

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

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de datajoint/datajoint-python

Todas as issues de datajoint/datajoint-python

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.