Skip to content

Latest commit

 

History

History
54 lines (39 loc) · 2.13 KB

File metadata and controls

54 lines (39 loc) · 2.13 KB

SELECT Extensions Plan

目的

01-sql-parser.md で到達した最小 SELECT を土台として、 将来的に SELECT 構文を段階的に広げる。

この計画は、INSERT / UPDATE / DELETE / CREATE TABLE の実装を優先したあとに 着手することを前提にする。

対象範囲

次の機能を SELECT の追加拡張対象とする。

  • 結合先 (SELECT ...) AS alias の安定化
  • JOIN 右辺での派生表対応
  • INNER JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN
  • LIMIT
  • OFFSET

必要に応じて、既存対応済みの ORDER BY / GROUP BY / HAVING / DISTINCT / 関数呼び出し / subquery との整合もここで見直す。

実装順

学習用に一度に広げず、次の順で段階的に進める。

  1. JOIN の右辺でも (SELECT ...) AS alias を最小形から読めるようにする
  2. 結合先の AST 表現と parser の分岐を整理し、通常テーブル参照と派生表参照を同じ枠組みで扱う
  3. INNER JOINLEFT OUTER JOIN など、既存の join type 判定を壊さずに派生構文を追加する
  4. LIMIT / OFFSETORDER BY の後段で読めるようにし、AST 側に行数制御の保持先を追加する
  5. 既存の SELECT テストを見直し、句の組み合わせが増えても壊れない回帰テストを追加する

テスト方針

  • JOIN の右辺に派生表を置いた正常系を追加する
  • join type ごとの差分をテーブルドリブンで固定する
  • LIMIT / OFFSET の正常系と異常系を追加する
  • 既存の ORDER BY / GROUP BY / HAVING と組み合わせた回帰テストを追加する

完了条件

次のような SQL を、既存の SELECT 機能を壊さずにパースできることを目標にする。

SELECT u.id FROM users u INNER JOIN orders o ON u.id = o.user_id;
SELECT u.id FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
SELECT id FROM users JOIN (SELECT user_id FROM orders) AS o ON users.id = o.user_id;
SELECT id FROM users ORDER BY id DESC LIMIT 10;
SELECT id FROM users ORDER BY id DESC LIMIT 10 OFFSET 20;