aws-samples / aws-samples/serverless-full-stack-webapp-starter-kit

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

Open
#220 2 comments 0 reactions 0 assignees View on GitHub
bug needs-triage
Dominant language
TypeScript
Stars
229
Forks
45
Avg merge
1m
Merged PRs (30d)
4

Description

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

dev/v3 @ e3a3954

### 期待される挙動

`packages/db/src/dsql-compat.ts`(生成時の `check-dsql-compat.ts` と実行時の `migrate.ts` の両方で使用される)は、[AGENTS.md](../AGENTS.md#database) に文書化された許可リストに従い、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)で発見。

Contributor guide

Open the contributing guide

Research direction

Start in packages/db/src/dsql-compat.ts, especially validateStatement() and lines 51-83, then compare the documented ALTER TABLE rules in AGENTS.md#database. Check how packages/db/src/check-dsql-compat.ts and migrate.ts use the validator, preserve the existing denylist tests, and run pnpm --filter @repo/db run generate plus pnpm -r run check:ci; done means unsupported ALTER TABLE subcommands are rejected before deployment.

Written by the indexing model from the issue text.

Assessment

Tech stack
sql, typescript
Domain
databases
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
72/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.