Skip to content
Grade F
severe divergence
answers 44.4% of the suite differently from real DynamoDB
69.7% of the suite implemented · 508 tests it doesn't attempt
Tier 1 · Core 47.3% diverges
100.0% covered
235 of 497 attempted
Tier 2 · Complete 13.1% diverges
27.9% covered 326 unsupported
59 of 126 attempted
Tier 3 · Strict 61.9% diverges
75.0% covered 182 unsupported
451 of 547 attempted

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 all regions, measured against 32 of 32 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.

44.4% 32 regions
af-south-1ap-east-1ap-east-2ap-northeast-1ap-northeast-2ap-northeast-3ap-south-1ap-south-2ap-southeast-1ap-southeast-2ap-southeast-3ap-southeast-4ap-southeast-5ap-southeast-6ap-southeast-7ca-central-1ca-west-1eu-central-1eu-central-2eu-north-1eu-south-1eu-south-2eu-west-1eu-west-2 · baselineeu-west-3il-central-1mx-central-1sa-east-1us-east-1us-east-2us-west-1us-west-2

Feature support

Measured across the suite's tests for each feature. Compare with other emulators.

Kumo 7b15ae8b6e4b

Core DynamoDB

Vector search
Kumo Vector search: not supported (58 skip)
GSI
Kumo GSI: partially supported (29 pass, 94 fail, 86 skip)
LSI
Kumo LSI: partially supported (22 pass, 66 fail, 78 skip)
PartiQL
Kumo PartiQL: not supported (441 skip)
Transactions
Kumo Transactions: partially supported (49 pass, 135 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, 47 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: partially supported (1 pass, 1 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

Both are plotted because neither reads correctly alone. Divergence falls when a target stops attempting an operation it used to get wrong, so a fall in the first plot is only an improvement if the second one holds.

Divergence

Kumo divergence, 2026-09-20 to 2026-11-02 0% 25% 50% divergence - lower is better 20 Sep 29 Sep 9 Oct 11 Oct 18 Oct 22 Oct 25 Oct 27 Oct 2 Nov 44.4%
Diverging on 44.4% of the suite as of 2 Nov, at worst 45.2% on 20 Sep. Lower is better, so a falling line is a target getting closer to real DynamoDB.

Coverage

Kumo coverage, 2026-09-20 to 2026-11-02 65% 83% 100% coverage - higher is better 20 Sep 29 Sep 9 Oct 11 Oct 18 Oct 22 Oct 25 Oct 27 Oct 2 Nov 69.7%
Implementing 69.7% of the suite as of 2 Nov. Higher is better. This is the share of the suite's tests a target implements at all. A fail becoming a skip leaves both numerators over the same fixed denominator, so a fall here is matched point for point by a fall in divergence: withdrawal costs exactly as much coverage as it gains divergence.

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 83/130 63.8% 100.0% putItem: partially supported, diverges on 63.8% of it, covers 100.0% (47 pass, 83 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 · 1 skip 0.0% 50.0% account: partially supported, diverges on 0.0% of it, covers 50.0% (1 pass, 1 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)
  • multiAttributeKeys 11/14 78.6% 100.0% multiAttributeKeys: partially supported, diverges on 78.6% of it, covers 100.0% (3 pass, 11 fail)
  • partiql 0/275 · 275 skip n/a 0.0% partiql: unsupported, implements none of it (275 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/40 · 40 skip n/a 0.0% vectorSearch: unsupported, implements none of it (40 skip)

Tier 3 - Strict

  • error-messages 209/393 · 174 skip 53.2% 55.7% error-messages: partially supported, diverges on 53.2% of it, covers 55.7% (10 pass, 209 fail, 174 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 140/203 · 5 skip 69.0% 97.5% limits: partially supported, diverges on 69.0% of it, covers 97.5% (58 pass, 140 fail, 5 skip)
  • validation-ordering 78/91 · 3 skip 85.7% 96.7% validation-ordering: partially supported, diverges on 85.7% of it, covers 96.7% (10 pass, 78 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 209 diverging 174 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 - exact error messages malformed table name: full map-keys constraint message source:179
    • BatchGetItem - exact error messages empty Keys list: full minimum-length message source:191
    • BatchGetItem - ProjectionExpression rejection messages duplicate paths (a, a) reject even when the key matches no item source:223
    • BatchGetItem - ProjectionExpression rejection messages two distinct aliases resolving to one attribute (#a, #b -> a): rejected on the resolved names source:236
    • BatchGetItem - ProjectionExpression rejection messages overlapping parent and child paths (a, a.b): full overlap message source:249
    • BatchGetItem - ProjectionExpression rejection messages a bad projection on one table entry rejects the whole batch despite a clean entry on another source:278
    • BatchWriteItem - exact error messages empty RequestItems: full required-parameter error source:44
    • BatchWriteItem - exact error messages > 25 requests: anchored regex on the constraint phrase source:91
    • BatchWriteItem - exact error messages same key Put and Delete in one batch: full duplicate-keys error source:109
    • BatchWriteItem - exact error messages non-existent table: full ResourceNotFoundException message source:134
    • BatchWriteItem - exact error messages empty-string table key: full empty-value message source:155
    • BatchWriteItem - exact error messages empty-binary put-request key: full empty-value message source:155
    • BatchWriteItem - exact error messages empty-binary delete-request key: full empty-value message source:155
    • BatchWriteItem - exact error messages empty request list for a table: exact constraint message source:234
    • BatchWriteItem - exact error messages malformed table name: anchored regex on the map-keys constraint source:262
    • 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
    • DeleteItem - request validation envelope ExpressionAttributeValues or ExpressionAttributeNames without an expression source:115
    • DeleteItem - request validation envelope an empty ExpressionAttributeValues or ExpressionAttributeNames map source:112
    • DeleteItem - request validation envelope an empty ConditionExpression source:115
    • DeleteItem - request validation envelope ReturnValues ALL_NEW or UPDATED_NEW source:115
    • DeleteItem - request validation envelope every malformed Expected condition source:115
    • 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
    • PutItem - request validation envelope ExpressionAttributeValues or ExpressionAttributeNames without an expression source:395
    • PutItem - request validation envelope an empty ConditionExpression source:395
    • PutItem - request validation envelope a malformed Expected condition source:395
    • 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
    • Query - KeyConditionExpression operand types begins_with on a string sort key with a number operand - exact message source:30
    • Query - KeyConditionExpression operand types begins_with on a string sort key with a boolean operand - exact message source:30
    • Query - KeyConditionExpression operand types begins_with on a number sort key with a number operand - exact message source:30
    • Query - KeyConditionExpression operand types begins_with on a number sort key with a string operand fails the schema check - exact message source:30
    • Query - KeyConditionExpression operand types an ordering comparison with a boolean operand - exact message source:30
    • Query - KeyConditionExpression operand types an ordering comparison written value first - exact message source:30
    • Query - KeyConditionExpression operand types BETWEEN with boolean bounds - exact message source:30
    • Query - KeyConditionExpression operand types equality with a boolean fails the schema check - exact message source:30
    • Query - KeyConditionExpression operand types two conditions on the sort key - exact message source:30
    • Query - KeyConditionExpression operand types three conditions naming three attributes on a two-attribute key - exact message source:30
    • Query - multi-attribute GSI key exact error messages a gap in the RANGE attributes - exact message source:65
    • Query - multi-attribute GSI key exact error messages a range condition before the last attribute named - exact message source:65
    • Query - multi-attribute GSI key exact error messages skipping the first RANGE attribute - exact message source:65
    • Scan - exact error messages Segment without TotalSegments: full required-parameter error source:31
    • Scan - exact error messages Segment >= TotalSegments: full out-of-range error source:62
    • Scan - exact error messages TotalSegments without Segment: full required-parameter error source:80
    • Scan - exact error messages Limit of 0: full minimum-value error source:101
    • Scan - exact error messages negative Segment: full minimum-value error source:127
    • Scan - exact error messages non-existent table: full ResourceNotFoundException message source:146
    • Scan - exact error messages begins_with with non-string operand: full operand-type error source:164
    • Scan - exact error messages redundant parentheses in FilterExpression: full error string source:184
    • Scan - exact error messages malformed ExclusiveStartKey: long schema-mismatch error source:209
    • Scan - exact error messages Select SPECIFIC_ATTRIBUTES without ProjectionExpression: full required-projection message source:234
    • Scan - ProjectionExpression rejection messages duplicate paths (a, a) reject even when the filter matches nothing source:270
    • Scan - ProjectionExpression rejection messages two distinct aliases resolving to one attribute (#a, #b -> a): rejected on the resolved names source:283
    • Scan - ProjectionExpression rejection messages overlapping parent and child paths (a, a.b) reject even when the filter matches nothing source:296
    • Scan - ProjectionExpression rejection messages rejects an undefined projection name even when the scan matches nothing source:311
    • Scan - ProjectionExpression rejection messages duplicate paths still reject when the filter matches a row (control) source:334
    • TransactGetItems - exact error messages empty TransactItems: full minimum-length error source:31
    • TransactGetItems - exact error messages > 100 gets: anchored regex on the constraint phrase source:64
    • TransactGetItems - exact error messages non-existent table: full ResourceNotFoundException message source:88
    • TransactGetItems - exact error messages invalid ProjectionExpression syntax: full parser error source:113
    • TransactGetItems - exact error messages missing key attribute: action-level ValidationError surfaces as TransactionCanceledException source:140
    • TransactGetItems - exact error messages malformed table name: top-level ValidationException naming the member source:165
    • TransactGetItems - exact error messages malformed table name on the second Get: the message names its position source:185
    • 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:55
    • TransactWriteItems - exact error messages > 100 actions: anchored regex on the constraint phrase source:92
    • TransactWriteItems - exact error messages duplicate target keys in same transaction: full multi-op error source:118
    • TransactWriteItems - exact error messages non-existent table: full ResourceNotFoundException message source:146
    • TransactWriteItems - exact error messages two failing actions: multi-reason TransactionCanceledException source:199
    • TransactWriteItems - exact error messages one passing, one failing: positional reason codes (None for the survivor) source:247
    • TransactWriteItems - exact error messages Put wrong-typed table key: cancelled with full ValidationError reason source:273
    • TransactWriteItems - exact error messages Put non-scalar table key: cancelled with full ValidationError reason source:273
    • TransactWriteItems - exact error messages Put empty-string table key: top-level ValidationException source:294
    • TransactWriteItems - exact error messages Update empty-string Key: top-level empty-value message source:294
    • TransactWriteItems - exact error messages Delete empty-string Key: top-level empty-value message source:294
    • TransactWriteItems - exact error messages ConditionCheck empty-string Key: top-level empty-value message source:294
    • TransactWriteItems - exact error messages Update wrong-typed Key: cancelled with schema-mismatch reason source:273
    • TransactWriteItems - exact error messages Update non-scalar Key: cancelled with schema-mismatch reason source:273
    • TransactWriteItems - exact error messages Delete wrong-typed Key: cancelled with schema-mismatch reason source:273
    • TransactWriteItems - exact error messages Delete non-scalar Key: cancelled with schema-mismatch reason source:273
    • TransactWriteItems - exact error messages ConditionCheck wrong-typed Key: cancelled with schema-mismatch reason source:273
    • TransactWriteItems - exact error messages ConditionCheck non-scalar Key: cancelled with schema-mismatch reason source:273
    • TransactWriteItems - exact error messages Put empty-binary item key: top-level empty-value message source:294
    • TransactWriteItems - exact error messages Update empty-binary Key: top-level empty-value message source:294
    • TransactWriteItems - exact error messages Delete empty-binary Key: top-level empty-value message source:294
    • TransactWriteItems - exact error messages ConditionCheck empty-binary Key: top-level empty-value message source:294
    • TransactWriteItems - exact error messages Put malformed table name: top-level message naming the member source:295
    • TransactWriteItems - exact error messages Update malformed table name on the second action: top-level message naming the member source:295
    • TransactWriteItems - exact error messages Delete malformed table name: top-level message naming the member source:295
    • TransactWriteItems - exact error messages ConditionCheck malformed table name: top-level message naming the member source:295
    • TransactWriteItems - exact error messages Put empty ConditionExpression: top-level empty-expression message source:294
    • TransactWriteItems - exact error messages Delete empty ConditionExpression: top-level empty-expression message source:294
    • TransactWriteItems - exact error messages ConditionCheck empty ConditionExpression: top-level empty-expression message source:294
    • TransactWriteItems - exact error messages ConditionCheck malformed ConditionExpression: top-level syntax message source:295
    • TransactWriteItems - exact error messages ConditionCheck unused ExpressionAttributeValues: top-level message source:294
    • TransactWriteItems - exact error messages Put unused ExpressionAttributeValues: top-level message source:294
    • TransactWriteItems - exact error messages Update unused ExpressionAttributeValues: top-level message source:294
    • TransactWriteItems - exact error messages Delete unused ExpressionAttributeValues: top-level message source:295
    • TransactWriteItems - exact error messages unused value on the second action: nothing is written source:294
    • TransactWriteItems - exact error messages action with no operation: top-level message source:491
    • 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 undefined value in the ConditionExpression beside a defined one: full error string source:151
    • UpdateItem - exact error messages mixing UpdateExpression with AttributeUpdates source:173
    • UpdateItem - exact error messages empty UpdateExpression source:192
    • UpdateItem - exact error messages cannot update range key attribute on composite table source:214
    • UpdateItem - exact error messages empty-binary key value: full ValidationException message source:234
    • Number values - messages by operation PutItem refuses every malformed number in an item inside the validation envelope source:112
    • Number values - messages by operation PutItem refuses a malformed number set member and a nested number inside the envelope source:118
    • Number values - messages by operation PutItem refuses a malformed number in a condition value inside the envelope source:57
    • Number values - messages by operation PutItem checks the numbers in Expected values and writes nothing source:137
    • Number values - messages by operation UpdateItem refuses a malformed number in a value, in AttributeUpdates and in the key inside the envelope source:153
    • Number values - messages by operation DeleteItem refuses a malformed number in a condition value and in the key inside the envelope, with no wrapper source:57
    • Number values - messages by operation GetItem, BatchGetItem and Query refuse a malformed number bare, in the current wording source:177
    • Number values - messages by operation BatchWriteItem refuses a malformed number bare, in one layer for every shape source:183
    • Number values - transactions by region TransactWriteItems refuses a malformed number in a Put item up front source:194
    • Number values - transactions by region TransactWriteItems refuses a malformed number in an Update value up front source:194
    • Number values - transactions by region TransactGetItems refuses a malformed number in a key up front source:194
    • Duplicate set members - messages by operation PutItem refuses a duplicate in an item, a condition value and an Expected value inside the envelope source:57
    • Duplicate set members - messages by operation UpdateItem refuses a duplicate in a condition value, AttributeUpdates and the key inside the envelope source:57
    • Duplicate set members - messages by operation DeleteItem refuses a duplicate in the key inside the envelope source:292
    • Duplicate set members - messages by operation GetItem and BatchGetItem refuse a duplicate in the key bare, in the current wording source:298
    • Duplicate set members - messages by operation Query refuses a duplicate in a key value, a filter value, ExclusiveStartKey and QueryFilter bare, with no wrapper source:329
    • Duplicate set members - messages by operation BatchWriteItem refuses a duplicate in an item and a delete key bare, in one layer for both source:345
    • Duplicate set members - transactions by region TransactWriteItems refuses a duplicate in a Put item and a Delete key up front source:368
    • Duplicate set members - transactions by region TransactWriteItems refuses a duplicate in a condition or update value of every action type up front source:57
    • Duplicate set members - transactions by region TransactGetItems refuses a duplicate in a key up front source:358
    • 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 functions - exact error messages attribute_exists with a string literal - exact message
    • PartiQL functions - exact error messages attribute_exists with a parameter - exact message
    • PartiQL functions - exact error messages attribute_exists with no operand - exact message
    • PartiQL functions - exact error messages attribute_exists with two operands - exact message
    • PartiQL functions - exact error messages attribute_exists as a SELECT projection - exact message
    • PartiQL functions - exact error messages EXISTS(path) in a WHERE is not a function - exact message
    • PartiQL functions - exact error messages a path through an attribute named inner - exact message
    • PartiQL functions - exact error messages a SELECT in ExecuteTransaction whose WHERE uses attribute_exists - exact message
    • PartiQL functions - exact error messages a SELECT in BatchExecuteStatement whose WHERE uses attribute_exists - exact message
    • PartiQL functions - exact error messages EXISTS(SELECT ...) with no further condition in ExecuteTransaction - exact message
    • PartiQL functions - exact error messages set_add assigned to another attribute - exact message
    • PartiQL functions - exact error messages set_add whose first argument is not a path - exact message
    • PartiQL functions - exact error messages set_add with a string to add - exact message
    • PartiQL functions - exact error messages set_add with a list to add - exact message
    • PartiQL functions - exact error messages set_add with one argument - exact message
    • PartiQL functions - exact error messages set_add with three arguments - exact message
    • PartiQL functions - exact error messages set_add of a number to a string set - exact message
    • PartiQL functions - exact error messages set_add to an attribute that is not a set - exact message
    • PartiQL functions - exact error messages set_add of a set literal with a repeated member - exact message
    • PartiQL functions - exact error messages set_add of an empty set literal - exact message
    • PartiQL functions - exact error messages set_add on a path through an attribute named inner - exact message
    • PartiQL functions - exact error messages set_add in a SELECT WHERE - exact message
    • PartiQL functions - exact error messages set_add in an INSERT value - exact message
    • PartiQL functions - exact error messages set_delete assigned to another attribute - exact message
    • PartiQL functions - exact error messages set_delete with a string to remove - exact message
    • PartiQL functions - exact error messages set_delete of a number from a string set - exact message
    • PartiQL grammar - exact error messages a token after a SELECT WHERE clause - exact message
    • PartiQL grammar - exact error messages a number split from its exponent - exact message
    • PartiQL grammar - exact error messages a token after an INSERT item literal - exact message
    • PartiQL grammar - exact error messages a token after an UPDATE WHERE clause - exact message
    • PartiQL grammar - exact error messages a token after a DELETE WHERE clause - exact message
    • PartiQL grammar - exact error messages a stray closing parenthesis - exact message
    • PartiQL grammar - exact error messages ORDER BY on a DELETE - exact message
    • PartiQL grammar - exact error messages ORDER BY ahead of WHERE - exact message
    • PartiQL grammar - exact error messages an exponent that does not fit a 32-bit integer - nothing after the colon
    • PartiQL grammar - exact error messages a far larger exponent - nothing after the colon
    • PartiQL grammar - exact error messages an exponent that fits but leaves a scale that does not - nothing after the colon
    • PartiQL grammar - exact error messages a hash comment - nothing after the colon
    • PartiQL grammar - exact error messages an unterminated block comment - nothing after the colon
    • PartiQL grammar - exact error messages an alias on a SELECT - exact message
    • PartiQL grammar - exact error messages an AS alias on a SELECT - exact message
    • PartiQL grammar - exact error messages an alias on an UPDATE - exact message
    • PartiQL grammar - exact error messages an alias on a DELETE - exact message
    • PartiQL grammar - exact error messages an alias on an INSERT is a leftover token - exact message
    • PartiQL grammar - exact error messages a WHERE literal above the largest number - exact message
    • PartiQL grammar - exact error messages a WHERE literal below the smallest number - exact message
    • PartiQL grammar - exact error messages a WHERE literal with 39 significant digits - exact message
    • PartiQL grammar - exact error messages an INSERT literal above the largest number - exact message
    • PartiQL grammar - exact error messages an UPDATE SET literal below the smallest number - exact message
    • PartiQL grammar - exact error messages a literal inside a map names its path - exact message
    • PartiQL grammar - exact error messages a literal inside a list names its index - exact message
    • PartiQL grammar - exact error messages WHERE at the end of a SELECT - exact message
    • PartiQL grammar - exact error messages WHERE then a semicolon - exact message
    • PartiQL grammar - exact error messages WHERE then spaces - exact message
    • PartiQL grammar - exact error messages WHERE after a projection - exact message
    • PartiQL grammar - exact error messages WHERE at the end of an UPDATE - exact message
    • PartiQL grammar - exact error messages WHERE at the end of a DELETE - exact message
    • PartiQL grammar - exact error messages WHERE NOT with nothing after it - exact message
    • PartiQL grammar - exact error messages WHERE ( with nothing after it - exact message
    • PartiQL grammar - exact error messages WHERE at the end, on a table that does not exist - exact message
    • PartiQL grammar - exact error messages a condition ending in AND - exact message
    • PartiQL grammar - exact error messages a condition ending in OR - exact message
    • PartiQL grammar - exact error messages WHERE followed by ORDER BY - exact message
    • PartiQL grammar - exact error messages an empty WHERE in ExecuteTransaction - exact message
    • PartiQL grammar - exact error messages an empty WHERE in BatchExecuteStatement - exact message
    • PartiQL grammar - exact error messages IS INT4 parses as a type test - exact message
    • PartiQL grammar - exact error messages IS INT8 parses as a type test - exact message
    • PartiQL grammar - exact error messages IS DOUBLE PRECISION parses as a type test - exact message
    • PartiQL grammar - exact error messages IS CHARACTER VARYING parses as a type test - exact message
    • PartiQL grammar - exact error messages IS with a name that is not a type, in a WHERE - exact message
    • PartiQL grammar - exact error messages IS where a WHERE condition should start - exact message
    • PartiQL grammar - exact error messages LIKE where a comparison operand should start - exact message
    • PartiQL grammar - exact error messages DELETE FROM with no table - exact message
    • PartiQL grammar - exact error messages DELETE FROM then spaces with no table - exact message
    • PartiQL grammar - exact error messages DELETE FROM then a semicolon with no table - exact message
    • PartiQL grammar - exact error messages DELETE FROM then WHERE with no table - exact message
    • PartiQL grammar - exact error messages SELECT * FROM with no table - exact message
    • PartiQL grammar - exact error messages FROM ... SET with no WHERE - exact message
    • PartiQL grammar - exact error messages FROM ... REMOVE with no WHERE - exact message
    • PartiQL grammar - exact error messages FROM ... WHERE on a non-key attribute ... SET - exact message
    • PartiQL grammar - exact error messages FROM ... SET with the WHERE after it - exact message
    • PartiQL grammar - exact error messages FROM ... SET ... WHERE ... SET - exact message
    • PartiQL grammar - exact error messages FROM ... WHERE ... SET on a table that does not exist - exact error
    • PartiQL grammar - exact error messages an OR branch with a non-key equality beside a sort-key branch - exact message
    • PartiQL grammar - exact error messages an OR branch with a non-key <> beside a sort-key branch - 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
    • PartiQL - multi-attribute index exact error messages a SELECT on a GSI with two HASH and two RANGE attributes - exact message
    • PartiQL - multi-attribute index exact error messages a SELECT on a GSI with two HASH attributes and one RANGE - exact message
    • PartiQL - multi-attribute index exact error messages a SELECT with ORDER BY on a multi-attribute GSI - exact message
    • PartiQL - multi-attribute index exact error messages a statement that breaks off reports its syntax error ahead of the refusal
    • PartiQL - multi-attribute index exact error messages a number literal that cannot be converted is reported ahead of the refusal
    • PartiQL - multi-attribute index exact error messages a parameter that cannot be converted to a number is reported ahead of the refusal
    • PartiQL - multi-attribute index exact error messages the refusal is reported ahead of a key type mismatch, a non-key WHERE, a missing WHERE and COUNT(*)
    • PartiQL - multi-attribute index exact error messages in a BatchExecuteStatement only the statement reading the index fails, ahead of the key-only rule
    • PartiQL parameters - numbers - exact error messages the parameter 1e99999999999 in a WHERE comparison cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e99999999999 in an INSERT value cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e99999999999 in an UPDATE SET cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e99999999999 in a key cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter -1e99999999999 in a WHERE comparison cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter -1e99999999999 in an INSERT value cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter -1e99999999999 in an UPDATE SET cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter -1e99999999999 in a key cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-99999999999 in a WHERE comparison cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-99999999999 in an INSERT value cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-99999999999 in an UPDATE SET cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-99999999999 in a key cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483648 in a WHERE comparison cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483648 in an INSERT value cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483648 in an UPDATE SET cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483648 in a key cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-2147483648 in a WHERE comparison cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-2147483648 in an INSERT value cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-2147483648 in an UPDATE SET cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e-2147483648 in a key cannot be converted - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483647 in a WHERE comparison underflows - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483647 in an INSERT value underflows - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483647 in an UPDATE SET underflows - exact message
    • PartiQL parameters - numbers - exact error messages the parameter 1e2147483647 in a key underflows - exact message
    • PartiQL parameters - numbers - exact error messages an empty number parameter in a WHERE comparison - exact message
    • PartiQL parameters - numbers - exact error messages an empty number parameter in an INSERT value - exact message
    • PartiQL parameters - numbers - exact error messages an empty number parameter in an UPDATE SET - exact message
    • PartiQL parameters - numbers - exact error messages an empty number parameter in a key - exact message
    • PartiQL parameters - numbers - exact error messages an unconvertible number inside a list parameter - exact message
    • PartiQL parameters - numbers - exact error messages an unconvertible number inside a map parameter - exact message
    • PartiQL parameters - numbers - exact error messages an unconvertible member of a number set parameter - exact message
    • PartiQL parameters - numbers - exact error messages an unconvertible number in ExecuteTransaction - exact message
    • PartiQL parameters - numbers - exact error messages an unconvertible number in BatchExecuteStatement - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels a deep parameter before an unconvertible one - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels an unconvertible parameter before a deep one - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels a deep member of a map before an unconvertible one - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels an unconvertible member of a map before a deep one - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels an unconvertible number at the bottom of a deep value - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels a deep parameter before one past the largest number - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels a deep parameter before an unconvertible one, in ExecuteTransaction - exact message
    • PartiQL parameters - numbers - exact error messages nested 40 levels a deep parameter before an unconvertible one, in BatchExecuteStatement - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels a deep parameter before an unconvertible one - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels an unconvertible parameter before a deep one - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels a deep member of a map before an unconvertible one - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels an unconvertible member of a map before a deep one - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels an unconvertible number at the bottom of a deep value - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels a deep parameter before one past the largest number - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels a deep parameter before an unconvertible one, in ExecuteTransaction - exact message
    • PartiQL parameters - numbers - exact error messages nested 100 levels a deep parameter before an unconvertible one, in BatchExecuteStatement - 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
    • SearchVectors - request shape errors refuses an explicit null member as a SerializationException
    • SearchVectors - request shape errors names a missing TableName as a missing field, before a too-short IndexName
    • 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 140 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:150
    • Expression size limit (4KB) - ConditionExpression rejects a ConditionExpression over the 4096-byte limit source:181
    • Expression size limit (4KB) - Query FilterExpression rejects a Query FilterExpression over the 4096-byte limit source:224
    • Expression size limit (4KB) - Scan FilterExpression rejects a Scan FilterExpression over the 4096-byte limit source:259
    • Expression size limit (4KB) - ProjectionExpression rejects a ProjectionExpression over the 4096-byte limit source:298
    • Expression size limit (4KB) - TransactWriteItems rejects a Put ConditionExpression over the 4096-byte limit source:379
    • Expression size limit (4KB) - TransactWriteItems rejects an Update UpdateExpression over the 4096-byte limit source:424
    • Expression size limit (4KB) - TransactWriteItems rejects a Delete ConditionExpression over the 4096-byte limit source:446
    • Expression size limit (4KB) - TransactWriteItems rejects a ConditionCheck ConditionExpression over the 4096-byte limit source:467
    • Expression size limit (4KB) - TransactWriteItems rejects the whole request when only the second member is oversized source:491
    • 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:115
    • Item size limit by surface - TransactWriteItems a Put one byte over raises ValidationException, not a cancellation source:239
    • Item size limit by surface - TransactWriteItems an Update one byte over surfaces as a cancellation, with the update wording source:221
    • Item size limit by surface - TransactWriteItems answers the same way for a fresh key and for an existing row source:221
    • 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:453
    • Item size limit by surface - UpdateItem does not charge for the key caps at exactly 409,600 with a 100-byte key value source:453
    • Item size limit by surface - UpdateItem does not charge for the key caps at exactly 409,600 with a 1024-byte key value source:453
    • 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:453
    • Item size limit by surface - UpdateItem does not charge for the key buys back a sort key’s own bytes as well source:453
    • Item size limit by surface - UpdateItem charges per action charges a second SET clause exactly 19 bytes source:453
    • Item size limit by surface - UpdateItem charges per action charges a REMOVE alongside a SET exactly 2 bytes source:453
    • Item size limit by surface - UpdateItem charges per action charges the clause, not the value it writes source:453
    • Item size limit by surface - UpdateItem charges per action does not charge for an attribute the statement leaves alone source:453
    • Item size limit by surface - UpdateItem charges per action charges the clause, not the attribute name or its alias source:453
    • Item size limit by surface - UpdateItem through a document path charges a SET through a nested path the same as a plain SET source:666
    • Item size limit by surface - UpdateItem through a document path charges a SET through a list index exactly one byte more source:666
    • Item size limit by surface - a transacted Update does not inherit the exclusion writes what UpdateItem refuses at the same key source:746
    • Item size limit by surface - UpdateItem charges each kind of clause charges a path operand 15 bytes plus its name, not the value it copies source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges a nested path operand 14 bytes plus the element for each element source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges list_append 37 bytes plus its operands source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges a document value operand at its size, at every use source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges an addition 34 bytes plus its operands, whatever the result source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges a subtraction 37 bytes plus its operands source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges if_not_exists 39 bytes plus its operands, whether or not the path exists source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges an ADD 19 bytes plus its path and the value added source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges an ADD to a set only for the members it adds source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges a REMOVE one byte plus its path source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges a REMOVE through a list index 4 bytes plus its digits source:885
    • Item size limit by surface - UpdateItem charges each kind of clause charges a DELETE one byte plus its path, not the members it removes source:885
    • Item size limit by surface - AttributeUpdates sizes the finished item caps the finished item at exactly 409,600 alone source:1093
    • Item size limit by surface - AttributeUpdates sizes the finished item caps the finished item at exactly 409,600 beside an untouched attribute source:1093
    • Item size limit by surface - UpdateItem checks the charge before the condition refuses an over-limit charge even when the condition would fail source:1124
    • Item size limit by surface - UpdateItem checks the charge before the condition refuses an over-limit charge when the condition passes, and with no condition source:1129
    • 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:98
    • Nesting depth - 32-level document limit rejects a 32-level ExpressionAttributeValue with ValidationException source:146
    • Nesting depth - 32-level document limit rejects a stored attribute nested 61 levels with the same message source:171
    • Nesting depth - 32-level document limit rejects a stored attribute nested 63 levels without the envelope source:182
    • Nesting depth - 32-level document limit rejects a 63-level ExpressionAttributeValue naming its key source:193
    • Nesting depth - BatchWriteItem accepts a Put item nested 31 levels (leaf at level 32) source:239
    • Nesting depth - BatchWriteItem rejects a Put item nested 32 levels (leaf at level 33) source:247
    • Nesting depth - TransactWriteItems rejects a Put item nested 32 levels with a top-level ValidationException source:298
    • Nesting depth - TransactWriteItems cancels an Update that writes a 32-level value into the item with a ValidationError reason source:349
    • Nesting depth - TransactWriteItems refuses a ConditionCheck value nested 33 levels before the transaction runs source:458
    • Nesting depth - TransactWriteItems refuses a Put whose condition compares a value nested 33 levels, and writes nothing source:482
    • Nesting depth - TransactWriteItems refuses an Update writing a value nested 33 levels before the transaction runs source:509
    • Nesting depth - TransactWriteItems refuses a ConditionCheck map value nested 61 levels, naming the key source:537
    • Nesting depth - TransactWriteItems refuses a ConditionCheck list value nested 61 levels, naming the key source:537
    • A number's byte cost sizes '0' at '1 byte' source:104
    • A number's byte cost sizes '1' at '2 bytes' source:104
    • A number's byte cost sizes '12' at '2 bytes' source:104
    • A number's byte cost sizes '123' at '3 bytes' source:104
    • A number's byte cost sizes '1234' at '3 bytes' source:104
    • A number's byte cost sizes '12345678901234567890123456789012345678' at '20 bytes' source:104
    • A number's byte cost sizes '0042' at '2 bytes' source:104
    • A number's byte cost sizes '100' at '2 bytes' source:104
    • A number's byte cost sizes '1010' at '3 bytes' source:104
    • A number's byte cost sizes '0.0000001' at '2 bytes' source:104
    • A number's byte cost sizes '1E125' at '2 bytes' source:104
    • A number's byte cost sizes '1E-100' at '2 bytes' source:104
    • A number's byte cost sizes '1.5' at '3 bytes' source:104
    • A number's byte cost sizes '15' at '2 bytes' source:104
    • A number's byte cost sizes '1.2' at '3 bytes' source:104
    • A number's byte cost sizes '1.200' at '3 bytes' source:104
    • A number's byte cost sizes '1.234' at '4 bytes' source:104
    • A number's byte cost sizes '3.14159' at '5 bytes' source:104
    • A number's byte cost sizes '123456' at '4 bytes' source:104
    • A number's byte cost sizes '100.5' at '4 bytes' source:104
    • A number's byte cost sizes '0.15' at '2 bytes' source:104
    • A number's byte cost sizes '-42' at '3 bytes' source:104
    • A number's byte cost sizes '-0' at '1 byte' source:104
    • A number is stored expanded and sized by its significant digits trims the zeros it does not count source:129
    • A number is stored expanded and sized by its significant digits expands an exponent it does not count source:134
    • 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:145
    • Number limits - exponents an exponent past a 32-bit integer overflows source:56
    • Number limits - exponents a negative exponent past a 32-bit integer underflows source:60
    • Number limits - exponents an exponent one past a 32-bit integer overflows source:64
    • Number limits - exponents an exponent past a 64-bit integer cannot be converted source:68
    • Number limits - exponents zero with an exponent above the range overflows source:72
    • Number limits - exponents zero with an exponent below the range underflows source:76
    • Number limits - exponents zero with an exponent inside the range is stored as 0 source:82
    • Number limits - exponents an UpdateExpression value with an exponent past a 32-bit integer overflows source:92
    • Number limits - exponents a ConditionExpression value with an exponent past a 32-bit integer overflows source:105
    • Number limits - exponents a GetItem key with an exponent past a 32-bit integer overflows source:122
    • Number limits - exponents a DeleteItem key with an exponent past a 32-bit integer overflows source:130
    • Number limits - exponents an UpdateItem key with an exponent past a 32-bit integer overflows source:138
    • Number limits - exponents a Query sort-key value with an exponent past a 32-bit integer overflows source:151
    • Number limits - exponents a BatchGetItem key with an exponent past a 32-bit integer overflows source:163
    • 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 83 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:38
    • ReturnItemCollectionMetrics DeleteItem with SIZE returns ItemCollectionMetrics source:66
    • ReturnItemCollectionMetrics UpdateItem with SIZE returns ItemCollectionMetrics source:96
    • ReturnItemCollectionMetrics PutItem reports a small item collection as the range 0 to 1 GB source:119
    • 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
  • validation-ordering Tier 3 78 diverging 3 not attempted
    View these tests in the suite →
    • Batch operations - enum and ordering checks BatchWriteItem refuses an unknown ReturnConsumedCapacity and writes nothing source:136
    • Batch operations - enum and ordering checks BatchWriteItem refuses an unknown ReturnItemCollectionMetrics and writes nothing source:136
    • Batch operations - enum and ordering checks BatchWriteItem reports both unknown enums in one message, ReturnConsumedCapacity first source:136
    • Batch operations - enum and ordering checks BatchWriteItem reports an unknown ReturnConsumedCapacity ahead of a missing table source:133
    • Batch operations - enum and ordering checks BatchWriteItem reports an unknown ReturnConsumedCapacity beside a malformed table name source:133
    • Batch operations - enum and ordering checks BatchGetItem refuses an unknown ReturnConsumedCapacity source:136
    • Batch operations - enum and ordering checks BatchGetItem reports an unknown ReturnConsumedCapacity ahead of a missing table source:133
    • Batch operations - enum and ordering checks BatchGetItem reports a malformed table name and an unknown ReturnConsumedCapacity together source:133
    • 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
    • CreateTable - index name errors across index kinds lists the GSI error before the LSI error when the request lists the LSI first source:201
    • CreateTable - index name errors across index kinds lists the GSI error first even when the LSI name sorts first source:198
    • Deep requests - legacy conditions PutItem reports XOR in the older enum wording ahead of an Expected value nested 100 levels source:54
    • Deep requests - legacy conditions UpdateItem reports XOR in the older enum wording ahead of an Expected value nested 100 levels source:54
    • Deep requests - legacy conditions Scan with one ScanFilter condition nested 40 levels and ConditionalOperator AND source:54
    • Deep requests - TransactWriteItems action order reports a Put item nested 40 levels before an empty attribute name in a later Put source:54
    • Deep requests - TransactWriteItems action order reports an empty attribute name before a Put item nested 100 levels in a later Put source:54
    • Deep requests - TransactWriteItems action order reports a top-level empty attribute name before a value nested 100 levels in the same item, in either order source:54
    • Deep requests - TransactWriteItems action order refuses a value nested 40 levels beside an empty map key inside the same item source:54
    • Deep requests - TransactWriteItems action order reports an empty attribute name before a later ConditionCheck value nested 100 levels source:54
    • Deep requests - TransactWriteItems action order reports an earlier ConditionCheck value nested 40 levels before a later empty attribute name source:54
    • Deep requests - TransactWriteItems action order reports an earlier Update value nested 40 levels before a later empty attribute name source:54
    • Deep requests - TransactWriteItems action order reports a Delete key nested 40 levels before a later Put condition syntax error source:54
    • Deep requests - TransactWriteItems action order reports a ConditionCheck key nested 40 levels before a later Update unused value source:54
    • Deep requests - TransactWriteItems action order reports a Put condition syntax error before a later Delete key nested 100 levels source:54
    • Deep requests - TransactWriteItems action order reports a condition syntax error before the same Delete key nested 100 levels source:54
    • Deep requests - TransactWriteItems action order reports an oversized condition before the same Delete key nested 100 levels source:54
    • Deep requests - TransactWriteItems action order reports an oversized UpdateExpression before a later ConditionCheck key nested 100 levels source:54
    • Deep requests - TransactWriteItems action order reports an unused value before a later ConditionCheck key nested 100 levels source:54
    • Deep requests - DeleteItem ReturnValues refuses an unknown ReturnValues in the older wording when the condition value is nested 63 levels source:54
    • Deep requests - DeleteItem ReturnValues refuses an unknown ReturnValues in the older wording when an Expected value is nested 63 levels source:54
    • Deep requests - DeleteItem ReturnValues refuses an unknown ReturnValues in the older wording when the key is nested 100 levels source:54
    • Deep requests - DeleteItem ReturnValues refuses UPDATED_NEW with the bare ReturnValues message ahead of a condition value nested 100 levels source:54
    • 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
    • Query - ConditionalOperator beside Select reports XOR with two QueryFilter conditions before an unknown Select source:95
    • Query - KeyConditionExpression validation ordering an undefined value written before a bad operand is reported first source:29
    • Query - KeyConditionExpression validation ordering a bad operand written before an undefined value is reported first source:29
    • Query - KeyConditionExpression validation ordering a bad operand in the middle clause is reported ahead of a later undefined value source:29
    • Query - KeyConditionExpression validation ordering a bad operand is reported ahead of a third condition source:29
    • Query - KeyConditionExpression validation ordering a bad operand is reported ahead of a missing table source:60
    • Scan - validation ordering rejects a negative Segment source:87
    • TransactWriteItems - validation ordering refuses an unknown ReturnConsumedCapacity and writes nothing source:54
    • TransactWriteItems - validation ordering refuses an unknown ReturnItemCollectionMetrics and writes nothing source:54
    • TransactWriteItems - validation ordering reports both unknown enums in one message, ReturnConsumedCapacity first source:54
    • TransactWriteItems - validation ordering reports an unknown ReturnConsumedCapacity ahead of a missing table source:51
    • TransactWriteItems - validation ordering reports an unknown ReturnConsumedCapacity ahead of a duplicate target source:54
    • TransactWriteItems - validation ordering refuses a ClientRequestToken over 36 characters source:54
    • TransactWriteItems - validation ordering reports a ClientRequestToken over 36 characters ahead of an unknown ReturnConsumedCapacity source:54
    • TransactWriteItems - validation ordering reports a malformed condition on a later action ahead of a missing table on an earlier one source:51
    • TransactWriteItems - validation ordering reports a malformed condition on the first action ahead of a too deep item on the second source:51
    • TransactWriteItems - validation ordering reports a too deep item on the first action ahead of a malformed condition on the second source:51
    • TransactWriteItems - validation ordering reports an unused value ahead of a missing table on an earlier action source:51
    • TransactWriteItems - validation ordering reports an unused value ahead of a missing table on a later action source:51
    • TransactWriteItems - validation ordering reports an unused value ahead of a duplicate target source:54
    • TransactGetItems - validation ordering refuses an unknown ReturnConsumedCapacity source:54
    • TransactGetItems - validation ordering reports an unknown ReturnConsumedCapacity ahead of a missing table source:51
    • TransactGetItems - validation ordering reports an unknown ReturnConsumedCapacity ahead of a duplicate target source:54
    • 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
    • UpdateItem - member errors beside a missing Key joins an empty table name with the missing key source:101
    • UpdateItem - member errors beside a missing Key joins the enums, an empty table name and the missing key in member order source:105
    • UpdateItem - member errors beside a missing Key joins XOR with two Expected conditions to the missing key source:121
    • 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
  • 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:761
    • UpdateItem - return values returns UPDATED_NEW for changed attributes source:785
    • UpdateItem - SET evaluation semantics a second SET clause reads the pre-update value of another attribute source:818
    • UpdateItem - SET evaluation semantics applies parenthesised arithmetic (SET c = (c - :v)) source:839
    • UpdateItem - SET evaluation semantics composes nested functions: list_append(if_not_exists(list, :empty), :more) on a missing list source:887
    • UpdateItem - SET evaluation semantics list_append argument order controls prepend vs append source:914
    • UpdateItem - ReturnValues granularity UPDATED_NEW on a nested SET returns only the changed fragment source:963
    • UpdateItem - ReturnValues granularity REMOVE with UPDATED_NEW omits Attributes (nothing was set to a new value) source:984
    • 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:119
    • 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
  • 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
  • multiAttributeKeys Tier 2 11 diverging
    View these tests in the suite →
    • Query - GSI with a multi-attribute key the HASH attribute alone returns the indexed items in key order, without the item missing a key attribute source:103
    • Query - GSI with a multi-attribute key an equality on the first RANGE attribute narrows to it source:107
    • Query - GSI with a multi-attribute key ScanIndexForward=false reverses the order source:111
    • Query - GSI with a multi-attribute key equalities on the first two RANGE attributes source:115
    • Query - GSI with a multi-attribute key equalities on the first three RANGE attributes source:119
    • Query - GSI with a multi-attribute key begins_with on the fourth RANGE attribute source:127
    • Query - GSI with a multi-attribute key the clauses can be written in any order source:139
    • Query - GSI with a multi-attribute key a page carries the table key and every index key attribute in LastEvaluatedKey source:144
    • Query - GSI with a multi-attribute key a gap in the RANGE attributes is refused source:149
    • Query - GSI with a multi-attribute key a range condition before the last attribute named is refused source:156
    • Query - GSI with a multi-attribute key skipping the first RANGE attribute is refused source:163
  • 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 →

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 69.7% 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 275 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
    • PartiQL - FROM-first UPDATE FROM ... WHERE ... SET updates the item
    • PartiQL - FROM-first UPDATE FROM ... WHERE ... REMOVE removes the attribute
    • PartiQL - FROM-first UPDATE SET and REMOVE can follow each other
    • PartiQL - FROM-first UPDATE RETURNING ALL NEW * returns the updated item
    • PartiQL - FROM-first UPDATE the keywords are case-insensitive
    • PartiQL - FROM-first UPDATE takes parameters
    • PartiQL - FROM-first UPDATE a further condition in the WHERE that holds lets the update through
    • PartiQL - FROM-first UPDATE a further condition in the WHERE that fails stops the update
    • PartiQL - FROM-first UPDATE a key that matches no item fails its condition and creates nothing
    • PartiQL - FROM-first UPDATE ExecuteTransaction runs it
    • PartiQL - FROM-first UPDATE BatchExecuteStatement runs it
    • PartiQL - grammar an exponent literal in WHERE matches the number it denotes
    • PartiQL - grammar an upper-case E, an explicit sign and a shifted mantissa all match the same number
    • PartiQL - grammar an exponent literal in an INSERT stores the number it denotes
    • PartiQL - grammar a number with no leading digit matches in WHERE
    • PartiQL - grammar a negative number with no leading digit matches in WHERE
    • PartiQL - grammar a number with no leading digit in an INSERT stores the number it denotes
    • PartiQL - grammar an exponent that does not fit a 32-bit integer is refused
    • PartiQL - grammar a line comment after the statement is ignored
    • PartiQL - grammar a line comment between FROM and WHERE leaves the WHERE clause in force
    • PartiQL - grammar a line comment before the statement is ignored
    • PartiQL - grammar a block comment between clauses is ignored
    • PartiQL - grammar a block comment after the statement is ignored
    • PartiQL - grammar a hash comment is refused
    • PartiQL - grammar ORDER BY the sort key DESC returns the rows in descending order
    • PartiQL - grammar ORDER BY the sort key ASC returns the rows in ascending order
    • PartiQL - grammar an INSERT with a token left over is refused and writes nothing
    • PartiQL - grammar a SELECT with a table alias is refused rather than read without its WHERE clause
    • PartiQL - grammar a DELETE with a table alias is refused and deletes nothing
    • PartiQL - grammar a DELETE with ORDER BY is refused and deletes nothing
    • 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
    • PartiQL - GSI with a multi-attribute key a SELECT on a GSI with two HASH and two RANGE attributes is refused
    • PartiQL - GSI with a multi-attribute key a SELECT with ORDER BY on that index is refused too
    • PartiQL - GSI with a multi-attribute key a SELECT on a GSI with two HASH attributes and one RANGE is refused
    • PartiQL - GSI with a multi-attribute key the same table's base table, single-attribute GSI and LSI still read
    • PartiQL - GSI with a multi-attribute key base table SELECT, INSERT, UPDATE and DELETE run on a table whose GSI is multi-attribute
    • PartiQL - set_add and set_delete set_add adds members to a string set
    • PartiQL - set_add and set_delete set_add adds members to a number set
    • PartiQL - set_add and set_delete set_add takes the set to add as a parameter
    • PartiQL - set_add and set_delete set_add of a member already in the set changes nothing
    • PartiQL - set_add and set_delete set_add to a missing attribute creates the set
    • PartiQL - set_add and set_delete the function name is case-insensitive
    • PartiQL - set_add and set_delete two SET clauses can each call set_add
    • PartiQL - set_add and set_delete RETURNING ALL NEW * returns the set after the addition
    • PartiQL - set_add and set_delete set_add on a missing item fails its condition and creates nothing
    • PartiQL - set_add and set_delete set_delete removes a member
    • PartiQL - set_add and set_delete set_delete removes a member from a number set
    • PartiQL - set_add and set_delete removing every member removes the attribute
    • PartiQL - set_add and set_delete removing a member that is not there changes nothing
    • PartiQL - set_add and set_delete set_delete on a missing attribute leaves it missing
    • PartiQL - set_add and set_delete ExecuteTransaction runs set_add
    • PartiQL - set_add and set_delete BatchExecuteStatement runs set_add
    • PartiQL - functions and IS in a WHERE clause attribute_exists keeps an item that has the attribute
    • PartiQL - functions and IS in a WHERE clause attribute_exists drops an item without the attribute
    • PartiQL - functions and IS in a WHERE clause attribute_not_exists keeps an item without the attribute
    • PartiQL - functions and IS in a WHERE clause attribute_not_exists drops an item that has the attribute
    • PartiQL - functions and IS in a WHERE clause NOT attribute_exists keeps an item without the attribute
    • PartiQL - functions and IS in a WHERE clause the function name is case-insensitive
    • PartiQL - functions and IS in a WHERE clause works inside OR and parentheses
    • PartiQL - functions and IS in a WHERE clause can be compared with true
    • PartiQL - functions and IS in a WHERE clause takes a quoted attribute name
    • PartiQL - functions and IS in a WHERE clause a nested path that is present is true
    • PartiQL - functions and IS in a WHERE clause a nested path that is absent is false
    • PartiQL - functions and IS in a WHERE clause filters a SELECT with no key condition
    • PartiQL - functions and IS in a WHERE clause size() compares the length of a string
    • PartiQL - functions and IS in a WHERE clause attribute_type() tests the type of an attribute
    • PartiQL - functions and IS in a WHERE clause IS NULL runs as a filter
    • PartiQL - functions and IS in a WHERE clause IS NOT NULL runs as a filter
    • PartiQL - functions and IS in a WHERE clause IS with a type name runs as a filter
    • PartiQL - functions and IS in a WHERE clause an UPDATE whose attribute_exists holds is applied
    • PartiQL - functions and IS in a WHERE clause an UPDATE whose attribute_exists is false fails its condition and changes nothing
    • PartiQL - functions and IS in a WHERE clause an UPDATE guarded by attribute_not_exists sets the attribute once
    • PartiQL - functions and IS in a WHERE clause a DELETE whose attribute_exists is false fails its condition and keeps the item
    • PartiQL - functions and IS in a WHERE clause a DELETE whose attribute_not_exists holds removes the item
    • PartiQL - functions and IS in a WHERE clause an UPDATE of a missing item guarded by attribute_not_exists(pk) fails and creates nothing
    • PartiQL - functions and IS in a WHERE clause an UPDATE in ExecuteTransaction takes attribute_exists as its condition
    • PartiQL - OR branches with a negated sort-key condition a branch with NOT sk = ... beside an equality branch runs
    • PartiQL - OR branches with a negated sort-key condition a branch with sk <> ... beside an equality branch runs
    • PartiQL - OR branches with a negated sort-key condition a branch with NOT begins_with beside an equality branch runs
    • PartiQL - OR branches with a negated sort-key condition a branch with NOT sk IN beside an equality branch runs
    • PartiQL - OR branches with a negated sort-key condition a branch with NOT sk > ... beside an equality branch runs
    • PartiQL - OR branches with a negated sort-key condition a branch with NOT (sk = ...) beside an equality branch runs
    • PartiQL - OR branches with a negated sort-key condition a bare partition branch beside one with a negated sort key runs
    • PartiQL - responses to writes an INSERT returns an empty Items list
    • PartiQL - responses to writes an UPDATE returns an empty Items list
    • PartiQL - responses to writes a DELETE that removes an item returns an empty Items list
    • PartiQL - responses to writes a DELETE that finds no item returns an empty Items list
    • PartiQL - responses to writes a transaction of updates returns an empty Responses list
    • PartiQL - responses to writes a transaction of an INSERT and a DELETE returns an empty Responses list
    • PartiQL - responses to writes a transaction of writes asked for its capacity returns it beside an empty Responses list
  • vectorSearch Tier 2 none of it 40 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
    • PutItem - a vector attribute is billed at four bytes per dimension bills a three-dimension vector at 12 bytes, whatever numbers it holds
    • PutItem - a vector attribute is billed at four bytes per dimension bills a six-dimension vector at 24 bytes, whatever numbers it holds
    • GetItem and the 400KB gate - how a vector is sized charges a read for the vector’s billed size, not the numbers it holds
    • GetItem and the 400KB gate - how a vector is sized holds the item to 400KB with the vector sized by its numbers
    • 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
  • 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
  • account Tier 2 partly 1 not attempted
    View these tests in the suite →
    • Account reads - DescribeLimits, DescribeEndpoints DescribeEndpoints returns at least one endpoint with an address
  • 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

Query's XOR ConditionalOperator beside an unknown Select is now pinned to the older enum wording, Value 'XOR' at 'conditionalOperator' ... [AND, OR]. eu-west-2 and us-east-1 gave the bare [ALL, OR] form when the test was written on 2026-10-09, and the weekly run on 2026-11-01 went red when eu-west-2 had moved. Twenty requests to each region on 2026-11-02 all gave the older wording.

Grade F 44.4% unchanged

Suite on

Releases are now cut every Sunday. When there are notes waiting, the weekly run cuts a release before measuring, so a change merged during the week is on the board by the following Sunday rather than whenever a release is next cut by hand. A week with no notes is measured against the latest release, as before. Either way there is still one run against real DynamoDB a week.

eu-south-2 joins eu-west-2 on the fourteen UpdateItem size, validation-ordering and nesting-depth rows, which leaves me-central-1 the only region on the other side of them. us-east-1 joins it on the five Scan rows, leaving 12 regions on the old wording. Both gave the new answer on all three runs on 2026-10-22, and the 2026-10-24 sweep agreed. That sweep also found five more regions on the new Scan wording and eu-north-1 back on the old one, which no separate run has confirmed, so those regions keep their recorded answers.

The S3 ImportTable test now waits up to ten minutes for the import to finish, and an import still running at that point is recorded as indeterminate rather than as a failure. Real imports have slowed from under two minutes in September to past four, and on 2026-10-25 one ran past the old 270-second ceiling, so DynamoDB itself was scored as failing its own test.

Grade F 44.4% diverged 0.7 percentage points more
Grade F 43.7% diverged 0.1 percentage points less

Suite on

The suite grows from 1,266 tests to 1,678, so every target's figures move. The new tests come from captures against real DynamoDB, most of them taken in October, and mostly cover rejection paths and the order errors are reported in, where a wrong answer used to score as a pass.

  • PartiQL grammar and functions. Number literals with an exponent or no leading digit, comments, ORDER BY DESC, table aliases, unfinished statements and tokens left over after one, functions in WHERE and SET, set_add and set_delete, the FROM-first form of UPDATE, and what each write returns.
  • Numbers. Exponents outside the range, including zero, on attribute values, expression values and every key path, and in PartiQL parameters, along with which error wins when a parameter is both nested too deep and not a valid number.
  • Query key conditions. Operand types for begins_with, the ordering operators and BETWEEN, condition counts, and which problem is reported when a key condition has more than one.
  • Multi-attribute GSI keys. A GSI with one HASH and four RANGE attributes, queried and refused, and PartiQL refusing to read one while the base table and other indexes keep working. These sit in Tier 2, since the feature is new.
  • Batch and transaction validation. The enums, table-name member paths, empty and malformed conditions and unused values that were only tested on single-item operations, ClientRequestToken length, and a validation-ordering file for transactions.
  • Deep requests. Which error wins when a value nested 40, 63 or 100 levels sits beside another problem, and the order TransactWriteItems checks its actions in.
  • The two validation layers. How malformed numbers and duplicate set members are worded on each operation, and which are checked before a transaction runs.
  • Sizes and billing. Exact expression-size messages, an UpdateItem ceiling test per clause kind, and vector billing: a vector attribute is charged 4 bytes per dimension on a write and, since some time between 9 and 22 October, on a read too, while the 400KB limit still counts its numbers.

DynamoDB is still rolling out its newer request validation, so some regions answer these requests differently, and eu-west-2 gave two answers to one of them on the same day. Where that happens a test accepts the two answers seen and names the regions on each side. Those tests are listed on #243 to be pinned once the regions settle.

Twenty existing tests were tightened along the way: nineteen in the batch and transaction work, mostly exact strings where a phrase or pattern was checked, and the 1E-130 precision test, which now compares the stored value rather than accepting anything that came back (#276). The UpdateItem size notes also stop counting the regions that size an update like any other write, a count that had gone stale, and point at their registry rows instead (#244).

The board, each target's page and the results table now say when a target's letter would not hold in every region. Scored against a region that answers some tests differently, a target can earn a lower letter than the one its row publishes, and the row now names those regions and that letter, for example "B against eu-south-2 and me-central-1, where real DynamoDB answers some tests differently". The grading criteria do not change and no letter moves, so the grading version stays at 1. A note can come and go between runs as regions converge and diverge, with no change in the target (#271).

A BatchExecuteStatement test described ReturnValuesOnConditionCheckFailure as inert on a batch member, the opposite of what DynamoDB does, and its only check could not tell a target that ignores the option from one that honours it. DynamoDB returns the existing item with ALL_OLD, on the failed member's Error, and none with NONE or the option absent. The three tests now check that item exactly, so a target that ignores the option, or returns the item whatever the setting, now fails one or more of them. The TransactWriteItems test beside them checks the item on the cancellation reason exactly too, where it checked only that one was there. The batch tests keep their names, which still hold for the member itself, because a rename needs every committed results file re-run.

Fifteen regions move to the new wording on the five Scan rows. af-south-1, ap-east-1, ap-northeast-3, ap-south-1, ap-southeast-1 to ap-southeast-5, ca-west-1, eu-north-1, eu-west-3, il-central-1, mx-central-1 and sa-east-1 joined eu-west-2 by the 2026-10-17 sweep, which leaves 13 regions on the old wording, and an engine that gives it is now credited in those 13 alone. Three runs against all 33 regions on 2026-10-22 agreed with the sweep on every move; where they disagreed, a region keeps its recorded answer. That holds back us-east-1, which gave the new Scan wording on all three runs, and us-east-2 and eu-south-2, which gave the pinned answer on the other fourteen rows. me-central-1 gave both answers to BatchGetItem's empty RequestItems across the runs and keeps the one its row records.

Grade F 43.9% diverged 0.9 percentage points less
Grade F 44.8% diverged 0.1 percentage points more
Grade F 44.7% diverged 0.2 percentage points less

Suite on

3.6.0 was cut but never published. eu-west-2 changed how it validates TransactWriteItems while the 3.6.0 measurement was running, so five tests failed against DynamoDB itself and no board was produced. This release carries the fix, and the changes listed under 3.6.0 are first measured here.

eu-north-1 and ap-northeast-2 made the change first, and eu-west-2 followed on 2026-10-08, between two runs on main 30 minutes apart. The three now check a transaction's request before running it. An empty TransactItems gets the validation framework's generic constraint message. A 32-level value in the request is refused with a top-level ValidationException, where the transaction used to cancel on it or go on to evaluate the condition. A transacted Update that UpdateItem's statement-sized rule refuses is refused the same way, where it used to be stored. The other 30 regions still answer as before.

The five tests accept either answer, exactly, until the regions settle. No engine loses a test over it, and on the 3.5.0 board's results the engines that already refuse a 32-level value up front pass tests they used to fail: three for LocalStack, and one each for DynamoDB Local, ExtendDB and ExtendDB (SQLite). The tests keep their names, which describe what the 30 regions do, until one answer is pinned, because a rename needs every committed results file re-run.

The board and the results table now sort by grade, best first, and rows sharing a grade by the effective figure the letter is read from. They used to sort on divergence alone, and coverage lowers a letter without moving a row, so a target diverging slightly less over much less of the suite could sit above a better-graded one. No grade or figure changes.

Grade F 44.9% unchanged

Suite on

Five Scan error messages are now regional splits. The validation-framework rollout reached Scan's parameter checks in September, and eu-west-2, eu-central-1, us-west-1 and ap-northeast-2 now word the errors for Segment >= TotalSegments, a Limit of 0, a negative Segment, a mismatched ExclusiveStartKey and SPECIFIC_ATTRIBUTES without a projection differently from the other 29 regions. Four passes across all 33 regions agreed. The assertions follow eu-west-2, the pinned region, onto the new wording, and an engine giving the old wording is credited in the regions that still use it. The negative Segment message had no exact-wording test, so it gains one, taking the suite to 1252 tests.

The negative Segment ordering test now accepts either wording, since it only checks which validation fires. The capture harness gains the matching Scan probes and a --table-prefix option for taking them locally.

The nesting-depth row moves af-south-1, ap-southeast-3, ap-southeast-4, ap-southeast-5 and il-central-1 to the strict side, leaving 22 regions strict and 11 lax. ap-northeast-1 answers both ways and stays lax for now.

UpdateItem's item size is now a regional split, across eleven tests. Twenty-two regions, eu-west-2 among them, size an update by what the statement writes, as the suite already pinned, while ten cap the finished item at 409,600 like any other write. Engines that apply the plain cap are credited in those ten.

Fourteen cases from @exoego for the 4096-byte expression cap and the 32-level nesting cap on the batch and transact write surfaces, captured against eu-west-2 and us-east-1.

  • Expression size in a transaction. A TransactWriteItems member's ConditionExpression or UpdateExpression over 4096 bytes is a top-level ValidationException, not a cancellation, for all four member types and even when an earlier member is fine.
  • Nesting depth on batch and transact writes. A Put item nested beyond the 32-level cap is refused up front by BatchWriteItem and TransactWriteItems. UpdateItem checks the depth of an ExpressionAttributeValues entry in most regions, but TransactWriteItems does not check it for any action in any region. An Update that writes a too deep value into the item still cancels with a ValidationError reason on the stored-item cap.
Grade F 44.9% diverged 0.4 percentage points less

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