Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

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

Đang mở Phù hợp với người mới
#1,581 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
70/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
mysql, python
Lĩnh vực
databases

Hướng nghiên cứu

Lỗi nằm ở QueryExpression.__len__ trong expression.py (dòng 1163-1174). Hàm này đi vào nhánh một cột khi khóa chính rỗng và sinh ra SELECT count(DISTINCT ). Hãy so sánh với Aggregation.__len__, hàm này bọc truy vấn trong một subquery và hoạt động đúng. Chạy lại bước tái hiện trong issue trên dj.U() & File và trên một subquery dj.U().aggr(...) có điều kiện giới hạn. Công việc hoàn thành khi len() trả về 1 hoặc 0 cho các trường hợp đó và các test mới bao phủ cả bảng rỗng lẫn bảng không rỗng.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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

Ngôn ngữ chính
Python
Star
197
Fork
98
Merge trung bình
15 giờ 31 phút
Pull request đã merge (30 ngày)
9

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của datajoint/datajoint-python

Tất cả issue của datajoint/datajoint-python

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.