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 の PartiQL エディタは識別子のクォートを代わりに処理し、まさにこの種の構文解析エラーにインラインの診断とクイックフィックスを提供します。また DynamoDB Expression Builder は、PartiQL の解析を完全に回避したいときに同等のネイティブな Query/Scan リクエストを表示します。

DynoTable で実行する

DynoTable の PartiQL エディタは、テーブル名とインデックス名を自動でダブルクォートで囲みます — SELECT * FROM "my-table" をインラインの診断付きで実行してから、その文を SDK のコードに貼り付けましょう。⌘K でテーブルを開けば、サイドバーから(ハイフンを含む)正確なテーブル名を確認できます。

PartiQL の解析が失敗し続けるときは、クエリビルダーに切り替えて同等のネイティブなリクエストを組み立てましょう。プロファイルの切り替え(⌘P)と Settings → Profiles の Test Connection が、文を正しいテーブルに向け続けてくれます。AWS に接続するインストールを参照してください。

出典

再現方法

FROM のソースがテーブル名ではない PartiQL の文です。パーサーはテーブルを探す前に拒否するので、どのエンドポイントでも再現します。

await client.send(new ExecuteStatementCommand({Statement: 'SELECT * FROM 123'}));

実際の出力:

ValidationException: Unexpected from source
HTTP 400

クォートされていないが正当な名前と比べてみてください。SELECT * FROM repro は問題なく解析され、そんなテーブルが存在しなければ後段で ResourceNotFoundException として失敗します。Unexpected from source は厳密に 解析 の失敗なので、テーブル欠落のサインではなく構文のサインとして読んでください。

関連するエラー

参考資料

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

2026-07-26 に DynamoDB Local 2.x と AWS SDK for JavaScript v3.1095.0 で再現しました — 上記の出力はそのままの逐語です。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。