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

delete() does nothing when its restriction contains a percent sign

Aberta
#1,636 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
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
78/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
mysql, postgresql, python
Domínio
database

Direção de pesquisa

Start with the cascade implementation around Diagram.cascade() and the restriction handling in restrict(), then trace how conditions are reapplied to the fresh table. Reproduce the % cases with the issue’s Label and Use example. Done means the cascade deletes the matching row and its descendants without changing behavior for ordinary conditions or LIKE patterns, with regression tests covering both database drivers.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug

Summary

A delete restricted by a condition that contains % deletes nothing. (Label & "name = '50%'").delete() returns 0 and leaves the row and its descendants in place, and so does a dict restriction such as {"name": "50%"}. dj.Diagram.cascade(seed).counts() reports 0 rows for every table, although len(seed) is 1.

A restriction's conditions are stored as compiled SQL, with every % already escaped as %% for the database driver. The cascade applies the seed's conditions again to a fresh copy of the table through restrict(), which escapes every % a second time. The condition then looks for the literal text 50%% and matches no row.

A LIKE pattern keeps working, because %% and % match the same strings there.

Nothing is deleted that should not be, but the delete silently does nothing.

Reproduction

DataJoint 2.3.4 and master, MySQL 8.0 and PostgreSQL 15:

import datajoint as dj

schema = dj.Schema("scratch_percent")


@schema
class Label(dj.Manual):
    definition = """
    label_id : int32
    ---
    name : varchar(16)
    """


@schema
class Use(dj.Manual):
    definition = """
    -> Label
    use_id : int32
    """


Label.insert([(1, "50%"), (2, "other")])
Use.insert([(1, 1), (2, 1)])

seed = Label & "name = '50%'"
print(len(seed))                               # 1
print(dj.Diagram.cascade(seed).counts())       # 0 rows in each table
print(seed.delete(prompt=False))               # 0; both labels and both uses remain

Workaround

Restrict by the primary keys: (Label & seed.keys()).delete().

Expected behavior

The cascade selects the same rows as the restriction on its own: label 1 and its use.

Linguagem predominante
Python
Estrelas
197
Forks
101
Merge médio
2d 10h
PRs com merge (30d)
12

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.