Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

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

Offen Anfängerfreundlich
#1,581 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
70/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
mysql, python
Bereich
databases

Rechercherichtung

Der Fehler liegt in QueryExpression.__len__ in expression.py (Zeilen 1163-1174). Dort wird bei leerem Primärschlüssel der Single-Column-Zweig genommen, der SELECT count(DISTINCT ) erzeugt. Vergleiche das mit Aggregation.__len__, das die Abfrage in eine Subquery einbettet und funktioniert. Führe die Reproduktion aus dem Issue gegen dj.U() & File und eine eingeschränkte dj.U().aggr(...)-Subquery aus. Fertig ist es, wenn len() für diese Fälle 1 oder 0 zurückgibt und neue Tests leere und nicht leere Tabellen abdecken.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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).

Vorherrschende Sprache
Python
Sterne
197
Forks
99
Ø Merge
1 T. 11 Std.
Gemergte PRs (30 T.)
10

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus datajoint/datajoint-python

Alle Issues in datajoint/datajoint-python

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.