How to run it
Every way Kumo is distributed, each linking to the project's own documentation for it. These are the project's claims, not the suite's measurements.
Needs: none - a single Go binary, or Docker for the image
Per-region divergence
The headline is 5 regions, measured against 5 of 33 observed regions, and scored in af-south-1. Real DynamoDB doesn't behave identically in every region, so a target can match some regions more closely than others. Each figure below is divergence in those regions, best first. eu-west-2 is marked as the historical baseline, and a region that couldn't be resolved this sweep is flagged rather than counted as a disagreement.
Feature support
Measured across the suite's tests for each feature. Compare with other emulators.
Core DynamoDB
- Vector search
- Kumo Vector search: not supported (52 skip)
- GSI
- Kumo GSI: partially supported (26 pass, 77 fail, 73 skip)
- LSI
- Kumo LSI: partially supported (22 pass, 63 fail, 73 skip)
- PartiQL
- Kumo PartiQL: not supported (210 skip)
- Transactions
- Kumo Transactions: partially supported (44 pass, 71 fail)
- Streams
- Kumo Streams: partially supported (16 pass, 2 fail)
- TTL
- Kumo TTL: partially supported (6 pass, 1 fail)
- Legacy params
- Kumo Legacy params: partially supported (18 pass, 31 fail)
Other AWS services
- Backups / PITR
- Kumo Backups / PITR: partially supported (1 pass, 1 fail, 3 skip)
- Export / import
- Kumo Export / import: not supported (2 skip)
- Kinesis
- Kumo Kinesis: not supported (1 skip)
- Resource policies
- Kumo Resource policies: not supported (2 skip)
- Contributor Insights
- Kumo Contributor Insights: not supported (2 skip)
- Account API
- Kumo Account API: not supported (2 skip)
Fully supports
Operation areas this target implements completely - every test passes, nothing skipped. Areas it only partly gets wrong are in “Where it falls short” below; the ones it only partly attempts are in “What it doesn’t attempt”.
- deleteTable tier 1
- listTables tier 1
Divergence and coverage over time
By operation
Every operation this target implements, with how much of it diverges and how much of it it covers, on the same two axes as the figures above. The counts are fails over the operation's whole size. full, partial, failing, unsupported. The emulator directory lists support across targets.
Tier 1 - Core
- batchGetItem 4/15 26.7% 100.0% batchGetItem: partially supported, diverges on 26.7% of it, covers 100.0% (11 pass, 4 fail)
- batchWriteItem 7/18 38.9% 100.0% batchWriteItem: partially supported, diverges on 38.9% of it, covers 100.0% (11 pass, 7 fail)
- createTable 14/30 46.7% 100.0% createTable: partially supported, diverges on 46.7% of it, covers 100.0% (16 pass, 14 fail)
- deleteItem 1/13 7.7% 100.0% deleteItem: partially supported, diverges on 7.7% of it, covers 100.0% (12 pass, 1 fail)
- deleteTable 0/3 0.0% 100.0% deleteTable: supported, diverges on 0.0% of it, covers 100.0% (3 pass)
- describeTable 1/4 25.0% 100.0% describeTable: partially supported, diverges on 25.0% of it, covers 100.0% (3 pass, 1 fail)
- getItem 27/39 69.2% 100.0% getItem: partially supported, diverges on 69.2% of it, covers 100.0% (12 pass, 27 fail)
- listTables 0/5 0.0% 100.0% listTables: supported, diverges on 0.0% of it, covers 100.0% (5 pass)
- putItem 82/129 63.6% 100.0% putItem: partially supported, diverges on 63.6% of it, covers 100.0% (47 pass, 82 fail)
- query 30/95 31.6% 100.0% query: partially supported, diverges on 31.6% of it, covers 100.0% (65 pass, 30 fail)
- scan 25/60 41.7% 100.0% scan: partially supported, diverges on 41.7% of it, covers 100.0% (35 pass, 25 fail)
- updateItem 32/70 45.7% 100.0% updateItem: partially supported, diverges on 45.7% of it, covers 100.0% (38 pass, 32 fail)
- updateTable 11/15 73.3% 100.0% updateTable: partially supported, diverges on 73.3% of it, covers 100.0% (4 pass, 11 fail)
Tier 2 - Complete
- account 0/2 · 2 skip n/a 0.0% account: unsupported, implements none of it (2 skip)
- backups 1/5 · 3 skip 20.0% 40.0% backups: partially supported, diverges on 20.0% of it, covers 40.0% (1 pass, 1 fail, 3 skip)
- contributorInsights 0/2 · 2 skip n/a 0.0% contributorInsights: unsupported, implements none of it (2 skip)
- export 0/2 · 2 skip n/a 0.0% export: unsupported, implements none of it (2 skip)
- kinesis 0/1 · 1 skip n/a 0.0% kinesis: unsupported, implements none of it (1 skip)
- partiql 0/186 · 186 skip n/a 0.0% partiql: unsupported, implements none of it (186 skip)
- resourcePolicy 0/2 · 2 skip n/a 0.0% resourcePolicy: unsupported, implements none of it (2 skip)
- streams 2/18 11.1% 100.0% streams: partially supported, diverges on 11.1% of it, covers 100.0% (16 pass, 2 fail)
- tags 2/8 25.0% 100.0% tags: partially supported, diverges on 25.0% of it, covers 100.0% (6 pass, 2 fail)
- transactions 29/62 46.8% 100.0% transactions: partially supported, diverges on 46.8% of it, covers 100.0% (33 pass, 29 fail)
- ttl 1/7 14.3% 100.0% ttl: partially supported, diverges on 14.3% of it, covers 100.0% (6 pass, 1 fail)
- updateTable 13/14 92.9% 100.0% updateTable: partially supported, diverges on 92.9% of it, covers 100.0% (1 pass, 13 fail)
- vectorSearch 0/36 · 36 skip n/a 0.0% vectorSearch: unsupported, implements none of it (36 skip)
Tier 3 - Strict
- error-messages 146/184 · 30 skip 79.3% 83.7% error-messages: partially supported, diverges on 79.3% of it, covers 83.7% (8 pass, 146 fail, 30 skip)
- legacy-api 24/42 57.1% 100.0% legacy-api: partially supported, diverges on 57.1% of it, covers 100.0% (18 pass, 24 fail)
- limits 93/150 · 5 skip 62.0% 96.7% limits: partially supported, diverges on 62.0% of it, covers 96.7% (52 pass, 93 fail, 5 skip)
- validation-ordering 22/34 · 3 skip 64.7% 91.2% validation-ordering: partially supported, diverges on 64.7% of it, covers 91.2% (9 pass, 22 fail, 3 skip)
Where it falls short
Operations Kumo implements and answers differently from real DynamoDB, biggest gap first. This is what its divergence figure counts. Open one for the exact tests, or see the conformance suite.
-
error-messages Tier 3 146 diverging 30 not attempted
View these tests in the suite →- BatchGetItem - exact error messages empty RequestItems: full required-parameter error source:27
- BatchGetItem - exact error messages > 100 keys across all tables: interpolated full error source:47
- BatchGetItem - exact error messages non-existent table: full ResourceNotFoundException message source:70
- BatchGetItem - exact error messages duplicate keys in one Keys array: full duplicate-keys error source:92
- BatchGetItem - exact error messages AttributesToGet with ProjectionExpression in a KeysAndAttributes block: full conflict error source:118
- BatchGetItem - exact error messages empty-binary lookup key: full empty-value message source:139
- BatchGetItem - exact error messages mixing ProjectionExpression on one table and AttributesToGet on another is rejected source:165
- BatchGetItem - ProjectionExpression rejection messages duplicate paths (a, a) reject even when the key matches no item source:194
- BatchGetItem - ProjectionExpression rejection messages two distinct aliases resolving to one attribute (#a, #b -> a): rejected on the resolved names source:207
- BatchGetItem - ProjectionExpression rejection messages overlapping parent and child paths (a, a.b): full overlap message source:220
- BatchGetItem - ProjectionExpression rejection messages a bad projection on one table entry rejects the whole batch despite a clean entry on another source:249
- BatchWriteItem - exact error messages empty RequestItems: full required-parameter error source:41
- BatchWriteItem - exact error messages > 25 requests: anchored regex on the constraint phrase source:90
- BatchWriteItem - exact error messages same key Put and Delete in one batch: full duplicate-keys error source:108
- BatchWriteItem - exact error messages non-existent table: full ResourceNotFoundException message source:133
- BatchWriteItem - exact error messages empty-string table key: full empty-value message source:154
- BatchWriteItem - exact error messages empty-binary put-request key: full empty-value message source:154
- BatchWriteItem - exact error messages empty-binary delete-request key: full empty-value message source:154
- Conditional check - exact error messages TransactionCanceledException message format source:174
- Conditional check - exact error messages ReturnValuesOnConditionCheckFailure: ALL_OLD returns item in error source:210
- CreateTable - exact error messages missing TableName: full required-parameter error source:32
- CreateTable - exact error messages short table name (2 chars): minimum length 3 error source:50
- CreateTable - exact error messages duplicate attribute in KeySchema source:73
- CreateTable - exact error messages more than 2 KeySchema elements source:101
- CreateTable - exact error messages invalid KeyType source:135
- CreateTable - exact error messages invalid AttributeType source:156
- CreateTable - exact error messages LSI without range key on base table source:189
- CreateTable - exact error messages duplicate index names source:231
- CreateTable - exact error messages PAY_PER_REQUEST with ProvisionedThroughput: full conflict message source:252
- CreateTable - exact error messages GSI INCLUDE projection without NonKeyAttributes: full missing-attributes message source:282
- CreateTable - exact error messages LSI INCLUDE projection without NonKeyAttributes: full missing-attributes message source:321
- CreateTable - exact error messages StreamSpecification StreamEnabled:false with a StreamViewType: full conflict message source:345
- DeleteItem - exact error messages non-existent table: full ResourceNotFoundException message source:29
- DeleteItem - exact error messages mixing Expected with ConditionExpression: full conflict error source:68
- DeleteItem - exact error messages empty-binary key value: full ValidationException message source:88
- GetItem - exact error messages non-existent table: full ResourceNotFoundException message source:32
- GetItem - exact error messages invalid ProjectionExpression syntax: full parser error source:67
- GetItem - exact error messages empty-binary key value: full ValidationException message source:87
- GetItem - ProjectionExpression rejection messages raw duplicate paths (a, a): full overlap message with the path on both sides source:119
- GetItem - ProjectionExpression rejection messages same alias twice (#a, #a): full overlap message source:132
- GetItem - ProjectionExpression rejection messages two distinct aliases resolving to one attribute (#a, #b -> a): rejected on the resolved names source:150
- GetItem - ProjectionExpression rejection messages raw path plus alias for the same attribute (a, #a): full overlap message source:163
- GetItem - ProjectionExpression rejection messages raw parent and child paths (a, a.b): full overlap message source:176
- GetItem - ProjectionExpression rejection messages aliased parent and child paths (#a, #a.#b): full overlap message source:189
- GetItem - ProjectionExpression rejection messages child before parent (a.b, a): rejected with the paths in request order source:202
- GetItem - ProjectionExpression rejection messages cross-alias overlap (#x, #y.#b with #x and #y -> a): rejected on the resolved paths source:215
- GetItem - ProjectionExpression rejection messages deep overlap (a, a.b.c): full overlap message with the three-element path source:228
- GetItem - ProjectionExpression rejection messages list parent and list index (l, l[0]): rejected as an overlap source:245
- GetItem - ProjectionExpression rejection messages undefined attribute name (#undef): full undefined-name message source:258
- BatchWriteItem - index key error messages wrong-typed index key: full type-mismatch message source:52
- BatchWriteItem - index key error messages non-scalar index key: full type-mismatch message source:52
- BatchWriteItem - index key error messages empty-string index key: full secondary-index-key message source:52
- BatchWriteItem - index key error messages empty-binary index key: full secondary-index-key message source:52
- PutItem - index key error messages empty-binary index key value: full secondary-index-key message source:124
- UpdateItem - index key error messages empty-binary index key value: full secondary-index-key message source:148
- Query - index error messages ConsistentRead on GSI source:30
- Scan - index error messages ConsistentRead on a GSI: full consistent-reads-unsupported message source:52
- PutItem - exact error messages missing table name: full validation error string source:37
- PutItem - exact error messages empty table name: minimum length 1 error source:62
- PutItem - exact error messages table name too long (256 chars): maximum length 255 error source:79
- PutItem - exact error messages table name with invalid chars: regex pattern error source:97
- PutItem - exact error messages empty string set: full parameter-values-invalid error source:114
- PutItem - exact error messages empty number set: full parameter-values-invalid error source:132
- PutItem - exact error messages duplicate values in SS: full duplicates error source:150
- PutItem - exact error messages empty binary set: full parameter-values-invalid error source:173
- PutItem - exact error messages empty string member in NS: numeric conversion error source:196
- PutItem - exact error messages duplicate empty string members in SS: full duplicates error source:214
- PutItem - exact error messages duplicate zero-length members in BS: full duplicates error source:238
- PutItem - exact error messages rejects a { NULL: false } attribute value with a ValidationException source:271
- PutItem - exact error messages mixing expression and non-expression: full conflict error source:292
- PutItem - exact error messages ExpressionAttributeValues without expression: full unused-EAV error source:310
- PutItem - exact error messages redundant parentheses in ConditionExpression: full error string source:329
- PutItem - exact error messages contains() with duplicate path and operand: full distinct-operand error source:350
- PutItem - exact error messages empty-binary item key value: full ValidationException message source:369
- Query - exact error messages missing hash key in KeyConditionExpression source:28
- Query - exact error messages non-key attribute in KeyConditionExpression source:47
- Query - exact error messages unused ExpressionAttributeNames source:67
- Query - exact error messages invalid Select value source:88
- Query - exact error messages Limit of 0 source:108
- Query - exact error messages empty KeyConditionExpression source:127
- Query - exact error messages filter references undefined ExpressionAttributeNames source:147
- Query - exact error messages redundant parentheses in KeyConditionExpression: full error string source:166
- Query - exact error messages malformed ExclusiveStartKey: short invalid-starting-key error source:188
- Query - exact error messages Select SPECIFIC_ATTRIBUTES without ProjectionExpression: full required-projection message source:212
- Query - ProjectionExpression rejection messages duplicate paths (a, a) reject even when the key condition matches no partition source:250
- Query - ProjectionExpression rejection messages two distinct aliases resolving to one attribute (#a, #b -> a): rejected on the resolved names source:263
- Query - ProjectionExpression rejection messages overlapping parent and child paths (a, a.b) reject even when the key condition matches no partition source:276
- Query - ProjectionExpression rejection messages duplicate paths still reject when the key condition matches a partition (control) source:299
- Scan - exact error messages Segment without TotalSegments: full required-parameter error source:30
- Scan - exact error messages Segment >= TotalSegments: full out-of-range error source:49
- Scan - exact error messages TotalSegments without Segment: full required-parameter error source:67
- Scan - exact error messages Limit of 0: full minimum-value error source:83
- Scan - exact error messages non-existent table: full ResourceNotFoundException message source:104
- Scan - exact error messages begins_with with non-string operand: full operand-type error source:122
- Scan - exact error messages redundant parentheses in FilterExpression: full error string source:142
- Scan - exact error messages malformed ExclusiveStartKey: long schema-mismatch error source:162
- Scan - exact error messages Select SPECIFIC_ATTRIBUTES without ProjectionExpression: full required-projection message source:182
- Scan - ProjectionExpression rejection messages duplicate paths (a, a) reject even when the filter matches nothing source:218
- Scan - ProjectionExpression rejection messages two distinct aliases resolving to one attribute (#a, #b -> a): rejected on the resolved names source:231
- Scan - ProjectionExpression rejection messages overlapping parent and child paths (a, a.b) reject even when the filter matches nothing source:244
- Scan - ProjectionExpression rejection messages rejects an undefined projection name even when the scan matches nothing source:259
- Scan - ProjectionExpression rejection messages duplicate paths still reject when the filter matches a row (control) source:282
- TransactGetItems - exact error messages empty TransactItems: full minimum-length error source:20
- TransactGetItems - exact error messages > 100 gets: anchored regex on the constraint phrase source:45
- TransactGetItems - exact error messages non-existent table: full ResourceNotFoundException message source:69
- TransactGetItems - exact error messages invalid ProjectionExpression syntax: full parser error source:94
- TransactGetItems - exact error messages missing key attribute: action-level ValidationError surfaces as TransactionCanceledException source:121
- TransactWriteItems - index key error messages Put wrong-typed index key: cancelled with full ValidationError reason source:54
- TransactWriteItems - index key error messages Put non-scalar index key: cancelled with full ValidationError reason source:54
- TransactWriteItems - index key error messages Update wrong-typed index key: cancelled with full ValidationError reason source:54
- TransactWriteItems - index key error messages Update non-scalar index key: cancelled with full ValidationError reason source:54
- TransactWriteItems - index key error messages Put empty-string index key: top-level ValidationException source:75
- TransactWriteItems - index key error messages Update empty-string index key: top-level ValidationException source:75
- TransactWriteItems - index key error messages Put empty-binary index key: top-level ValidationException source:75
- TransactWriteItems - index key error messages Update empty-binary index key: top-level ValidationException source:75
- TransactWriteItems - exact error messages empty TransactItems: full minimum-length error source:45
- TransactWriteItems - exact error messages > 100 actions: anchored regex on the constraint phrase source:74
- TransactWriteItems - exact error messages duplicate target keys in same transaction: full multi-op error source:100
- TransactWriteItems - exact error messages non-existent table: full ResourceNotFoundException message source:128
- TransactWriteItems - exact error messages two failing actions: multi-reason TransactionCanceledException source:181
- TransactWriteItems - exact error messages one passing, one failing: positional reason codes (None for the survivor) source:229
- TransactWriteItems - exact error messages Put wrong-typed table key: cancelled with full ValidationError reason source:255
- TransactWriteItems - exact error messages Put non-scalar table key: cancelled with full ValidationError reason source:255
- TransactWriteItems - exact error messages Put empty-string table key: top-level ValidationException source:276
- TransactWriteItems - exact error messages Update empty-string Key: top-level empty-value message source:276
- TransactWriteItems - exact error messages Delete empty-string Key: top-level empty-value message source:276
- TransactWriteItems - exact error messages ConditionCheck empty-string Key: top-level empty-value message source:276
- TransactWriteItems - exact error messages Update wrong-typed Key: cancelled with schema-mismatch reason source:255
- TransactWriteItems - exact error messages Update non-scalar Key: cancelled with schema-mismatch reason source:255
- TransactWriteItems - exact error messages Delete wrong-typed Key: cancelled with schema-mismatch reason source:255
- TransactWriteItems - exact error messages Delete non-scalar Key: cancelled with schema-mismatch reason source:255
- TransactWriteItems - exact error messages ConditionCheck wrong-typed Key: cancelled with schema-mismatch reason source:255
- TransactWriteItems - exact error messages ConditionCheck non-scalar Key: cancelled with schema-mismatch reason source:255
- TransactWriteItems - exact error messages Put empty-binary item key: top-level empty-value message source:276
- TransactWriteItems - exact error messages Update empty-binary Key: top-level empty-value message source:276
- TransactWriteItems - exact error messages Delete empty-binary Key: top-level empty-value message source:276
- TransactWriteItems - exact error messages ConditionCheck empty-binary Key: top-level empty-value message source:276
- UpdateItem - exact error messages cannot update hash key attribute source:45
- UpdateItem - exact error messages invalid UpdateExpression syntax source:63
- UpdateItem - exact error messages unused ExpressionAttributeNames source:87
- UpdateItem - exact error messages unused ExpressionAttributeValues source:107
- UpdateItem - exact error messages missing ExpressionAttributeValues reference source:126
- UpdateItem - exact error messages mixing UpdateExpression with AttributeUpdates source:149
- UpdateItem - exact error messages empty UpdateExpression source:168
- UpdateItem - exact error messages cannot update range key attribute on composite table source:190
- UpdateItem - exact error messages empty-binary key value: full ValidationException message source:210
- PartiQL - exact error messages DELETE RETURNING MODIFIED OLD * - exact message
- PartiQL - exact error messages DELETE RETURNING ALL NEW * - exact message
- PartiQL - exact error messages DELETE RETURNING MODIFIED NEW * - exact message
- PartiQL - exact error messages ExecuteTransaction with a RETURNING member - exact message
- PartiQL - exact error messages an ordering comparison on an unordered operand - exact message
- PartiQL index qualifier - exact error messages unprojected filter attribute on a GSI - exact message
- PartiQL index qualifier - exact error messages unprojected filter attribute on an LSI - same wording, no Local prefix
- PartiQL index qualifier - exact error messages unprojected projection attribute on a GSI - exact message
- PartiQL index qualifier - exact error messages a qualifier naming no index - exact message, with no name appended
- PartiQL index qualifier - exact error messages a qualifier naming the table itself - same message
- PartiQL index qualifier - exact error messages a three-component path - exact message
- PartiQL index qualifier - exact error messages an empty index component - exact message
- PartiQL index qualifier - exact error messages ConsistentRead against a GSI qualifier - exact message
- PartiQL index qualifier - exact error messages an index-qualified read inside a transaction - exact message
- SearchVectors - exact error messages TopK above the maximum
- SearchVectors - exact error messages missing SearchConditionExpression against a HASH-schema index
- SearchVectors - exact error messages non-equality comparator on the HASH element
- SearchVectors - exact error messages non-equality comparator on an INLINE_FILTER element
- SearchVectors - exact error messages query vector dimension mismatch
- SearchVectors - exact error messages condition attribute outside the SearchSchema
- SearchVectors - exact error messages L-wrapped search vector
- CreateTable vector indexes - exact error messages vector index on a provisioned table
- CreateTable vector indexes - exact error messages SearchSchema attribute missing from AttributeDefinitions
- CreateTable vector indexes - exact error messages Dimensions above the 4096 maximum
- CreateTable vector indexes - exact error messages more vector indexes than the per-table limit
- CreateTable vector indexes - exact error messages two indexes on one attribute with different Dimensions
- PutItem vector writes - exact error messages vector with the wrong dimension count
- PutItem vector writes - exact error messages vector element that is not a number, naming the element
- PutItem vector writes - exact error messages vector attribute that is not a list
- PutItem vector writes - exact error messages empty string in the SearchSchema HASH attribute
-
limits Tier 3 93 diverging 5 not attempted
View these tests in the suite →- Empty values - strings, binary, and sets empty string as hash key value is rejected source:56
- Empty values - strings, binary, and sets empty string as sort key value is rejected source:69
- Empty values - strings, binary, and sets empty string set (SS) is rejected source:102
- Empty values - strings, binary, and sets empty number set (NS) is rejected source:116
- Empty values - strings, binary, and sets empty binary set (BS) is rejected source:130
- Empty values - strings, binary, and sets empty string member in NS is rejected (not a number) source:224
- Empty values - strings, binary, and sets duplicate empty string members in SS are rejected as duplicates source:238
- Empty values - strings, binary, and sets duplicate zero-length members in BS are rejected as duplicates source:252
- Empty values - strings, binary, and sets empty set nested inside a Map is rejected source:269
- Empty values - strings, binary, and sets empty set nested inside a List is rejected source:285
- Expression size limit (4KB) - UpdateExpression rejects an UpdateExpression over the 4096-byte limit source:130
- Expression size limit (4KB) - ConditionExpression rejects a ConditionExpression over the 4096-byte limit source:161
- Expression size limit (4KB) - Query FilterExpression rejects a Query FilterExpression over the 4096-byte limit source:204
- Expression size limit (4KB) - Scan FilterExpression rejects a Scan FilterExpression over the 4096-byte limit source:239
- Expression size limit (4KB) - ProjectionExpression rejects a ProjectionExpression over the 4096-byte limit source:278
- Item size limit (400KB) item over 400KB fails with ValidationException source:68
- Item size limit (400KB) size calculation includes attribute names source:95
- Item size limit (400KB) size includes nested map attribute names and values source:127
- Item size limit (400KB) size includes set elements source:149
- Item size limit (400KB) size includes list elements source:170
- Item size limit (400KB) large binary attribute over limit fails source:212
- Item size limit - number sizing a number-dominated item over 400KB fails (21000 numbers) source:265
- Item size limit - the gate, to the byte refuses the same item one byte over, with the put wording source:316
- Item size limit - the gate, to the byte holds the ceiling at 409,600 across 1 payload attributes source:330
- Item size limit - the gate, to the byte holds the ceiling at 409,600 across 2 payload attributes source:330
- Item size limit - the gate, to the byte holds the ceiling at 409,600 across 5 payload attributes source:330
- Item size limit - the gate, to the byte holds the ceiling at 409,600 across 10 payload attributes source:330
- Item size limit by surface - BatchWriteItem refuses it one byte over, with the put wording source:110
- Item size limit by surface - TransactWriteItems a Put one byte over raises ValidationException, not a cancellation source:234
- Item size limit by surface - TransactWriteItems an Update one byte over surfaces as a cancellation, with the update wording source:216
- Item size limit by surface - TransactWriteItems answers the same way for a fresh key and for an existing row source:216
- Item size limit by surface - UpdateItem does not charge for the key sits below 409,600 at a one-byte key, so the exclusion binds source:377
- Item size limit by surface - UpdateItem does not charge for the key caps at exactly 409,600 with a 100-byte key value source:377
- Item size limit by surface - UpdateItem does not charge for the key caps at exactly 409,600 with a 1024-byte key value source:377
- Item size limit by surface - UpdateItem does not charge for the key buys back the same headroom from the key name as from the key value source:377
- Item size limit by surface - UpdateItem does not charge for the key buys back a sort key’s own bytes as well source:377
- Item size limit by surface - UpdateItem charges per action charges a second SET clause exactly 19 bytes source:377
- Item size limit by surface - UpdateItem charges per action charges a REMOVE alongside a SET exactly 2 bytes source:377
- Item size limit by surface - UpdateItem charges per action charges the clause, not the value it writes source:377
- Item size limit by surface - UpdateItem charges per action does not charge for an attribute the statement leaves alone source:377
- Item size limit by surface - UpdateItem charges per action charges the clause, not the attribute name or its alias source:377
- Item size limit by surface - UpdateItem through a document path charges a SET through a nested path the same as a plain SET source:571
- Item size limit by surface - UpdateItem through a document path charges a SET through a list index exactly one byte more source:571
- Item size limit by surface - a transacted Update does not inherit the exclusion writes what UpdateItem refuses at the same key source:646
- Key-value length limits rejects a partition key over the 2048-byte limit on write source:21
- Key-value length limits rejects an over-limit partition key on the read path source:31
- Nesting depth - 32-level document limit rejects a stored attribute nested 32 levels (leaf at level 33) source:51
- Nesting depth - 32-level document limit rejects a 32-level ExpressionAttributeValue with ValidationException source:99
- A number's byte cost sizes '0' at '1 byte' source:102
- A number's byte cost sizes '1' at '2 bytes' source:102
- A number's byte cost sizes '12' at '2 bytes' source:102
- A number's byte cost sizes '123' at '3 bytes' source:102
- A number's byte cost sizes '1234' at '3 bytes' source:102
- A number's byte cost sizes '12345678901234567890123456789012345678' at '20 bytes' source:102
- A number's byte cost sizes '0042' at '2 bytes' source:102
- A number's byte cost sizes '100' at '2 bytes' source:102
- A number's byte cost sizes '1010' at '3 bytes' source:102
- A number's byte cost sizes '0.0000001' at '2 bytes' source:102
- A number's byte cost sizes '1E125' at '2 bytes' source:102
- A number's byte cost sizes '1E-100' at '2 bytes' source:102
- A number's byte cost sizes '1.5' at '3 bytes' source:102
- A number's byte cost sizes '15' at '2 bytes' source:102
- A number's byte cost sizes '1.2' at '3 bytes' source:102
- A number's byte cost sizes '1.200' at '3 bytes' source:102
- A number's byte cost sizes '1.234' at '4 bytes' source:102
- A number's byte cost sizes '3.14159' at '5 bytes' source:102
- A number's byte cost sizes '123456' at '4 bytes' source:102
- A number's byte cost sizes '100.5' at '4 bytes' source:102
- A number's byte cost sizes '0.15' at '2 bytes' source:102
- A number's byte cost sizes '-42' at '3 bytes' source:102
- A number's byte cost sizes '-0' at '1 byte' source:102
- A number is stored expanded and sized by its significant digits trims the zeros it does not count source:127
- A number is stored expanded and sized by its significant digits expands an exponent it does not count source:132
- A number is stored expanded and sized by its significant digits costs the same either way: the expanded form is not what is measured source:143
- Number precision - DynamoDB number limits and edge cases rejects a number with 39 significant digits source:73
- Number precision - DynamoDB number limits and edge cases rejects number just over maximum positive: 1E+126 source:104
- Number precision - DynamoDB number limits and edge cases rejects number just over maximum negative: -1E+126 source:135
- Number precision - DynamoDB number limits and edge cases rejects number below minimum positive: 1E-131 source:166
- Number precision - DynamoDB number limits and edge cases leading zeros are not counted as significant digits: 00042 treated as 42 source:192
- Number precision - DynamoDB number limits and edge cases negative zero: -0 behavior source:229
- Number precision - DynamoDB number limits and edge cases leading zeros are stripped on round-trip source:324
- Number precision - DynamoDB number limits and edge cases trailing decimal zeros are stripped on round-trip source:342
- Number precision - DynamoDB number limits and edge cases scientific notation is normalized on round-trip source:376
- Number precision - DynamoDB number limits and edge cases rejects arithmetic that overflows the supported number magnitude source:407
- Number precision - DynamoDB number limits and edge cases number set equality distinguishes values differing beyond f64 precision source:437
- Reserved words - ExpressionAttributeNames handling reserved word without # in ConditionExpression fails source:143
- Reserved words - ExpressionAttributeNames handling reserved word without # in UpdateExpression fails source:165
- Reserved words - ExpressionAttributeNames handling reserved word without # in FilterExpression fails source:181
- Reserved words - ExpressionAttributeNames handling reserved word without # in ProjectionExpression fails source:196
- Reserved words - ExpressionAttributeNames handling multiple reserved words in same expression all need aliases source:226
- Response size limit (1MB) Query returns LastEvaluatedKey when response would exceed 1MB source:70
- Response size limit (1MB) Scan returns LastEvaluatedKey when response would exceed 1MB source:108
- TransactWriteItems limits TransactWriteItems total item size over 4MB fails with ValidationException source:98
- Item size limit by surface - PartiQL INSERT accepts an item of exactly 409,600 bytes
- Item size limit by surface - PartiQL INSERT refuses it one byte over, with the put wording
- Item size limit by surface - PartiQL UPDATE accepts a finished item of exactly 409,600 bytes
- Item size limit by surface - PartiQL UPDATE refuses it one byte over, with the update wording
- Item size limit by surface - a PartiQL UPDATE does not inherit the exclusion writes what UpdateItem refuses at the same key
-
putItem Tier 1 82 diverging
View these tests in the suite →- PutItem - ConditionExpression parens rejects redundant parentheses in ConditionExpression source:124
- PutItem - ConditionExpression parens rejects contains() with a duplicate path and operand source:139
- PutItem - ConditionExpression returns the conflicting item via ReturnValuesOnConditionCheckFailure on a failed Put source:227
- PutItem - ConditionExpression rejects a BETWEEN with reversed bounds at parse time source:251
- ReturnConsumedCapacity PutItem with TOTAL returns ConsumedCapacity with TableName and CapacityUnits source:36
- ReturnConsumedCapacity GetItem with TOTAL returns ConsumedCapacity source:59
- ReturnConsumedCapacity Query with TOTAL returns ConsumedCapacity source:83
- ReturnConsumedCapacity Scan with TOTAL returns ConsumedCapacity source:104
- ReturnConsumedCapacity - PutItem reports only the aggregate, no write-capacity split PutItem with TOTAL reports 1 CapacityUnit and no read/write split source:141
- ReturnConsumedCapacity - PutItem reports only the aggregate, no write-capacity split PutItem with INDEXES omits the split at the top level and on Table source:152
- PutItem - index write capacity reports the GSI write beside the table write and sums them source:43
- PutItem - index write capacity folds the index cost into TOTAL with no breakdown arms source:121
- PutItem - index write capacity charges a sparse write nothing for the indexes it misses source:43
- PutItem - index write capacity reports the LSI write and folds it into the total source:43
- PutItem - index write capacity reports both arms when a write touches both index kinds source:43
- PutItem - index write capacity charges an identical overwrite no index writes at all source:43
- UpdateItem - index write-capacity ladder charges nothing on the index for a non-projected attribute source:43
- UpdateItem - index write-capacity ladder charges one index write for a projected non-key attribute source:43
- UpdateItem - index write-capacity ladder charges two index writes for a key change: delete plus insert source:43
- UpdateItem - index write-capacity ladder charges one index write to remove the key: delete only source:43
- UpdateItem - index write-capacity ladder walks the same ladder on the LSI key source:43
- DeleteItem - index write capacity charges one write per index the item occupied source:43
- DeleteItem - index write capacity charges only the table write for a sparse item source:43
- BatchWriteItem - index write capacity reports the per-table entry with the arms the batch actually touched source:287
- PutItem - index key validation rejects a wrong-typed index key attribute source:17
- PutItem - index key validation rejects a non-scalar index key attribute source:30
- PutItem - index key validation rejects an empty-string index key attribute source:46
- ReturnItemCollectionMetrics PutItem with SIZE returns ItemCollectionMetrics source:37
- ReturnItemCollectionMetrics DeleteItem with SIZE returns ItemCollectionMetrics source:65
- ReturnItemCollectionMetrics UpdateItem with SIZE returns ItemCollectionMetrics source:95
- PutItem - number format accepts "+5" and stores it as "5" source:92
- PutItem - number format accepts "+1.5" and stores it as "1.5" source:92
- PutItem - number format accepts "+0" and stores it as "0" source:92
- PutItem - number format accepts "-0" and stores it as "0" source:92
- PutItem - number format accepts "+0.0" and stores it as "0" source:92
- PutItem - number format accepts "+1e2" and stores it as "100" source:92
- PutItem - number format accepts "1e+2" and stores it as "100" source:92
- PutItem - number format accepts "1.5E+3" and stores it as "1500" source:92
- PutItem - number format accepts "+.5" and stores it as "0.5" source:92
- PutItem - number format accepts ".5" and stores it as "0.5" source:92
- PutItem - number format accepts "5." and stores it as "5" source:92
- PutItem - number format accepts "1." and stores it as "1" source:92
- PutItem - number format accepts "1.e5" and stores it as "100000" source:92
- PutItem - number format accepts "00042" and stores it as "42" source:92
- PutItem - number format accepts "+1e-2" and stores it as "0.01" source:92
- PutItem - number format accepts "1.23E10" and stores it as "12300000000" source:92
- PutItem - number format rejects "+e2" source:96
- PutItem - number format rejects "e2" source:96
- PutItem - number format rejects "+1+2" source:96
- PutItem - number format rejects "1+2" source:96
- PutItem - number format rejects "+1.2.3" source:96
- PutItem - number format rejects "1.2.3" source:96
- PutItem - number format rejects "++5" source:96
- PutItem - number format rejects "+-5" source:96
- PutItem - number format rejects "-+5" source:96
- PutItem - number format rejects "+" source:96
- PutItem - number format rejects "-" source:96
- PutItem - number format rejects "1e" source:96
- PutItem - number format rejects "1e+" source:96
- PutItem - number format rejects "." source:96
- PutItem - number format rejects "1.2e3.4" source:96
- PutItem - number format rejects "0x5" source:96
- PutItem - number format rejects "NaN" source:96
- PutItem - number format rejects "Infinity" source:96
- PutItem - number format rejects "1_000" source:96
- PutItem - number format rejects " 5" source:96
- PutItem - number format rejects "5 " source:96
- PutItem - number format rejects "1 5" source:96
- PutItem - number format accepts a leading + on a numeric sort key and normalises it source:127
- PutItem - validation rejects empty string set source:38
- PutItem - validation rejects empty number set source:50
- PutItem - validation rejects empty binary set source:62
- PutItem - validation rejects an empty string member in a number set source:76
- PutItem - validation rejects duplicate empty string members in a string set source:88
- PutItem - validation rejects duplicate zero-length members in a binary set source:101
- PutItem - validation rejects duplicate values in string set source:117
- PutItem - validation rejects duplicate values in number set source:130
- PutItem - validation rejects duplicate values in binary set source:143
- PutItem - validation rejects invalid ReturnValues source:159
- PutItem - validation rejects mixing expression and non-expression parameters source:173
- PutItem - validation rejects a number with a leading space source:188
- PutItem - validation rejects a number with a trailing space source:195
-
updateItem Tier 1 32 diverging
View these tests in the suite →- UpdateItem - SET if_not_exists with cross-attribute reference source:178
- UpdateItem - SET supports SET with list_append source:210
- UpdateItem - SET SET on a document path creates a nested set with an empty member source:263
- UpdateItem - return values returns UPDATED_OLD for changed attributes source:759
- UpdateItem - return values returns UPDATED_NEW for changed attributes source:783
- UpdateItem - SET evaluation semantics a second SET clause reads the pre-update value of another attribute source:816
- UpdateItem - SET evaluation semantics applies parenthesised arithmetic (SET c = (c - :v)) source:837
- UpdateItem - SET evaluation semantics composes nested functions: list_append(if_not_exists(list, :empty), :more) on a missing list source:885
- UpdateItem - SET evaluation semantics list_append argument order controls prepend vs append source:912
- UpdateItem - ReturnValues granularity UPDATED_NEW on a nested SET returns only the changed fragment source:961
- UpdateItem - ReturnValues granularity REMOVE with UPDATED_NEW omits Attributes (nothing was set to a new value) source:982
- UpdateItem - ConditionExpression ReturnValuesOnConditionCheckFailure ALL_OLD returns existing item on failure source:271
- UpdateItem - ConditionExpression attribute_not_exists upsert with ReturnValues: ALL_NEW returns created attributes source:424
- UpdateItem - ConditionExpression parens accepts per-condition parens and updates source:446
- UpdateItem - ConditionExpression parens accepts full-expression wrap and updates source:472
- UpdateItem - ConditionExpression parens accepts non-redundant nested parens and updates source:498
- UpdateItem - ConditionExpression parens rejects UpdateItem when parenthesised condition fails; item unchanged source:550
- UpdateItem - expression attribute hygiene rejects an ExpressionAttributeNames key without a # prefix source:18
- UpdateItem - expression attribute hygiene rejects an ExpressionAttributeValues key without a : prefix source:18
- UpdateItem - expression attribute hygiene rejects ExpressionAttributeNames supplied with no expression source:18
- UpdateItem - expression attribute hygiene rejects an unused ExpressionAttributeNames entry source:18
- UpdateItem - nested path semantics SET fails when intermediate map path does not exist source:32
- UpdateItem - nested path semantics SET succeeds on existing nested map path source:82
- UpdateItem - nested path semantics SET on list index beyond bounds extends the list source:118
- UpdateItem - nested path semantics SET deeply nested path a.b.c when all intermediates exist source:153
- UpdateItem - nested path semantics arithmetic on nested path: SET mymap.counter = mymap.counter + :inc source:187
- UpdateItem - nested path semantics REMOVE nested map key removes just that key source:220
- UpdateItem - nested path semantics REMOVE list element by index removes and shifts source:257
- UpdateItem - nested path semantics REMOVE last list element source:292
- UpdateItem - nested path semantics SET on list index 0 of empty list succeeds source:372
- UpdateItem - nested path semantics SET on a document path nests under an existing map without flattening source:405
- UpdateItem - nested path semantics returns every subpath under UPDATED_NEW when one SET writes several source:431
-
query Tier 1 30 diverging
View these tests in the suite →- Query - Limit + FilterExpression interaction rejects ExclusiveStartKey that does not match the table schema source:400
- Query - binary sort key returns items in byte-wise ascending order source:54
- Query - binary sort key returns items in descending order with ScanIndexForward=false source:69
- Query - binary sort key supports > comparison on binary sort key (byte-wise) source:87
- Query - binary sort key supports begins_with on binary sort key source:105
- Query - FilterExpression functions and operators filters by list index: listAttr[0] = :val source:322
- Query - size() string encoding counts UTF-16 code units (3), not UTF-8 bytes (6) source:486
- Query - GSI sparse composite GSI: an item with the GSI hash key but no range key is excluded source:172
- Query - GSI pagination across tied sort keys composes LastEvaluatedKey from base and index keys and walks every tied item once source:244
- Query - GSI ExclusiveStartKey validation rejects ExclusiveStartKey missing the index key on a GSI query source:268
- Query - hash-only GSI pagination on a composite base table walks every item across pages when they share the GSI hash and base partition key source:79
- ConsumedCapacity - INDEXES on a secondary-index Query Query with INDEXES returns per-index breakdown source:59
- ConsumedCapacity - INDEXES on a secondary-index Query Query with INDEXES returns per-index capacity breakdown source:85
- Query - KeyConditionExpression with parentheses rejects redundant parentheses in KeyConditionExpression source:98
- Query - KeyConditionExpression semantics rejects a nested path on a key attribute source:52
- Query - LSI INCLUDE projection returns only specified non-key attributes plus keys source:186
- Query - LSI sparse LSI: an item missing the LSI sort key is excluded but stays in the base table source:241
- Query - LSI pagination across tied sort keys composes LastEvaluatedKey from base and index keys and walks every tied item once source:312
- Query - legal shared-prefix projections accepts sibling map paths (a.b, a.c) and returns both under the parent source:52
- Query - legal shared-prefix projections accepts two paths sharing a list index (l[0].x, l[0].y) and merges them into one element source:62
- Query - legal shared-prefix projections accepts distinct list indices (l[0], l[1]) and returns both elements in order source:71
- Query - Select COUNT Select COUNT returns count without items source:48
- Query - Select COUNT Select COUNT with FilterExpression returns different Count and ScannedCount source:69
- Query - Select SPECIFIC_ATTRIBUTES Select SPECIFIC_ATTRIBUTES without ProjectionExpression is rejected source:121
- Query - Select / ProjectionExpression rejections Select ALL_ATTRIBUTES with ProjectionExpression is rejected source:141
- Query - Select / ProjectionExpression rejections Select ALL_PROJECTED_ATTRIBUTES without an IndexName is rejected source:159
- Query - Select / ProjectionExpression rejections Select COUNT with ProjectionExpression is rejected source:176
- Query - Select / ProjectionExpression rejections Select ALL_PROJECTED_ATTRIBUTES with ProjectionExpression and no IndexName is rejected source:195
- Query - Select modes on indexes Select ALL_PROJECTED_ATTRIBUTES on GSI returns only projected attributes source:81
- Query - validation rejects query without KeyConditionExpression source:23
-
transactions Tier 2 29 diverging
View these tests in the suite →- TransactGetItems - validation rejects duplicate keys in same transaction source:232
- TransactGetItems - ConsumedCapacity charges 2 read capacity units per item, including a missing item source:293
- TransactGetItems - ConsumedCapacity INDEXES breakdown includes the table read capacity units source:304
- TransactWriteItems - basic functionality rejects same ClientRequestToken with different payload source:479
- TransactWriteItems - basic functionality returns ALL_OLD item via ReturnValuesOnConditionCheckFailure source:555
- TransactWriteItems - validation rejects duplicate target items in same transaction source:684
- TransactWriteItems - validation Put with a wrong-typed table key cancels with a ValidationError reason source:761
- TransactWriteItems - validation Put with a non-scalar table key cancels with a ValidationError reason source:761
- TransactWriteItems - validation Put with an empty-string table key is a top-level ValidationException source:784
- TransactWriteItems - validation Update with an empty-string Key is a top-level ValidationException source
- TransactWriteItems - validation Delete with an empty-string Key is a top-level ValidationException source
- TransactWriteItems - validation ConditionCheck with an empty-string Key is a top-level ValidationException source
- TransactWriteItems - validation Update with a wrong-typed Key cancels with a ValidationError reason source:761
- TransactWriteItems - validation Update with a non-scalar Key cancels with a ValidationError reason source:761
- TransactWriteItems - validation Delete with a wrong-typed Key cancels with a ValidationError reason source:761
- TransactWriteItems - validation Delete with a non-scalar Key cancels with a ValidationError reason source:761
- TransactWriteItems - validation ConditionCheck with a wrong-typed Key cancels with a ValidationError reason source:761
- TransactWriteItems - validation ConditionCheck with a non-scalar Key cancels with a ValidationError reason source:761
- TransactWriteItems - ConditionExpression parens Update with full-expression wrap succeeds when condition holds source:1125
- TransactWriteItems - ConsumedCapacity charges 2 write capacity units per item source:1299
- TransactWriteItems - ConsumedCapacity: conditional, check, replay, cancel a passing conditional write costs the same 2 WCU/item as an unconditional one source:1361
- TransactWriteItems - ConsumedCapacity: conditional, check, replay, cancel a standalone ConditionCheck action costs 2 write capacity units source:1387
- TransactWriteItems - ConsumedCapacity: conditional, check, replay, cancel reports write capacity on the first call and read capacity on a same-token replay source:1417
- TransactWriteItems - index key validation Put with a wrong-typed index key cancels with a ValidationError reason source:60
- TransactWriteItems - index key validation Put with a non-scalar index key cancels with a ValidationError reason source:60
- TransactWriteItems - index key validation Update setting a wrong-typed index key cancels with a ValidationError reason source:60
- TransactWriteItems - index key validation Update setting a non-scalar index key cancels with a ValidationError reason source:60
- TransactWriteItems - index key validation Put with an empty-string index key is a top-level ValidationException source:117
- TransactWriteItems - index key validation Update setting an empty-string index key is a top-level ValidationException source:136
-
getItem Tier 1 27 diverging
View these tests in the suite →- ConsumedCapacity across operations GetItem with TOTAL returns ConsumedCapacity source:68
- ConsumedCapacity across operations DeleteItem with TOTAL returns ConsumedCapacity source:83
- ConsumedCapacity across operations UpdateItem with TOTAL returns ConsumedCapacity source:101
- ConsumedCapacity across operations Scan with TOTAL returns ConsumedCapacity source:115
- ConsumedCapacity across operations BatchWriteItem with TOTAL returns per-table ConsumedCapacity source:141
- ConsumedCapacity - single-item ops report only the aggregate, no read/write split a strongly-consistent GetItem reports 1 CapacityUnit and no read/write split source:187
- ConsumedCapacity - single-item ops report only the aggregate, no read/write split an eventually-consistent GetItem reports 0.5 CapacityUnits and no read/write split source:199
- ConsumedCapacity - single-item ops report only the aggregate, no read/write split a Query under INDEXES omits the split at the top level and on Table source:216
- ConsumedCapacity - single-item ops report only the aggregate, no read/write split an UpdateItem reports 1 CapacityUnit and no read/write split source:231
- ConsumedCapacity - single-item ops report only the aggregate, no read/write split a DeleteItem reports 1 CapacityUnit and no read/write split source:242
- Nested attribute projection GetItem ProjectionExpression with nested map path returns only the nested value source:61
- Nested attribute projection GetItem ProjectionExpression with list index returns the element source:79
- Nested attribute projection GetItem projects multiple list indices compacted and index-ordered source:98
- Nested attribute projection Query ProjectionExpression with nested path and list index source:120
- Nested attribute projection BatchGetItem ProjectionExpression with nested path source:142
- Nested attribute projection GetItem ProjectionExpression with multiple sibling paths in one map keeps all of them source:168
- GetItem - projection matching nothing returns an empty Item when ProjectionExpression matches no attribute on a present item source:203
- GetItem - projection matching nothing returns an empty Item when legacy AttributesToGet matches no attribute on a present item source:219
- Same list-index projection merge GetItem merges two scalar sub-attributes of one list index into a single element source:318
- Same list-index projection merge GetItem merges two paths sharing a nested map under one list index source:336
- Same list-index projection merge GetItem merges a scalar sibling and a nested-map sibling under one list index source:352
- Same list-index projection merge GetItem merges two paths sharing an element of a nested list under one list index source:370
- Same list-index projection merge GetItem keeps distinct inner list indices separate under one shared outer index source:388
- Same list-index projection merge GetItem merges the shared index and keeps a distinct index separate, compacted source:408
- Same list-index projection merge GetItem merges the same index regardless of path request order source:428
- Same list-index projection merge Query merges two sub-attributes of one list index into a single element source:446
- Same list-index projection merge BatchGetItem merges two sub-attributes of one list index into a single element source:467
-
scan Tier 1 25 diverging
View these tests in the suite →- Scan - ProjectionExpression rejects ExclusiveStartKey that does not match the table schema source:213
- Scan - FilterExpression operand validation order rejects a non-string begins_with operand even when nothing matches source:23
- Scan - binary attribute comparisons Binary GT comparison (byte-wise) source:212
- Scan - binary attribute comparisons Binary BEGINS_WITH source:231
- Scan - binary attribute comparisons Binary BETWEEN source:251
- Scan - set equality Set EQ - matches regardless of element order source:297
- Scan - set equality Set NE - verify inequality source:316
- Scan - filter expression validation rejects begins_with with a non-string/binary operand source:326
- Scan - filter expression validation rejects redundant parentheses in FilterExpression source:342
- Scan - GSI scans a GSI with INCLUDE projection and returns only projected attributes source:107
- Scan - GSI sparse composite GSI: an item missing the GSI range key is not scanned source:169
- Scan - GSI pagination across tied sort keys walks every item once across a paged GSI scan with tied sort keys source:197
- Scan - LSI supports ConsistentRead on LSI scan source:116
- Scan - LSI sparse LSI: an item missing the LSI sort key is not scanned source:138
- Scan - legal shared-prefix projections accepts sibling map paths (a.b, a.c) and returns both under the parent source:54
- Scan - legal shared-prefix projections accepts two paths sharing a list index (l[0].x, l[0].y) and merges them into one element source:64
- Scan - legal shared-prefix projections accepts distinct list indices (l[0], l[1]) and returns both elements in order source:73
- Scan - Select COUNT Select COUNT returns count without items on Scan source:44
- Scan - Select COUNT Select COUNT with FilterExpression on Scan source:64
- Scan - Select / ProjectionExpression rejections Select ALL_ATTRIBUTES with ProjectionExpression is rejected source:72
- Scan - Select / ProjectionExpression rejections Select ALL_PROJECTED_ATTRIBUTES without an IndexName is rejected source:87
- Scan - Select / ProjectionExpression rejections Select COUNT with ProjectionExpression is rejected source:101
- Scan - Select / ProjectionExpression rejections Select ALL_PROJECTED_ATTRIBUTES with ProjectionExpression and no IndexName is rejected source:117
- Scan - Select / ProjectionExpression rejections Select SPECIFIC_ATTRIBUTES without ProjectionExpression is rejected source:134
- Scan - validation rejects TotalSegments above the maximum source:22
-
validation-ordering Tier 3 22 diverging 3 not attempted
View these tests in the suite →- CreateTable - validation ordering empty TableName reports only tableName constraint source:23
- CreateTable - validation ordering invalid table name pattern reports only tableName source:41
- CreateTable - validation ordering reports invalid BillingMode and invalid KeySchema element together source:59
- CreateTable - validation ordering reports missing ProvisionedThroughput and invalid key type together source:82
- CreateTable - validation ordering rejects a duplicate attribute in KeySchema source:102
- CreateTable - validation ordering rejects more than two KeySchema elements source:129
- CreateTable - validation ordering rejects an invalid BillingMode on its own source:151
- DeleteItem - validation ordering empty TableName reports only tableName constraint source:26
- DeleteItem - validation ordering reports invalid ReturnValues and invalid ReturnConsumedCapacity together source:42
- DeleteItem - validation ordering invalid table name pattern reports only tableName source:66
- Non-existent index - error surface Scan on a non-existent index reports ValidationException source:49
- Non-existent index - error surface UpdateTable deleting a non-existent GSI reports ResourceNotFoundException source:66
- PutItem - validation ordering empty TableName reports tableName constraint (stops early) source:28
- PutItem - validation ordering reports invalid ReturnConsumedCapacity, ReturnItemCollectionMetrics, and ReturnValues together source:72
- PutItem - validation ordering reports invalid table name pattern source:98
- Query - validation ordering reports invalid TableName pattern source:26
- Query - validation ordering reports invalid Limit value source:45
- Query - validation ordering reports invalid ReturnConsumedCapacity source:67
- Scan - validation ordering rejects a negative Segment source:80
- UpdateItem - validation ordering empty TableName reports only tableName constraint source:27
- UpdateItem - validation ordering rejects invalid ReturnValues (UpdateItem reports the first enum error) source:48
- UpdateItem - validation ordering invalid table name pattern reports only tableName source:72
- PartiQL - validation ordering the operand-type check fires ahead of table resolution
- PartiQL - validation ordering a well-formed statement on the same table reports it missing
- PartiQL - validation ordering an empty path component fires ahead of table resolution
-
legacy-api Tier 3 24 diverging
View these tests in the suite →- Legacy API - AttributeUpdates (legacy UpdateExpression) AttributeUpdates with Action DELETE on a set removes elements source:85
- Legacy API - AttributeUpdates (legacy UpdateExpression) Mixing AttributeUpdates with UpdateExpression throws ValidationException source:229
- Legacy API - AttributesToGet (legacy ProjectionExpression) GetItem with AttributesToGet returns only specified attributes source:82
- Legacy API - AttributesToGet (legacy ProjectionExpression) GetItem with AttributesToGet does NOT auto-include key attributes source:97
- Legacy API - AttributesToGet (legacy ProjectionExpression) Query with AttributesToGet returns only specified attributes source:119
- Legacy API - AttributesToGet (legacy ProjectionExpression) Scan with AttributesToGet returns only specified attributes source:146
- Legacy API - AttributesToGet (legacy ProjectionExpression) BatchGetItem with AttributesToGet returns only specified attributes source:169
- Legacy API - AttributesToGet (legacy ProjectionExpression) Mixing AttributesToGet with ProjectionExpression throws ValidationException source:175
- Legacy API - AttributesToGet (legacy ProjectionExpression) AttributesToGet with single attribute source:202
- Legacy API - Expected (legacy ConditionExpression) PutItem with Expected Exists:false fails when item already exists source:60
- Legacy API - Expected (legacy ConditionExpression) PutItem with Expected ComparisonOperator EQ fails on mismatch source:114
- Legacy API - Expected (legacy ConditionExpression) DeleteItem with Expected Exists:false fails when attr exists source:168
- Legacy API - Expected (legacy ConditionExpression) PutItem with ConditionalOperator AND - both conditions must pass source:211
- Legacy API - Expected (legacy ConditionExpression) Mixing Expected with ConditionExpression throws ValidationException source:272
- Legacy API - KeyConditions and QueryFilter QueryFilter with ComparisonOperator EQ on non-key attribute source:142
- Legacy API - KeyConditions and QueryFilter QueryFilter with ComparisonOperator CONTAINS on string attribute source:167
- Legacy API - KeyConditions and QueryFilter Mixing KeyConditions with KeyConditionExpression throws ValidationException source:172
- Legacy API - KeyConditions and QueryFilter QueryFilter with ComparisonOperator EQ on a BOOL attribute filters correctly source:239
- Legacy API - ScanFilter (legacy FilterExpression) ScanFilter with ComparisonOperator EQ filters results source:68
- Legacy API - ScanFilter (legacy FilterExpression) ScanFilter with ComparisonOperator GT on numeric attribute source:80
- Legacy API - ScanFilter (legacy FilterExpression) ScanFilter with ComparisonOperator BEGINS_WITH on string source:93
- Legacy API - ScanFilter (legacy FilterExpression) ScanFilter with ComparisonOperator CONTAINS on string source:106
- Legacy API - ScanFilter (legacy FilterExpression) Multiple ScanFilter conditions with ConditionalOperator AND source:125
- Legacy API - ScanFilter (legacy FilterExpression) Mixing ScanFilter with FilterExpression throws ValidationException source:131
-
createTable Tier 1 14 diverging
View these tests in the suite →- CreateTable - TableId returns a TableId on CreateTable that matches the subsequent DescribeTable source:153
- CreateTable - validation rejects a table name shorter than 3 characters source:159
- CreateTable - validation rejects a table name longer than 255 characters source:173
- CreateTable - validation rejects a table name with invalid characters source:187
- CreateTable - validation rejects unused AttributeDefinitions source:229
- CreateTable - validation rejects PAY_PER_REQUEST with ProvisionedThroughput specified source:248
- CreateTable - validation rejects a GSI INCLUDE projection without NonKeyAttributes source:265
- CreateTable - validation rejects StreamSpecification with StreamEnabled false plus a StreamViewType source:291
- CreateTable - configuration parameters SSESpecification with the AWS-managed key round-trips source:61
- CreateTable - configuration parameters OnDemandThroughput round-trips on a PAY_PER_REQUEST table source:76
- CreateTable - LSI rejects LSI on a hash-only table source:58
- CreateTable - LSI rejects LSI with a hash key different from the base table source:85
- CreateTable - LSI rejects an LSI INCLUDE projection without NonKeyAttributes source:117
- CreateTable - index and stream spec validation rejects a KEYS_ONLY GSI projection carrying NonKeyAttributes source:31
-
updateTable Tier 2 13 diverging
View these tests in the suite →- UpdateTable - add GSI adds a hash-only GSI to an existing table source:159
- UpdateTable - add GSI adds a composite GSI (hash + range) to an existing table source:199
- UpdateTable - add GSI adds a GSI with KEYS_ONLY projection source:233
- UpdateTable - add GSI adds a GSI with INCLUDE projection and NonKeyAttributes source:267
- UpdateTable - add GSI can query a newly created GSI after putting items source:337
- UpdateTable - add GSI adds multiple GSIs sequentially source:410
- UpdateTable - add GSI accepts a conflicting redeclaration of an existing key attribute and keeps the stored type source:475
- UpdateTable - add GSI drops an unused AttributeDefinition supplied with a GSI add source:546
- UpdateTable - remove GSI removes a GSI from a table source:601
- UpdateTable - GSI validation rejects adding a GSI with a name that already exists source:685
- UpdateTable - GSI validation rejects adding a GSI with an attribute not in AttributeDefinitions source:713
- UpdateTable - GSI validation rejects a GSI keyed on a table attribute omitted from the request AttributeDefinitions source:745
- UpdateTable - GSI validation rejects removing a non-existent GSI source:774
-
updateTable Tier 1 11 diverging
View these tests in the suite →- UpdateTable - basic changes provisioned throughput on a PROVISIONED table source:64
- UpdateTable - basic rejects PROVISIONED to PROVISIONED no-op with same throughput values source:73
- UpdateTable - basic switches billing mode from PROVISIONED to PAY_PER_REQUEST source:121
- UpdateTable - basic switches billing mode from PAY_PER_REQUEST to PROVISIONED source:144
- UpdateTable - basic DescribeTable reflects updated throughput values source:173
- UpdateTable - basic DescribeTable reflects updated billing mode source:193
- UpdateTable - validation rejects invalid throughput values (0 or negative) source:222
- UpdateTable - validation rejects PAY_PER_REQUEST with ProvisionedThroughput specified source:247
- UpdateTable - configuration parameters UpdateTable enables DeletionProtectionEnabled source:52
- UpdateTable - configuration parameters UpdateTable changes OnDemandThroughput source:80
- DeleteTable - deletion protection enforcement rejects DeleteTable while deletion protection is enabled source:106
-
batchWriteItem Tier 1 7 diverging
View these tests in the suite →- BatchWriteItem - basic writes an item whose string set carries an empty member source:144
- BatchWriteItem - multiple tables returns UnprocessedItems as an empty object on full success source:286
- BatchWriteItem - index key validation rejects a wrong-typed index key value source:18
- BatchWriteItem - index key validation rejects a non-scalar index key value source:38
- BatchWriteItem - index key validation rejects an empty-string index key value source:58
- BatchWriteItem - validation rejects duplicate keys in the same table batch source:59
- BatchWriteItem - validation rejects an empty-string table key value source:131
-
batchGetItem Tier 1 4 diverging
View these tests in the suite →- BatchGetItem - legal shared-prefix projections accepts sibling map paths (a.b, a.c) and returns both under the parent source:55
- BatchGetItem - legal shared-prefix projections accepts two paths sharing a list index (l[0].x, l[0].y) and merges them into one element source:66
- BatchGetItem - legal shared-prefix projections accepts distinct list indices (l[0], l[1]) and returns both elements in order source:76
- BatchGetItem - validation rejects duplicate keys in the same batch source:52
-
backups Tier 2 1 diverging 3 not attempted
View these tests in the suite →- Continuous backups - PITR enabling PITR transitions PointInTimeRecoveryStatus to ENABLED source
- On-demand backups - lifecycle and restore CreateBackup → DescribeBackup → ListBackups → DeleteBackup
- On-demand backups - lifecycle and restore RestoreTableFromBackup initiates a restore into a new table
- On-demand backups - lifecycle and restore DescribeBackup on a deleted backup throws BackupNotFoundException
-
streams Tier 2 2 diverging
View these tests in the suite →- DynamoDB Streams - basic ListStreams returns the stream for our table source:123
- DynamoDB Streams - basic ListStreams with TableName filter returns only our table's stream source:130
-
tags Tier 2 2 diverging
View these tests in the suite →- Tags - validation rejects TagResource with an invalid ARN format source:188
- Tags - validation rejects ListTagsOfResource with a non-existent ARN source:211
-
deleteItem Tier 1 1 diverging
View these tests in the suite →- DeleteItem - ConditionExpression parens rejects redundant parentheses in ConditionExpression source:136
-
describeTable Tier 1 1 diverging
View these tests in the suite →- DescribeTable - TableId returns a stable TableId across repeated DescribeTable calls source:47
-
ttl Tier 2 1 diverging
View these tests in the suite →- TTL - validation rejects empty attribute name source:140
What it doesn't attempt
Operations Kumo declines rather than gets wrong, so none of this counts towards its divergence. It is what the gap in its 78.3% coverage is made of. Each test here skipped itself because the target's own feature probe said the operation isn't implemented, which is often a deliberate choice rather than a defect.
-
partiql Tier 2 none of it 186 not attempted
View these tests in the suite →- BatchExecuteStatement - PartiQL batch of multiple SELECT statements
- BatchExecuteStatement - PartiQL batch of INSERT and UPDATE statements
- BatchExecuteStatement - PartiQL partial failure - one valid and one invalid statement
- BatchExecuteStatement - PartiQL honours a RETURNING clause on a member statement
- BatchExecuteStatement - PartiQL honours a RETURNING ALL NEW * clause on a member UPDATE
- BatchExecuteStatement - PartiQL honours a RETURNING MODIFIED NEW * clause on a member UPDATE (only the changed attr)
- BatchExecuteStatement - PartiQL omits Item when a member UPDATE produces an empty MODIFIED projection
- BatchExecuteStatement - PartiQL surfaces an invalid RETURNING variant on a member DELETE as a per-statement error
- BatchExecuteStatement - PartiQL surfaces a malformed member statement as a per-statement ValidationError without failing the batch
- BatchExecuteStatement - PartiQL rejects an empty Statements array
- BatchExecuteStatement - PartiQL ConsistentRead is honoured per member charges a small eventually-consistent read half a unit
- BatchExecuteStatement - PartiQL ConsistentRead is honoured per member charges exactly twice that when the member asks for consistency
- BatchExecuteStatement - PartiQL ConsistentRead is honoured per member treats an explicit false the same as omitting it
- BatchExecuteStatement - PartiQL ConsistentRead is honoured per member rates each member of a mixed batch on its own setting
- BatchExecuteStatement - PartiQL a batch SELECT must name the table primary key rejects a member that filters on a non-key attribute
- BatchExecuteStatement - PartiQL a batch SELECT must name the table primary key rejects an index-qualified member naming the index key
- BatchExecuteStatement - PartiQL a batch SELECT must name the table primary key rejects one naming both the table primary key and the index key
- BatchExecuteStatement - PartiQL a batch SELECT must name the table primary key leaves the rest of the batch running
- BatchExecuteStatement - PartiQL a failed member echoes its table only if it ran carries TableName on a conditional failure
- BatchExecuteStatement - PartiQL a failed member echoes its table only if it ran carries TableName on a duplicate insert
- BatchExecuteStatement - PartiQL a failed member echoes its table only if it ran omits TableName on a member rejected before it ran
- BatchExecuteStatement - PartiQL ReturnValuesOnConditionCheckFailure on a batch member returns no Item with the option set to ALL_OLD
- BatchExecuteStatement - PartiQL ReturnValuesOnConditionCheckFailure on a batch member returns no Item with the option set to NONE
- BatchExecuteStatement - PartiQL ReturnValuesOnConditionCheckFailure on a batch member returns no Item with the option set to undefined
- BatchExecuteStatement - PartiQL ReturnValuesOnConditionCheckFailure on a batch member does return the item on a TransactWriteItems ConditionCheck
- ExecuteStatement - comparison on non-scalar types 'SS' matches an equal value
- ExecuteStatement - comparison on non-scalar types 'SS' does not match a different value
- ExecuteStatement - comparison on non-scalar types 'SS' answers <> as the complement of =
- ExecuteStatement - comparison on non-scalar types 'SS' matches a permuted value, because a string set is unordered
- ExecuteStatement - comparison on non-scalar types 'SS' agrees with the same predicate as a ConditionExpression
- ExecuteStatement - comparison on non-scalar types 'NS' matches an equal value
- ExecuteStatement - comparison on non-scalar types 'NS' does not match a different value
- ExecuteStatement - comparison on non-scalar types 'NS' answers <> as the complement of =
- ExecuteStatement - comparison on non-scalar types 'NS' matches a permuted value, because a number set is unordered
- ExecuteStatement - comparison on non-scalar types 'NS' agrees with the same predicate as a ConditionExpression
- ExecuteStatement - comparison on non-scalar types 'BS' matches an equal value
- ExecuteStatement - comparison on non-scalar types 'BS' does not match a different value
- ExecuteStatement - comparison on non-scalar types 'BS' answers <> as the complement of =
- ExecuteStatement - comparison on non-scalar types 'BS' matches a permuted value, because a binary set is unordered
- ExecuteStatement - comparison on non-scalar types 'BS' agrees with the same predicate as a ConditionExpression
- ExecuteStatement - comparison on non-scalar types 'L' matches an equal value
- ExecuteStatement - comparison on non-scalar types 'L' does not match a different value
- ExecuteStatement - comparison on non-scalar types 'L' answers <> as the complement of =
- ExecuteStatement - comparison on non-scalar types 'L' does not match a permuted value, because a list is ordered, so a permutation is a different value
- ExecuteStatement - comparison on non-scalar types 'L' agrees with the same predicate as a ConditionExpression
- ExecuteStatement - comparison on non-scalar types 'M' matches an equal value
- ExecuteStatement - comparison on non-scalar types 'M' does not match a different value
- ExecuteStatement - comparison on non-scalar types 'M' answers <> as the complement of =
- ExecuteStatement - comparison on non-scalar types 'M' matches a permuted value, because a map compares by content, not by the order its keys arrived in
- ExecuteStatement - comparison on non-scalar types 'M' agrees with the same predicate as a ConditionExpression
- ExecuteStatement - comparison on non-scalar types 'B' matches an equal value
- ExecuteStatement - comparison on non-scalar types 'B' does not match a different value
- ExecuteStatement - comparison on non-scalar types 'B' answers <> as the complement of =
- ExecuteStatement - comparison on non-scalar types 'B' agrees with the same predicate as a ConditionExpression
- ExecuteStatement - comparison on non-scalar types 'NULL' matches an equal value
- ExecuteStatement - comparison on non-scalar types 'NULL' does not match a different value
- ExecuteStatement - comparison on non-scalar types 'NULL' answers <> as the complement of =
- ExecuteStatement - comparison on non-scalar types 'NULL' agrees with the same predicate as a ConditionExpression
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering rejects < against BOOL
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering rejects < against NULL
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering rejects < against L
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering rejects < against M
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering rejects < against SS
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering rejects < against NS
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering rejects < against BS
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering names the operator < as written
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering names the operator <= as written
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering names the operator > as written
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering names the operator >= as written
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering names BETWEEN as written too
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts = and <> against BOOL
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts = and <> against NULL
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts = and <> against L
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts = and <> against M
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts = and <> against SS
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts = and <> against NS
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts = and <> against BS
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering accepts an ordering comparison between S and N
- ExecuteStatement - comparison on non-scalar types ordering operators reject an operand type with no ordering orders binary by its bytes
- ExecuteStatement - comparison on non-scalar types a write conditioned on a non-scalar predicate fires when the predicate holds
- ExecuteStatement - comparison on non-scalar types a write conditioned on a non-scalar predicate raises ConditionalCheckFailed and leaves the item when it does not
- ExecuteStatement - PartiQL INSERTs a new item
- ExecuteStatement - PartiQL SELECTs an item by primary key
- ExecuteStatement - PartiQL SELECTs with WHERE clause using comparison
- ExecuteStatement - PartiQL UPDATEs an existing item
- ExecuteStatement - PartiQL DELETEs an item
- ExecuteStatement - PartiQL rejects INSERT on an existing item (INSERT is not upsert)
- ExecuteStatement - PartiQL INSERT succeeds after DELETE of same key
- ExecuteStatement - PartiQL SELECT returns empty results for non-matching WHERE
- ExecuteStatement - PartiQL parameterized INSERT with ? placeholders
- ExecuteStatement - PartiQL parameterized SELECT with ? placeholder
- ExecuteStatement - PartiQL SELECT with nested map path
- ExecuteStatement - PartiQL SELECT with specific attributes
- ExecuteStatement - PartiQL SELECT with begins_with in WHERE clause
- ExecuteStatement - PartiQL PartiQL UPDATE with SET on attribute
- ExecuteStatement - PartiQL PartiQL UPDATE with REMOVE
- ExecuteStatement - PartiQL returns a populated ConsumedCapacity block when requested
- ExecuteStatement - PartiQL evaluates negated predicates (NOT begins_with, IS NOT MISSING)
- ExecuteStatement - PartiQL DELETE with a false non-key predicate fails ConditionalCheckFailed and leaves the item
- ExecuteStatement - PartiQL DELETE with a true non-key predicate removes the item
- ExecuteStatement - PartiQL UPDATE with a false non-key predicate fails ConditionalCheckFailed and leaves the item
- ExecuteStatement - PartiQL UPDATE with a true non-key predicate mutates the item
- ExecuteStatement - PartiQL DELETE with a false NOT begins_with predicate fails ConditionalCheckFailed
- ExecuteStatement - PartiQL DELETE with a true NOT begins_with predicate removes the item
- ExecuteStatement - PartiQL rejects a write WHERE clause that omits the primary key
- ExecuteStatement - PartiQL DELETE on a missing key with a non-key predicate is a silent no-op
- ExecuteStatement - PartiQL DELETE RETURNING ALL OLD * returns the deleted item
- ExecuteStatement - PartiQL DELETE RETURNING ALL OLD * on a missing item returns an empty Items list
- ExecuteStatement - PartiQL DELETE rejects RETURNING MODIFIED OLD * (only ALL OLD * is valid on DELETE)
- ExecuteStatement - PartiQL DELETE rejects RETURNING MODIFIED NEW * (only ALL OLD * is valid on DELETE)
- ExecuteStatement - PartiQL DELETE rejects RETURNING ALL NEW * with a 400, not a 500
- ExecuteStatement - PartiQL UPDATE RETURNING ALL OLD * returns the full prior item
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * returns only the changed attribute (old value, no key)
- ExecuteStatement - PartiQL UPDATE RETURNING ALL NEW * returns the full new item
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * returns only the changed attribute (new value, no key)
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * over a nested path returns only the changed leaf
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * over a nested path returns only the changed leaf at its old value
- ExecuteStatement - PartiQL UPDATE REMOVE RETURNING MODIFIED OLD * returns the removed attribute at its old value
- ExecuteStatement - PartiQL UPDATE REMOVE RETURNING MODIFIED NEW * returns an empty Items list
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * on a newly-set attribute returns an empty Items list
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * on a newly-set attribute returns the new value
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * on a list index returns only the changed element
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * on a list index returns only the prior element
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * on a non-zero list index returns only the changed element
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * on a non-zero list index returns the prior element
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * over multiple list indices returns a dense pack of the changed elements
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * over multiple list indices returns the prior elements densely
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * packs changed indices in ascending index order, not statement order
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * packs changed indices in ascending index order, not statement order
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * on an out-of-range list index (append) returns an empty Items list
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * on an out-of-range list index (append) returns an empty Items list
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED NEW * appending at exactly the list length returns the appended element
- ExecuteStatement - PartiQL UPDATE RETURNING MODIFIED OLD * appending at exactly the list length returns an empty Items list
- ExecuteStatement - PartiQL UPDATE REMOVE RETURNING MODIFIED OLD * on a list index returns the removed element at its old value
- ExecuteStatement - PartiQL UPDATE REMOVE RETURNING MODIFIED NEW * on a list index returns the shifted element, not an empty list
- ExecuteStatement - PartiQL UPDATE REMOVE RETURNING MODIFIED NEW * on the last list index returns an empty Items list
- ExecuteStatement - PartiQL UPDATE REMOVE RETURNING MODIFIED OLD * on the last list index returns the removed element
- ExecuteStatement - PartiQL UPDATE SET on a list index of an absent attribute is rejected, not auto-created
- ExecuteStatement - PartiQL UPDATE on a non-existent key fails ConditionalCheckFailed (PartiQL UPDATE is not an upsert)
- ExecuteStatement - PartiQL rejects a statement with syntax error
- ExecuteStatement - PartiQL rejects a reference to a non-existent table
- ExecuteTransaction - PartiQL transactional INSERT and UPDATE both succeed atomically
- ExecuteTransaction - PartiQL transaction rolls back on duplicate key INSERT
- ExecuteTransaction - PartiQL multiple INSERTs in one transaction
- ExecuteTransaction - PartiQL idempotent replay under the same ClientRequestToken does not double-apply
- ExecuteTransaction - PartiQL rejects a RETURNING clause inside a transaction statement
- ExecuteTransaction - PartiQL rejects empty TransactStatements
- ExecuteStatement - index qualifier membership a qualified SELECT omits an item the index does not hold
- ExecuteStatement - index qualifier projection follows the index, not the item a KEYS_ONLY GSI returns the index key and the table key and nothing else
- ExecuteStatement - index qualifier projection follows the index, not the item an INCLUDE GSI adds the named attribute and no others
- ExecuteStatement - index qualifier projection follows the index, not the item a KEYS_ONLY LSI returns the index key and the table key and nothing else
- ExecuteStatement - index qualifier projection follows the index, not the item SELECT * against a non-ALL index does not reach back
- ExecuteStatement - index qualifier the reach-back splits by index kind an LSI serves an unprojected attribute from the base table
- ExecuteStatement - index qualifier the reach-back splits by index kind a GSI rejects an unprojected attribute rather than reaching back
- ExecuteStatement - index qualifier the reach-back splits by index kind naming only projected attributes on an LSI charges no table arm
- ExecuteStatement - index qualifier the reach-back splits by index kind a filtered reach-back is charged on rows walked, not rows kept
- ExecuteStatement - index qualifier the reach-back splits by index kind a bounded reach-back walks fewer rows and is charged less
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition rejects a keyed GSI read filtering on an unprojected attribute
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition rejects the LSI mirror, so the rule is not about index kind
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition accepts the same GSI filter unkeyed, matching nothing
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition accepts the same LSI filter unkeyed, matching nothing
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition accepts two unprojected filters with no index key
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition accepts a keyed read filtering on an attribute the index does project
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition rejects a keyed read with IS MISSING on an unprojected attribute
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition rejects a keyed read with IS NOT MISSING on an unprojected attribute
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition rejects a keyed read with begins_with on an unprojected attribute
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition accepts the same predicate on a projected attribute
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition rejects a keyed read with a negated filter on an unprojected attribute
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition matches every index row when the negated filter names an absent attribute
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition counts IN on the index partition key as keyed
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition accepts an unprojected filter inside an OR branch
- ExecuteStatement - index qualifier the unprojected-filter rejection turns on the key condition counts BETWEEN on the index sort key as keyed
- ExecuteStatement - index qualifier pagination across a qualified read mints a token when a bounded read leaves rows behind
- ExecuteStatement - index qualifier pagination across a qualified read rejects a token minted against one index and replayed against another
- ExecuteStatement - index qualifier write statements reject the qualifier, and not all the same way rejects an INSERT carrying a qualifier at parse position
- ExecuteStatement - index qualifier write statements reject the qualifier, and not all the same way rejects an INSERT whose qualifier names no index with the same message
- ExecuteStatement - index qualifier write statements reject the qualifier, and not all the same way rejects an UPDATE carrying a qualifier semantically
- ExecuteStatement - index qualifier write statements reject the qualifier, and not all the same way rejects a DELETE carrying a qualifier semantically
- ExecuteStatement - index qualifier write statements reject the qualifier, and not all the same way leaves the rows untouched after the rejected writes
- ExecuteStatement - index qualifier a transaction refuses an index-qualified read rejects it outright, not as a cancellation
- ExecuteStatement - index qualifier a transaction refuses an index-qualified read accepts the same read unqualified
- ExecuteStatement - index qualifier capacity lands on the index arm a keyed GSI read charges the index and a zero table arm
- ExecuteStatement - index qualifier capacity lands on the index arm a keyed LSI read charges the index and a zero table arm
- ExecuteStatement - index qualifier capacity lands on the index arm ConsistentRead doubles the LSI arm
- ExecuteStatement - index qualifier capacity lands on the index arm ConsistentRead doubles both arms of a reach-back
- ExecuteStatement - index qualifier capacity lands on the index arm rejects ConsistentRead against a GSI qualifier
-
vectorSearch Tier 2 none of it 36 not attempted
View these tests in the suite →- SearchVectors - ConsumedCapacity shape reports VectorSearchRequestBytes with no classic capacity fields
- SearchVectors - ConsumedCapacity shape reports the same shape under INDEXES as under TOTAL
- SearchVectors - ConsumedCapacity shape reports nothing under NONE
- PutItem - vector write capacity shape INDEXES adds a per-index VectorWriteRequestBytes map beside the classic fields
- PutItem - vector write capacity shape TOTAL folds nothing in: no vector fields at all
- PutItem - vector write capacity shape a write not touching the vector attribute reports no vector write
- PutItem - vector write capacity shape an identical overwrite reports no vector write: replication is delta-based
- PutItem - a vector index is charged on the change to its stored view charges the index that projects the changed attribute, and not the one that does not
- PutItem - a vector index is charged on the change to its stored view charges neither when the write changes nothing either index holds
- PutItem - VectorWriteRequestBytes reports the 1024 floor for an entry below it on every term
- PutItem - VectorWriteRequestBytes applies the floor per index, not per write
- PutItem - VectorWriteRequestBytes charges four bytes per dimension
- PutItem - VectorWriteRequestBytes charges the vector attribute’s name by its own length
- PutItem - VectorWriteRequestBytes charges a projected non-vector attribute its own item size
- CreateTable - vector index lifecycle walks CREATING to ACTIVE and describes the index faithfully
- CreateTable - vector index lifecycle round-trips a SearchSchema of HASH and INLINE_FILTER elements
- CreateTable - vector index lifecycle accepts the 4096-dimension boundary
- SearchVectors - index readiness after CreateTable rejects retryably between ACTIVE and the first served search
- PartiQL - vector indexes are out of reach rejects a PartiQL read of a vector index
- PartiQL - vector indexes are out of reach reads the vector attribute off the base table like any other item
- SearchVectors - deterministic search behaviour COSINE: identical vector scores 0, opposite scores 2, lower is closer
- SearchVectors - deterministic search behaviour EUCLIDEAN: identical vector scores 0, straight-line distance otherwise
- SearchVectors - deterministic search behaviour DOT_PRODUCT: higher is closer and scores can be negative
- SearchVectors - deterministic search behaviour returns the identical vector as the top match
- SearchVectors - deterministic search behaviour omits the vector attribute by default and returns it when projected
- SearchVectors - deterministic search behaviour caps results at the item count with no pagination surface
- SearchVectors - deterministic search behaviour stores full precision on the base table and f32 in the index
- UpdateTable - vector index lifecycle adds an index that backfills like a GSI, enforces one online action, then deletes it
- UpdateTable - vector index lifecycle refuses to delete the table while a vector index is still being created
- UpdateTable - vector index lifecycle reports UPDATING with Backfilling false while allocating, and takes a cancel only once backfilling starts
- CreateTable - vector index request validation rejects Dimensions of 0 at the request model layer
- CreateTable - vector index request validation rejects an index name shorter than 3 characters
- SearchVectors - request validation rejects TopK of 0 at the request model layer
- SearchVectors - request validation rejects a search against an index the table does not have
- PutItem - vector index write validation accepts a write missing the HASH attribute but leaves it unreachable through that index
- PutItem - vector index write validation removes an item from the index when its vector attribute is removed
-
account Tier 2 none of it 2 not attempted
View these tests in the suite →- Account reads - DescribeLimits, DescribeEndpoints DescribeLimits returns positive account and table capacity limits
- Account reads - DescribeLimits, DescribeEndpoints DescribeEndpoints returns at least one endpoint with an address
-
contributorInsights Tier 2 none of it 2 not attempted
View these tests in the suite →- Contributor insights - enable/describe/list reports DISABLED by default
- Contributor insights - enable/describe/list enabling transitions the status and lists the table
-
export Tier 2 none of it 2 not attempted
View these tests in the suite →- Export and import - S3 ExportTableToPointInTime initiates an export and reports it
- Export and import - S3 ImportTable ingests S3 data into a new table
-
resourcePolicy Tier 2 none of it 2 not attempted
View these tests in the suite →- Resource policies - Put/Get/Delete GetResourcePolicy on a table with no policy throws PolicyNotFoundException
- Resource policies - Put/Get/Delete Put then Get round-trips the policy, and Delete removes it
-
kinesis Tier 2 none of it 1 not attempted
View these tests in the suite →- Kinesis streaming destination enables a streaming destination and reports it via Describe
Run history
Every percentage here is divergence, per tier and over the whole suite, so lower is better in each column. Coverage is the exception it is named as.
| Run | Gradecurrent criteria | Divergence | Movement |
|---|---|---|---|
|
Suite on Kumo joins the board, suggested by @exoego. It is a Go emulator covering 82 AWS services, of which DynamoDB is one, and it runs from a container image or a single binary with nothing else to install. The board's separate support and capability pages are now one emulator directory, with each project's feature and operation support in a single entry. |
Grade F | 45.2% | first run |