len() of an expression with an empty primary key generates invalid SQL
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
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
- Enthält ein Dockerfile oder eine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus datajoint/datajoint-python
-
MySQL error 1143 (column-level SELECT denied) is not translated to AccessErrorEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offenbug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
datajoint/datajoint-python#1586 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
datajoint/datajoint-python#1539 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Environment variables lose to datajoint.json for settings missing from ENV_VAR_MAPPINGEvtl. vergeben @dimitri-yatsenko hat das vor 1 Tag übernommen. Offen
datajoint/datajoint-python#1585 · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
_job_start_time records the populating host's local time, with no zoneEvtl. vergeben @dimitri-yatsenko hat das vor 2 Tagen übernommen. Offen
datajoint/datajoint-python#1584 · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
database.name should namespace schema names on MySQL, as it does on PostgreSQLEvtl. vergeben @dimitri-yatsenko hat das vor 4 Tagen übernommen. Offenfeature
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 15/100
datajoint/datajoint-python#1582 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in datajoint/datajoint-python
Ähnliche Issues
-
Agentic
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Imbad0202/academic-research-skills#979 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
reflex-dev/reflex#7561 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
prometheus-community/ansible#906 · 2 Kommentare ·