SQL read/write classifier fails closed on valid reads (`//`, typed `TIMESTAMPTZ` literals, `NOT GLOB`, CREATE+SELECT) and reports a misleading "user rule" error
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- sql, typescript
- 領域
- databases
調査の方向性
Start in packages/opencode/src/altimate/tools/sql-classify.ts, at classifyAndCheck, classifyFallback and isScratchSafeWrite, then check how sql-execute.ts maps a write classification to sql_execute_write. Add tests that classify each listed construct (//, NOT GLOB, typed TIMESTAMPTZ literals, CREATE ... AS SELECT followed by SELECT) as a read, and check that a parse failure produces a distinct message. Done means those cases pass and the unparseable-statement denial text is snapshotted.
索引モデルが issue の本文から書いたものです。
説明
Problem
When the parser cannot read a statement, classifyAndCheck classifies it as a write. The analyst config denies writes, and the model sees only "The user has specified a rule which prevents you from using this specific tool call". Nothing says the statement was actually a parse failure on a valid read, so models rewrite blindly or switch to slower workarounds.
Mechanism
classifyAndCheckfalls back toclassifyFallback, which returns"write"when the parser throws (packages/opencode/src/altimate/tools/sql-classify.ts:131,:172-193).sql_executethen asks forsql_execute_write(sql-execute.ts:113-121), which the analyst agent denies (packages/opencode/src/agent/agent.ts:254).isScratchSafeWriterequires every statement to be a write (sql-classify.ts:226-271), soCREATE TABLE ... AS SELECT ...; SELECT ...in one call is refused.- Parser gaps on pure reads (probed against the bundled parser): DuckDB integer division
//; SQLiteNOT GLOB;FILTER (...)variants; alias namesatandmatch;PIVOT; typed literals such asTIMESTAMPTZ '2023-05-02 00:00:00+00'. The same queries with/, or with::timestamptzcasts, classify as reads.
Evidence
- 17 of 17 queries containing
//were denied; 4 containingGLOB. - 90 refusals of pure SELECT/WITH statements in one set of sessions: 87 contain a typed
TIMESTAMPTZ '...'literal, 0 of 2,676 allowed queries on the same warehouses do (inferred from this split; not yet reproduced in a unit test). - 31 denied scratch
CREATE ... AS SELECTbatches with a trailingSELECT. - 28 of 32 denials in one set of sessions were avoidable, at about 3.4-3.8 s per lost turn (about 600 s total); 23 generations had every call refused.
- The refusals pushed models onto a scratch-to-scratch
sql_materializepath (45 calls, 728 s, including 4 helper crashes) and blocked a session-setting workaround for expression depth limits (see the many-table issue).
Impact
Time and cost; no direct answer loss (affected sessions recovered), but the risk of abandoning a correct approach is real.
Proposed fix
- Report parser failures as their own message: "could not prove this is read-only: parser error at col N; rewrite or split the statement".
- Teach the dialect lexer/parser
//,GLOB,PIVOT, typed literals (TIMESTAMPTZ,TIMESTAMP,DATE,INTERVAL '...'). - When the parse fails but the statement starts with
SELECT/WITHand masked code has no write keyword, run on a read-only connection. - Accept scratch-safe writes followed by reads and return the last result set.
Acceptance check
Regression tests classifying each of the listed constructs as read, a CREATE ...; SELECT ... scratch batch accepted, and a snapshot of the new denial message for a genuinely unparseable statement.
- 主要言語
- TypeScript
- スター
- 810
- フォーク
- 121
- 平均マージ
- 1日 10時間
- マージ済み PR(30日)
- 89
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
AltimateAI/altimate-code のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
AltimateAI/altimate-code#1454 ·
メンテナーはふだん 1 日以内に返信
-
test: MCP tests fail when the developer's ~/.claude.json has MCP servers (HOME is not sandboxed)オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
AltimateAI/altimate-code#1386 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
AltimateAI/altimate-code#1384 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
AltimateAI/altimate-code#1323 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
AltimateAI/altimate-code#1288 ·
メンテナーはふだん 1 日以内に返信
AltimateAI/altimate-code の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
chrisparsons83/flexspotff#215 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
vitest-dev/vitest#11633 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
メンテナーはふだん 1 日以内に返信