Releases: rex0220/kintone-sql-tools
Release list
v3.16.1 — 言語リファレンスへ B64 反映(docs のみ)
言語リファレンスへ B64 を反映(ドキュメントのみ)
v3.16.0 で追加した「集計関数の引数のスカラー値式対応(B64)」を、MCP の ksql_docs が返す言語リファレンスに反映しました。SQL / パーサ / エンジンの挙動は v3.16.0 から変更ありません(SemVer=patch)。
- §4「CASE WHEN」: 集計関数の引数でも
CASEを使える旨(集計内ではELSE省略を NULL として除外・結果はスカラー値限定)。 - §8「GROUP BY / 集計関数」: 「集計関数の引数に式を指定」節を追加。全12集計での
CASE式・||連結・スカラー変数対応、条件付き集計・条件付き件数・横持ちピボットの例、比較式の非対応とCASE誘導、ネスト集約・MODE(DISTINCT)の禁止、ELSE省略・空セル・MIN/MAX/MODEの型推論の規約。 - §9「HAVING」:
CASE式引数の例。MODEのカテゴリ化を機能しないCOALESCEからCASEイディオムへ更新。
ksql_docs を使う AI クライアントが、条件付き集計の書き方をドキュメントからも確認できるようになります(従来は ksql_validate の応答が確定シグナルでした)。
アセット
ksql-plugin-v3.16.1.zip— kintone プラグインksql-mcp.js— MCP サーバー(Node)ksql-mcp.mcpb— MCP バンドル(Claude Desktop)
v3.16.0 — B64 集計関数引数のスカラー値式対応(CASE / || / @var)
B64 集計関数引数のスカラー値式対応
集計関数の引数を算術式限定から拡張し、全12集計(SUM/COUNT/AVG/MIN/MAX/GROUP_CONCAT/統計集約/MODE)で CASE 式・|| 連結・裸のスカラー変数 @var を指定できるようにしました。
条件付き集計を直接書けます:
SELECT
会社名,
COUNT(*) AS 案件数,
SUM(売上) AS 売上合計,
SUM(CASE WHEN 商談フェーズ = '受注' THEN 売上 ELSE 0 END) AS 受注済み売上
FROM APP4149
GROUP BY 会社名(従来は CTE 経由の回避が必要でした)
仕様
- 旧算術式引数を優先する二段パースで、既存の有効な SQL の AST・結果・snapshot は不変。
- 比較・述語(
SUM(売上 > 0)など)は kSQL に boolean 型がないため非対応のまま。CASEで値を明示する専用エラーで案内します。サブクエリ・ネスト集約・MODE(DISTINCT)も従来どおり拒否。 CASEの非一致(ELSE 省略)は集計から除外、一致した空セル・明示ELSE ''はMIN/MAXの canonical empty band に残します。GROUP_CONCAT・統計集約・MODEの空値・完全入力・DISTINCT 規約は維持。HAVINGの集計参照も SELECT と同じ合成名で解決。- SQL 挙動は新規受理構文の追加のみ(SemVer=minor)。
アセット
ksql-plugin-v3.16.0.zip— kintone プラグインksql-mcp.js— MCP サーバー(Node)ksql-mcp.mcpb— MCP バンドル(Claude Desktop)
全 2,888 テスト green。
v3.15.0
v3.15.0(2026-07-22)
B62: AI 可視性の注記強化
AI クライアントによる kSQL 組み立ての行動検証(計 30 シナリオ)で観測した「AI がつまずく箇所」への対策です。
- MCP server instructions へ 2 つの注記を追加(計 529 語):
UPDATE CHECK sees pre-update values; to test the new value, repeat the SET expression inside CHECK.— 検証で唯一観測された「validate は通るが意味がずれる」誤り(CHECK を更新後値と誤解)の再発防止- 変数名規則の誘導(ASCII 先頭規則・配置ルールは
ksql_docsへ)
- 言語リファレンスの強化:
- §16 に CHECK 評価行の相互参照(組み込み検証=更新後値 / CHECK=文種別。UPDATE は更新前値)
- §25 に
@変数の配置詳細表(使える位置 A01〜A13/使えない位置 R01〜R05)と回避レシピ。配置表はパーサの特性化テストと ID で一対一対応
ksql_mutateの説明にも CHECK 注記を二重化- 効果実証済み: 同一依頼の再検証で意味論誤り 1→0 件・構文の試行錯誤 5→1 回
- プラグイン・CLI の SQL 挙動に変更なし(MCP とドキュメントのみ)
🤖 Generated with Claude Code
v3.14.0
v3.14.0(2026-07-22)
B60: MCP Statement syntax catalog(構文ヒント)
MCP server instructions に 全文型(18 family)の構文カタログ「Statement templates」 を追加しました。AI クライアント(Claude Desktop / Claude Code 等)が ON ERROR SKIP INTO #err [REJECT LIMIT n] などの kSQL 固有構文を発明せず、正しい骨格で一発で組み立てられるようにします。
- カタログは CHECKS/CONTROL 共通記法+18 文型の骨格+句順・併用規則(VALIDATE ONLY と ON ERROR SKIP は択一・INTO #err はバッチ専用・APPLY 併用規則など)
- カタログに載る全構文例はパーサ受理テストで機械的に固定(載っている構文は必ず通る)・family 全数は型レベルで保証
ksql_query/ksql_mutateの説明にも構文テンプレートを追記・行動規範「初出の文型は ksql_docs で確認・構文を発明しない」を明文化- mcpb-verify に instructions 検証を新設(stale パッケージ検出)
- 言語リファレンス §24 の EXPLAIN 対応一覧に VALIDATE / IMPORT を追記(記載漏れ修正)
- プラグイン・CLI の SQL 挙動に変更なし(MCP のみの追加)
リリース前 AI 行動検証(両面 PASS): Claude Code(headless×2)と Claude Desktop(発端環境)で「不正行を隔離する INSERT バッチ」を依頼し、いずれも ON ERROR SKIP INTO #err を一発で正配置・ksql_docs 先読みの行動まで確認。
🤖 Generated with Claude Code
v3.13.0
v3.13.0(2026-07-22)
関数拡充 3 件とバグ修正 1 件。
B56: 統計集約関数
STDDEV_POP / STDDEV_SAMP / VAR_POP / VAR_SAMP / MEDIAN を追加。分散・標準偏差は Welford 法、中央値は数値昇順。統計集約は完全入力必須(onLimit=truncate でも上限到達時はエラー・部分集合の統計値を返さない)。未定義の統計量(0 件・_SAMP の 1 件)は空文字、非数値入力は ArgumentError。無印 STDDEV/VARIANCE は方言間で意味が異なるため非対応(明示形のみ)。
B57: 日付集計軸関数
DAYOFWEEK(1=日曜)/ QUARTER / WEEK(ISO-8601 固定・MySQL WEEK() 既定と非互換)と、DATE_FORMAT 指定子 %w(0=日曜)/ %a(日本語曜日)/ %v(ISO 週番号)/ %G(ISO week-year)を追加。週次ラベルは %G-%v を推奨(%Y-%v は年跨ぎ週で誤る)。新 3 関数は実在する日付のみ受理し、不正日付は空文字。
B58: MODE(最頻値)
カテゴリデータ(ドロップダウン・ステータス等)向けの文字列頻度カウント。同数タイは canonical 比較順の最小値を返す決定的規則(他 RDB の「不定」を採らない)。
B59: バグ修正 — ORDER BY の別名参照
SELECT LENGTH(f) AS len … ORDER BY len のような SELECT 列別名の ORDER BY が黙って無視され元の行順を返す不具合を修正。従来並ばなかったクエリの結果順が変わります。集計別名(ORDER BY 件数 DESC 等)は従来から正常で挙動不変。
その他
- 新しい予約語 9 語:
STDDEV_POPSTDDEV_SAMPVAR_POPVAR_SAMPMEDIANMODEDAYOFWEEKQUARTERWEEK(同名フィールドはバッククォートで参照) - MCP instructions の全量関数カタログを aggregate 12 / scalar 46 へ更新
- 全 2,834 テスト green・CLI 実機照合済み(各 evidence は docs/internal/evidence/ 参照)
🤖 Generated with Claude Code
v3.12.0
B55: MCP read-only ドキュメントツール ksql_docs+全量関数カタログ instructions
MCP resources / prompts を中継しないクライアント経路(Claude Desktop のリモート接続プロキシで実測)では、v3.9.0 で公開した言語リファレンス resource(ksql://language-reference)に到達できず、AI が ksql_validate 総当たりで不完全な関数一覧を推定する事態が発生していました。本リリースで、どのクライアントでも届く tool 経由の導線を追加します。
機能追加
ksql_docs(新 read-only ツール): 引数なし=言語リファレンス・レシピの統合インデックス(全 40 キー)。section指定=resource と同一キー語彙(language-reference/<26 章キー>・recipes/r1..r12・ksql://URI 形も受理)で 1 章の markdown を返す。固定 map lookup のみで kintone API・資格情報に不触。未知キーは有効キー案内付き ArgumentError(fail-closed)。- server instructions に全量関数カタログを掲載(scalar 43・aggregate 6・window 3・contextual 3・alias 5・syntax)。「関数の有無を validate の試行錯誤で推定しない」導線を明示し、
ksql_validate/ksql_query/ksql_mutateの説明にもksql_docsを追記。カタログはパーサ実受理集合との双方向ドリフトガードで固定。 - 言語リファレンス §5 に
SUBSTRとエイリアス対応(SUBSTR→SUBSTRING・CONVERT→CAST・CEILING→CEIL・TRUNC→TRUNCATE・POW→POWER)を追記。
互換性
- プラグイン・CLI の SQL 実行挙動に変更なし(SemVer: minor)。既存 MCP resources は不変のまま並存。
検証
- 全 2,729 テスト green・mcp:smoke / pack-smoke / mcpb-verify ok
- 実機: 発端の resources 非対応経路(Claude Desktop)でプローブ抑止+全量関数回答を確認(docs/internal/evidence/b55_claude_desktop_smoke.md)
🤖 Generated with Claude Code
v3.11.0 — B51 CTE 間 JOIN 誤結果 修正 + B52 CTE 列別名インライン化 unknown field 修正
CTE 関連の2つの正しさバグ修正(両方 SemVer=minor)。B6(KLIKE 外部結合)の回避策検討中に実データ検証で発見。全2,718テスト green・本番 kintone 実データで確認。
B51 — 複数 CTE の CTE 間 JOIN が誤結果を返す(silent wrong results・優先度高)
2つ以上の CTE を CTE 同士で JOIN すると左 CTE の列が空・行重複・LEFT 未一致行欠落(誤った結果を静かに返す)。原因=CTE/一時テーブル参照が明示 alias なしだと alias:null→最終 JOIN の Map が null キー衝突で片側上書き+修飾キー欠落で空文字直積。修正=effectiveTableAlias = alias ?? cteName を識別・JOIN・WHERE/SELECT/ORDER/GROUP/メタ解決に一貫適用(明示 alias 優先・SELECT * 出力は非修飾維持)+alias 衝突/cache miss を fail-closed+applyJoin が空文字値と構造的キー欠落を区別してエラー化。
B52 — 単一 CTE の列別名がインライン化で解決されず unknown field(error)
WITH a AS (SELECT レコード番号 AS aid FROM APPx) SELECT a.aid FROM a が unknown field。原因=canInlineSingleCte が CTE 出力別名を考慮せずインライン化。修正=インライン化を SELECT */別名なし単純フィールド/同名別名のみに限定し、改名列別名・式・リテラル・関数・CASE ありの CTE は実体化(B51 の effective alias で正しく解決)。SELECT */同名フィールド CTE のインライン+WHERE 押し下げは維持。
実機(本番 kintone・APP730)
- B51: CTE 間 INNER JOIN が正しく2行(左列も正しい値)・LEFT で未一致行を NULL 保持・SELECT * 非回帰。
- B52: 別名 CTE の参照・算術式 CTE が正しく実体化・SELECT * CTE はインライン+WHERE 押し下げ維持。
アセット
- ksql-plugin-v3.11.0.zip — kintone プラグイン
- ksql-mcp.js — MCP サーバー(single-file bundle)
- ksql-mcp.mcpb — MCP Bundle
詳細は CHANGELOG.md を参照。
v3.10.0 — B7 プラグイン検索打ち切り検出 + B47 APPLY 親 WHERE LIKE/KLIKE + B5 通常親 UPDATE/DELETE KLIKE
3課題をまとめて出荷(すべて SemVer=minor・純加法・非破壊)。B7 が B47/B5 の KLIKE 解禁の安全前提(全 surface での10万件打ち切り検出)を用意する構成。全2,696テスト green・本番 kintone 実データで実機確認済。
B7 — プラグインでの検索打ち切り検出(安全性)
プラグイン getRecords のみを raw fetch 化し X-Cybozu-Warning(10万件打ち切り)を検出。GET 直列化は kintone に委譲(短い GET=kintone.api.urlForGet()、URL 4KB 超=POST + X-HTTP-Method-Override: GET・JSON body)。DML の fail-closed がプラグインでも効き、SELECT 打ち切りに警告。
B47 — APPLY 複数親 UPDATE の親 WHERE で LIKE/KLIKE(機能)
安全プレフィルタ→元 WHERE を JS 残余評価→一致した親だけ更新(候補数≠対象数・完全取得・target のみ dmlMaxRows・AST node identity 保持)。OR/NOT 配下など native query に完全適用できない KLIKE は records API 前に拒否。
B5 — 通常の親 UPDATE/DELETE の WHERE で KLIKE(機能)
whereToKintone が KLIKE→native like に変換する exact pushdown 経路に乗せる(残余不要・OR/NOT KLIKE も可)。安全境界は既存 EXACT_PUSHDOWN ガード。LIKE は通常 DML で拒否維持・サブテーブル DML の KLIKE も拒否維持。
実機(本番 kintone・実データ)
- B7: APP730(618,525件)で打ち切り警告・POST override(414 なし)。
- B47: APP4223 で LIKE 候補223→対象10・KLIKE 対象21・実 mutation は対象のみ書込・unapplied 拒否。
- B5: APP730 で
KLIKE 'ケン'(>10万件)→ SearchAbortedError(KLIKE DML の10万件 fail-closed を確定)・KLIKE UPDATE は対象のみ書込。
アセット
- ksql-plugin-v3.10.0.zip — kintone プラグイン
- ksql-mcp.js — MCP サーバー(single-file bundle)
- ksql-mcp.mcpb — MCP Bundle
詳細は CHANGELOG.md を参照。
v3.9.0 — B43 DML 事前検証 + B49 MCP メタデータ API + B50 MCP discoverability
3課題をまとめて出荷(すべて SemVer=minor・純加法・非破壊)。全2,613テスト green・MCP 実機確認は Claude・codex 両クライアントで pass。
B43 — DML 事前検証の complete post-image(安全性・正しさ)
UPDATE/UPSERT(update 分岐)の VALIDATE ONLY/ON ERROR SKIP が更新対象レコードの post-image(レコード全体・サブテーブル子行含む)を検証。SET 対象外・子行の既存違反による false pass を解消(B44 の validatePostImage 再利用・診断10列統一・ON ERROR SKIP は違反親を true isolation)。通常の UPDATE/UPSERT 実行の挙動は不変。
B49 — MCP 読み取り専用メタデータ API ksql_app_metadata(機能)
app/fields(制約)/layout/settings(数値精度)/status/views/reports/customize を生 JSON で取得(固定 GET allowlist・二層 read-only 強制・records/ACL/apps 除外・2 MiB 上限)。core interface/SQL/DESCRIBE/プラグインは不変。
B50 — MCP の能力・方言 discoverability(機能)
server instructions(能力索引+方言注意+行動導線)・言語リファレンス/レシピを MCP resource で公開(ksql://language-reference・ksql://recipes+章別 template・build 時 embed・fail-closed key)・tool description 用途起点改善+MCPB manifest 是正。
アセット
ksql-plugin-v3.9.0.zip— kintone プラグインksql-mcp.js— MCP サーバー(single-file bundle)ksql-mcp.mcpb— MCP Bundle
詳細は CHANGELOG.md を参照。
v3.8.0 — APPLY ブロック(B44)+ガード兼用(B48)+サブテーブル SELECT のシステム列 WHERE(B45)
v3.8.0
B44 — APPLY ブロック(テーブル外項目とテーブル内項目を1文=1 PUT で同時更新)
UPDATE/INSERT/UPSERT … APPLY <テーブル> (PATCH/APPEND/REMOVE…)。テーブル内に既存違反を持つレコードの修復書き込みを可能にする。
- PATCH(既存行更新)/APPEND(行追加)/REMOVE(行削除)・多値 ADD/REMOVE。
- 行アドレッシング:
ALL ROWS/WHERE 行条件/_idx(0-based)/_rid。EXPECT ROWS n | BETWEEN | AT LEAST | AT MOST。 - スナップショット意味論・post-image 検証(書き込み前にレコード全体を検証)。
- 複数親 UPDATE /
INSERT APPLY/UPSERT APPLY(非トランザクション・部分成功あり)。 - revision 必須+二重ガード(
dmlMaxRows親件数 /dmlMaxSubtableRows子行・既定500)。MCP は全 APPLY mutation を実行前 fail-closed(VALIDATE ONLY / EXPLAIN は許可)。
B48 — プラグインの APPLY 親/子ガードを「最大取得件数」から兼用
dmlMaxRows=max(100, 最大取得件数)・dmlMaxSubtableRows=max(500, 最大取得件数)。新設定 UI なし・floor で後方互換。100 親超の一括更新が可能に。
B45 — サブテーブル SELECT の WHERE でシステム列 _pid/_rid/_idx
旧 WHERE_FIELD_UNRESOLVED(言語リファレンス §19 の記載例が動かない乖離)を修正。_pid/_idx=数値・_rid=文字列・全比較/BETWEEN/IN/IS NULL/LIKE 対応・非押し下げ・_p._pid は無効維持。
- 全 2,474 テスト green・mcp smoke/pack-smoke ok。実機確認: B44(CLI/プラグイン)・B48(プラグイン親200/子600)・B45(CLI 全10項目)。
- SemVer=minor。詳細は CHANGELOG。
アセット
ksql-plugin-v3.8.0.zip— kintone プラグインksql-mcp.js— MCP サーバ(単一ファイル)ksql-mcp.mcpb— MCP バンドル