Skip to content

PutItem and UpdateItem: the nesting refusal at 32 and 33 levels has no 1 validation error detected: prefix, and PutItem reports a missing table first #814

Open

Description

@LeeroyHannigan

The service refuses an item attribute or an ExpressionAttributeValues value with 32 or 33 maps around its leaf with 1 validation error detected: Nesting Levels have exceeded supported limits: Attributes in the item have nested levels beyond supported limit. From 63 maps up it sends the same sentence without the prefix. ExtendDB sends the sentence without the prefix at every depth from 32 to 62 maps, and fails to parse deeper bodies (#807). The service also checks the nesting of a PutItem item before it looks up the table, so a missing table with a 32-level item answers the nesting refusal. ExtendDB looks up the table first and answers ResourceNotFoundException.

Measured against Amazon DynamoDB in us-east-1 on 2 November 2026, one request per row: the missing-table rows with signed raw JSON request bodies, the existing-table rows with boto3. Table pk S HASH; x is n maps {"M": {"n": ...}} around {"S": "leaf"}; the UpdateItem rows run SET x = :v on an existing item with :v built the same way. ExtendDB answers are from main eaf16e89e (SQLite, debug build).

Request DynamoDB ExtendDB main eaf16e89e (SQLite)
PutItem, x with 31 maps stored stored
PutItem, x with 32 maps ValidationException: 1 validation error detected: Nesting Levels have exceeded supported limits: Attributes in the item have nested levels beyond supported limit ValidationException: Nesting Levels have exceeded supported limits: Attributes in the item have nested levels beyond supported limit
PutItem, x with 33 maps the prefixed text the text without the prefix
UpdateItem, :v with 32 maps, and with 33 the prefixed text the text without the prefix
PutItem, x with 34 or 62 maps not sent the text without the prefix
PutItem on a missing table, 31 maps ResourceNotFoundException: Requested resource not found the same
PutItem on a missing table, 32 maps, and 33 the prefixed text ResourceNotFoundException: Requested resource not found
PutItem on a missing table, 63, 64, 100, 128, 256, 1000 or 2000 maps the text without the prefix not sent on a missing table; on an existing table, from 63 maps: SerializationException: Start of structure or map found where not expected: recursion limit exceeded at line 1 column 817

Where the answer comes from

crates/core/src/validation/mod.rs: both depth checks, validate_item_nesting_depth (line 2514) and validate_attribute_values_nesting_depth (line 2523), refuse with nesting_depth_error (line 2561), which has one text for every depth and every caller. handle_put_item looks up the table (crates/engine/src/put_item.rs, line 176) before validate_put_item (line 181), which runs the item check (validation/mod.rs, line 1091). handle_update_item also looks up the table (crates/engine/src/update_item.rs, line 208) before it checks the values (line 240).

Not measured

The service's text from 34 to 62 maps; lists ({"L": [...]}) at 32 and 33 levels; UpdateItem and DeleteItem on a missing table; the full text for a 32-level value that only a ConditionExpression reads (main's tests check a substring); BatchWriteItem and TransactWriteItems.

Related

#807 (open) parses request bodies past serde_json's recursion limit, which removes the SerializationException from 63 maps up. #574 and #590 cover an update whose result nests too deep, where the service sends the short sentence Nesting Levels have exceeded supported limits. #574 also quotes the PutItem refusal without the prefix (measured 25 October); the raw response bodies above carry the prefix at 32 and 33 maps. #720, #721 and #564 cover 32-level values on Query and Scan, where the service's text has no prefix. In PartiQL (#411) the service answers a 32-level item with the short sentence.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions