DuckDB v2.0 thay thế trình phân tích cú pháp SQL: Bước tiến lớn cho khả năng mở rộng

Công nghệ21 tháng 8, 2026·5 phút đọc

DuckDB v2.0 sẽ thay thế trình phân tích cú pháp SQL (parser) có nguồn gốc từ PostgreSQL bằng một parser dựa trên PEG hoàn toàn mới, giúp việc phát triển ngôn ngữ DuckSQL trở nên dễ dàng và linh hoạt hơn. Điểm nhấn quan trọng là kiến trúc mới cho phép các tiện ích mở rộng (extensions) tự thêm cú pháp SQL của riêng mình trực tiếp vào grammar, mở ra tiềm năng lớn cho cộng đồng.

DuckDB v2.0 thay thế trình phân tích cú pháp SQL: Bước tiến lớn cho khả năng mở rộng

DuckDB v2.0 thay thế trình phân tích cú pháp SQL: Bước tiến lớn cho khả năng mở rộng

DuckDB, hệ quản trị cơ sở dữ liệu phân tích đang ngày càng phổ biến trong cộng đồng dữ liệu, vừa công bố một thay đổi nền tảng trong phiên bản 2.0: thay thế hoàn toàn trình phân tích cú pháp SQL (parser) có nguồn gốc từ PostgreSQL bằng một parser dựa trên PEG (Parsing Expression Grammar). Sự thay đổi này không chỉ giúp việc phát triển ngôn ngữ DuckSQL trở nên dễ dàng hơn mà còn mở ra khả năng mở rộng cú pháp SQL một cách linh hoạt chưa từng có.

Bài viết này sẽ phân tích chi tiết về động lực đằng sau sự thay đổi lớn này, nguyên lý hoạt động của PEG parser, và đặc biệt là tính năng đột phá cho phép các tiện ích mở rộng tự định nghĩa cú pháp mới. Đây là một bước tiến quan trọng, hứa hẹn sẽ thay đổi cách cộng đồng xây dựng và sử dụng các công cụ phân tích dữ liệu trên DuckDB.

Vai trò của trình phân tích cú pháp trong DuckDB

Để hiểu rõ tầm quan trọng của sự thay đổi này, chúng ta cần nắm được vai trò của parser trong hệ thống. Khi DuckDB nhận một câu truy vấn SQL, nó trải qua ba giai đoạn chính:

  • Tokenizer (Trình tách từ): Chia chuỗi đầu vào thô thành các token (từ khóa, số, định danh, nhận diện comment).
  • Parser (Trình phân tích cú pháp): Xác định xem chuỗi token có tuân theo ngữ pháp (grammar) của DuckDB hay không, tạo ra một cây kết quả (ParseResult).
  • Transformer (Bộ chuyển đổi): Chuyển kết quả phân tích thành cây cú pháp trừu tượng (AST) nội bộ để chuyển tiếp cho bộ ràng buộc (binder).

Trong khi parser chỉ kiểm tra tính hợp lệ về mặt cú pháp, binder sẽ chịu trách nhiệm kiểm tra các bảng, cột, hàm được tham chiếu có tồn tại hay không.

Vì sao DuckDB cần rời bỏ parser PostgreSQL?

DuckDB từ những ngày đầu đã sử dụng parser có nguồn gốc từ PostgreSQL, một lựa chọn giúp nó có được một nền tảng ngữ pháp SQL trưởng thành và ổn định. Tuy nhiên, qua thời gian, parser này bộc lộ những hạn chế lớn.

Vấn đề cốt lõi nằm ở chỗ grammar gốc được viết bằng YACC/Bison và tạo ra một parser loại LALR(1). Trong loại parser này, việc thêm một cú pháp mới có thể gây ra xung đột với các luật hiện có (shift/reduce hoặc reduce/reduce conflicts). Khi DuckSQL ngày càng nhiều tính năng như GROUP BY ALL hay SELECT * EXCLUDE, việc thay đổi grammar trở nên phức tạp và rủi ro hơn nhiều.

