ValidationException: Unexpected from source

TL;DR — PartiQL の FROM 句のテーブル名に、パーサーが素で受け付けない文字 — 通常はダッシュ — が含まれています。名前を 二重引用符 で囲みます(SELECT * FROM "my-table")。単一引用符は機能しません: PartiQL では識別子ではなく文字列リテラルを意味します。

意味

ValidationException: Unexpected from source

PartiQL パーサーは FROM my-table を、識別子 my の後に予期しないトークンが続くものとして読みます。ダッシュは素の識別子の中では有効ではありません。DynamoDB のテーブル名は -._ を合法的に含めるため、まったく有効なテーブル名でも、引用符で囲まれるまで PartiQL では解析不能なことがあります。PartiQL のキーワードと衝突する名前にも同じことが当てはまります。

発生する理由

  • テーブル名にダッシュまたはドットが含まれるusers-prodapp.events。素の識別子はそれらを運べません。
  • フレームワークが生成したテーブル名 — 環境やステージをテーブル名にサフィックスとして付けるツール(例: Todo-dev)は、あなたが選ばないうちにダッシュが入る典型的な方法です。
  • 引用符なしでインデックスを照会"table"."index" の形式は両方の部分の周りに二重引用符が必要です。
  • 二重引用符ではなく単一引用符FROM 'my-table' も失敗します: 単一引用符は PartiQL では名前ではなく文字列リテラルを示します。

修正方法

  1. テーブル名を二重引用符で囲みます:

    SELECT * FROM "users-prod" WHERE pk = 'USER#42'
  2. インデックスを照会するときは両方の部分を二重引用符で囲みます:

    SELECT * FROM "users-prod"."email-index" WHERE email = 'ada@example.com'
  3. 単一引用符は文字列値のみに使います — 名前は二重引用符、値は単一引用符。それらを取り違えると、まさにこの種の解析エラーが生じます。

  4. 生成された文で防御的に引用します — コードがテーブル名を PartiQL に補間する場合、常に二重引用符で出力します。名前が厳密には必要としない場合でも有効です。

DynoTable デスクトップアプリ は、識別子の引用を代わりに処理する DynamoDB 用の SQL ワークベンチを備えており、DynamoDB Expression Builder は PartiQL の解析を完全に回避したいときに、それに相当するネイティブの Query/Scan リクエストを表示します。

関連するエラー

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。