ValidationException: Unexpected from source
TL;DR — PartiQL の FROM 句にあるテーブル名に、パーサーが裸では受け付けない文字 — たいていはダッシュ — が含まれています。名前をダブルクォートで囲んでください(SELECT * FROM "my-table")。シングルクォートでは動きません。PartiQL ではシングルクォートは識別子ではなく文字列リテラルを意味します。
意味
ValidationException: Unexpected from sourcePartiQL のパーサーは FROM my-table を、識別子 my の後に予期しないトークンが続いたものとして読みます — ダッシュは裸の識別子の中では有効ではありません。DynamoDB のテーブル名は -、.、_ を正当に含めるので、まったく正しいテーブル名でも、クォートするまで PartiQL では解析できないことがあります。PartiQL のキーワードと衝突する名前にも同じことが当てはまります。
発生する理由
- テーブル名にダッシュやドットが含まれている —
users-prod、app.eventsなど。裸の識別子はそれらを持てません。 - フレームワークが生成したテーブル名 — 環境やステージをテーブル名にサフィックスとして付けるツール(例:
Todo-dev)は、自分で選ばないままダッシュが混入する典型的な経路です。 - クォートなしでインデックスをクエリしている —
"table"."index"の形式では、両方の部分をダブルクォートで囲む必要があります。 - ダブルではなくシングルクォート —
FROM 'my-table'も失敗します。PartiQL ではシングルクォートは名前ではなく文字列リテラルを表します。
修正方法
テーブル名をダブルクォートで囲みます:
SELECT * FROM "users-prod" WHERE pk = 'USER#42'インデックスをクエリするときは両方の部分をダブルクォートで囲みます:
SELECT * FROM "users-prod"."email-index" WHERE email = 'ada@example.com'シングルクォートは文字列の値だけに使います — 名前はダブルクォート、値はシングルクォートです。混同すると、まさにこの種の構文解析エラーになります。
生成する文では防御的にクォートします — コードがテーブル名を PartiQL に埋め込むなら、常にダブルクォート付きで出力しましょう。厳密には不要な名前でも有効です。
DynoTable の PartiQL エディタは識別子のクォートを代わりに処理し、まさにこの種の構文解析エラーにインラインの診断とクイックフィックスを提供します。また DynamoDB Expression Builder は、PartiQL の解析を完全に回避したいときに同等のネイティブな Query/Scan リクエストを表示します。
DynoTable で実行する
DynoTable の PartiQL エディタは、テーブル名とインデックス名を自動でダブルクォートで囲みます — SELECT * FROM "my-table" をインラインの診断付きで実行してから、その文を SDK のコードに貼り付けましょう。⌘K でテーブルを開けば、サイドバーから(ハイフンを含む)正確なテーブル名を確認できます。
PartiQL の解析が失敗し続けるときは、クエリビルダーに切り替えて同等のネイティブなリクエストを組み立てましょう。プロファイルの切り替え(⌘P)と Settings → Profiles の Test Connection が、文を正しいテーブルに向け続けてくれます。AWS に接続するとインストールを参照してください。
出典
- PartiQL select statements for DynamoDB (2026-07-13 時点で検証)
- Supported data types and naming rules (2026-07-13 時点で検証)
再現方法
FROM のソースがテーブル名ではない PartiQL の文です。パーサーはテーブルを探す前に拒否するので、どのエンドポイントでも再現します。
await client.send(new ExecuteStatementCommand({Statement: 'SELECT * FROM 123'}));実際の出力:
ValidationException: Unexpected from source
HTTP 400クォートされていないが正当な名前と比べてみてください。SELECT * FROM repro は問題なく解析され、そんなテーブルが存在しなければ後段で ResourceNotFoundException として失敗します。Unexpected from source は厳密に 解析 の失敗なので、テーブル欠落のサインではなく構文のサインとして読んでください。
関連するエラー
- DuplicateItemException — 既存のキーに対する PartiQL の
INSERT。 - ValidationException — 親となる例外クラス。
- 学習: PartiQL の例 · DynamoDB のための SQL
参考資料
- PartiQL select statements for DynamoDB — Amazon DynamoDB Developer Guide
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
2026-07-26 に DynamoDB Local 2.x と AWS SDK for JavaScript v3.1095.0 で再現しました — 上記の出力はそのままの逐語です。