PEG parser là gì và ưu điểm của nó?

PEG (Parsing Expression Grammar) là một cách tiếp cận khác để mô tả ngôn ngữ. Thay vì dùng các luật LALR(1) phức tạp, PEG định nghĩa các quy tắc (rules) có tên để "khớp" (match) chuỗi đầu vào một cách trực quan và dễ hiểu hơn.

Ví dụ, một phần grammar mới của DuckDB để hỗ trợ cú pháp pipe (lấy cảm hứng từ GoogleSQL) có thể được viết như sau:

PipeSelectAtom ' AS  (...);
REGISTER EXTERNAL RESOURCE '' AS  FROM ;
SHOW EXTERNAL RESOURCES;
CONNECT TO EXTERNAL RESOURCE ;
DESTROY EXTERNAL RESOURCE ;

Cú pháp PEG cho phép các nhà phát triển DuckDB dễ dàng thêm các tính năng mới mà không lo lắng về việc phá vỡ các luật hiện có. Ngoài ra, nó còn hỗ trợ kỹ thuật Packrat Parsing, giúp tránh việc tính toán lặp lại và đảm bảo hiệu năng phân tích ổn định ở mức O(n).

Tính năng đột phá: Parser mở rộng cho mọi tiện ích

Điểm nhấn lớn nhất của PEG parser trong DuckDB v2.0 không chỉ là dễ phát triển mà còn là khả năng mở rộng tại runtime. Trước đây, các tiện ích mở rộng muốn thêm cú pháp mới thường phải dùng cơ chế "fallback parser" (phân tích cú pháp dự phòng). Điều này có nghĩa là chúng phải tự phân tích toàn bộ câu SQL, điều gây khó khăn khi muốn kết hợp nhiều cú pháp khác nhau.

Với parser mới, các tiện ích mở rộng (extensions) có thể đăng ký các quy tắc ngữ pháp của riêng mình, đồng thời tái sử dụng toàn bộ các quy tắc có sẵn của DuckSQL. Ví dụ, để thêm cú pháp pipe query từ Google, một extension chỉ cần định nghĩa cú pháp cho các toán tử pipe (|>) mới, còn các thành phần như biểu thức, WHERE, GROUP BY, SELECT vẫn dùng lại grammar có sẵn của DuckDB.

Sơ đồ kiến trúc parser mới của DuckDBSơ đồ kiến trúc parser mới của DuckDB

Điều này mang lại một lợi ích to lớn: các extension không cần phải tự hiện thực toàn bộ SQL từ đầu. Chúng chỉ cần tập trung vào phần cú pháp mới mà mình muốn thêm.

Kết luận: Một tương lai đầy hứa hẹn

Việc thay thế parser là một quyết định táo bạo nhưng hợp lý của đội ngũ DuckDB. Nó cho thấy cam kết của họ trong việc xây dựng một hệ thống cơ sở dữ liệu không chỉ mạnh mẽ về hiệu năng mà còn linh hoạt trong việc mở rộng. Người dùng hiện tại sẽ không bị ảnh hưởng vì DuckSQL vẫn được giữ nguyên.

Mặc dù API mở rộng grammar vẫn đang trong giai đoạn thử nghiệm (preview) và có thể thay đổi trước khi v2.0 chính thức ra mắt, nhưng ý tưởng này đã được chứng minh là hoạt động tốt. Các tiện ích mở rộng giờ đây có thể tích hợp cú pháp mới một cách sạch sẽ và hiệu quả hơn nhiều so với trước. Sự thay đổi này hứa hẹn sẽ mở ra làn sóng sáng tạo mới từ cộng đồng, với những cú pháp SQL phục vụ cho các nhu cầu phân tích dữ liệu chuyên biệt. Với một cơ sở hạ tầng dễ phát triển và mở rộng, DuckDB đang tiếp tục khẳng định vị thế là một trong những công cụ phân tích dữ liệu đáng chú ý nhất hiện nay.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