ValidationException: Unexpected from source

요약 — PartiQL FROM 절의 테이블 이름에 파서가 그대로 받아들이지 않는 문자가 있습니다 — 보통 대시입니다. 이름을 큰따옴표로 감싸세요(SELECT * FROM "my-table"). 작은따옴표는 작동하지 않습니다: PartiQL에서 작은따옴표는 식별자가 아니라 문자열 리터럴을 의미합니다.

무엇을 의미하나요

ValidationException: Unexpected from source

PartiQL 파서는 FROM my-table을 식별자 my 뒤에 예상치 못한 토큰이 오는 것으로 읽습니다 — 대시는 그대로의 식별자 안에서 유효하지 않습니다. DynamoDB 테이블 이름은 합법적으로 -, ., _를 포함할 수 있으므로, 완벽하게 유효한 테이블 이름도 따옴표로 묶기 전까지는 PartiQL에서 파싱할 수 없을 수 있습니다. 같은 것이 PartiQL 키워드와 충돌하는 이름에도 적용됩니다.

왜 발생하나요

  • 테이블 이름에 대시나 점이 있음users-prod, app.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

공식 AWS 문서(위 링크)를 기준으로 2026-07-13에 마지막으로 검증되었습니다.

Console 없이 DynamoDB 작업하기

DynoTable은 DynamoDB를 위한 빠른 데스크톱 클라이언트입니다 — 테이블을 탐색하고, SQL 스타일 쿼리를 실행하고, 항목을 로컬에서 편집하세요.