Repository navigation
Description
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