Skip to content

bug(db): DSQL SQL バリデータが文書化された ALTER TABLE 許可リストを実装していない #220

Description

@konokenj

キットのバージョン / コミット

dev/v3 @ e3a3954

期待される挙動

packages/db/src/dsql-compat.ts(生成時の check-dsql-compat.ts と実行時の migrate.ts の両方で使用される)は、AGENTS.md に文書化された許可リストに従い、DSQL がサポートしない ALTER TABLE サブコマンドをすべて拒否すべきである:

ALTER TABLE only supports: ADD COLUMN, RENAME COLUMN/TABLE/CONSTRAINT, SET SCHEMA, OWNER TO, and IDENTITY operations. Everything else […] requires table recreation.

実際の挙動

packages/db/src/dsql-compat.ts:51-83 は、型変更・列削除・デフォルト・NOT NULL・制約削除、および制約付き ADD COLUMN のみを捕捉する拒否リスト(denylist)方式を使っている。許可リスト外だが拒否リストにも載っていない文は暗黙的に受理される。例:

  • ALTER TABLE "T" ADD CONSTRAINT "u" UNIQUE ("c");
  • ALTER TABLE "T" ALTER COLUMN "c" SET STATISTICS 1;

いずれもローカル生成、pnpm -r run check:ci、CI のドリフトチェックを通過し、マイグレータが DSQL に対して実行した時点で初めて失敗する。

問題が発生する条件

  • 許可リスト外だが現状の拒否リストには載っていない ALTER TABLE サブコマンドを含む、手書きのマイグレーション
  • Drizzle が生成する文はランナーが再整形するため該当しにくい。手書きの .sql--custom 経由)がよりリスクの高い経路

再現手順

  1. ALTER TABLE "todo_items" ADD CONSTRAINT "unique_title" UNIQUE ("title"); を含むマイグレーションを追加する
  2. pnpm --filter @repo/db run generate を実行 — 通過する
  3. pnpm -r run check:ci を実行 — 通過する
  4. デプロイ — 実行時にマイグレータが失敗する

分析と修正案(任意)

validateStatement()ALTER TABLE サブコマンドの許可リスト(AGENTS.md に一致)として書き直しつつ、回帰カバレッジのために既存の拒否リストのテストを維持する。v3 差分レビュー(executor 06 の発見 F-DB-02)で発見。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-triageAwaiting maintainer review and classification

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions