DuckDB v2.0: Your Database Deserves a Better Parser
Bài tóm tắt DuckDB Labs 2026 4. Điều chỉnh Độ khó: Khó
DuckDB Labs · 2026 · 4. Điều chỉnh · Độ khó: Khó — bài gốc
Bối cảnh
- Từ commit đầu tiên năm 2018, DuckDB dùng parser và grammar lấy từ PostgreSQL: trưởng thành, đã qua thử lửa, cú pháp quen thuộc. Họ thêm một
Transformerđổi parse tree kiểu Postgres sang AST nội bộ. - Dialect của DuckDB (gọi là DuckSQL) lớn dần (
GROUP BY ALL,FROMtrướcSELECT…). Sửa grammar YACC/Bison (LALR(1)) ngày càng khó: một thêm thắt nhỏ dễ đụng luật cũ, sinh xung độtshift/reduce,reduce/reduce. Extension muốn thêm cú pháp chỉ có cách làm parser dự phòng: DuckDB parse trước, thất bại mới gọi extension, và extension phải tự parse cả phần SQL xung quanh; nhiều extension không kết hợp được với nhau.
Thay đổi chính
- Thay phần front-end parser, giữ nguyên AST: dialect không đổi, binder và phần còn lại của pipeline vẫn nhận cùng cấu trúc AST. Parser mới phải phủ mọi câu lệnh và biểu thức, độ ưu tiên toán tử, phân loại từ khoá (reserved hay dùng làm định danh được), báo lỗi đúng chỗ, và không chậm với input dị dạng.
- Đi qua nhiều bước: bài báo nghiên cứu và prototype PEG chỉ parse một phần SQL (2024, CIDR 2025) → grammar PEG dùng cho autocomplete trong CLI (v1.2) → parser PEG đầy đủ là tính năng opt-in thử nghiệm (v1.5) → mặc định ở v2.0 (2026).
- PEG: các lựa chọn được thử theo thứ tự, chọn cái khớp đầu tiên, nên không còn xung đột kiểu LALR; thứ tự trở thành một phần ngữ nghĩa của grammar. Theo DuckDB, Python cũng chuyển sang parser PEG ở bản 3.9 vì lý do tương tự.
- Lỗi lộ ra khi đưa lên: bản thử nghiệm ở v1.5 bị backtracking bùng nổ theo hàm mũ với input dị dạng:
SELECT ((((…với 18 dấu ngoặc mất 5,3 giây, 19 dấu mất 10,6 giây. Sửa bằng packrat parsing (memo hoá kết quả của mỗi matcher tại mỗi vị trí token): 19 dấu ngoặc còn 0,001 giây, đổi lại tốn thêm bộ nhớ khi parse. - Mở rộng lúc chạy (bản xem trước): extension thêm luật grammar vào các điểm mở rộng (ví dụ thêm một lựa chọn cho
SelectAtom), đăng ký từ khoá và hàm transform, và dùng lại luật có sẵn (GroupByClause…) thay vì tự parse lại SQL. Ví dụ: cú pháp pipe (|>) của Google cài như một extension.
Vì sao
- Theo DuckDB: cú pháp mới (expression statement,
CONNECT,COPY … PARTITION BY) vẫn làm được với parser cũ nhưng rất cồng kềnh. Parser PEG giúp dialect tiếp tục tiến hoá và cho extension thêm cú pháp mà không phải viết lại SQL.
Bài học cho SWE
- Thứ mượn từ hệ khác (ở đây là parser Postgres) là lựa chọn đúng lúc đầu, rồi thành ràng buộc khi sản phẩm lệch khỏi gốc.
- Thay một thành phần lõi bằng cách giữ interface ra (AST) không đổi và đưa vào dần: trước hết ở chỗ ít rủi ro (autocomplete), rồi opt-in, rồi mặc định.
- Bản thử nghiệm opt-in là nơi lộ ra các trường hợp xấu nhất (input dị dạng làm thời gian tăng theo hàm mũ) trước khi thành mặc định.
Liên quan
- DuckDB Labs 2026 · DuckDB Labs 2026 · DuckDB Labs 2026
- Yelp 2026 (cũng thay công cụ nền bằng bản tương thích, bật dần)
- Migration không downtime
#SQL parser#PostgreSQL parser#YACC/Bison#LALR(1)#PEG#Packrat parsing#Opt-in#Same AST#Parser extension#Runtime extensibility
Được nhắc tới trong
Chủ đề (1)
Công ty (1)
Bài tóm tắt (3)