t8y2/dbx · error

validated DynamoDB insert item

Error message

validated DynamoDB insert item

What it means

Panic from `Option::expect` on `statement.item` while serializing the item for a DynamoDB Insert. The parser is expected to have required an item for inserts; a None here means an unvalidated statement reached execution and the process aborts. Like its key counterpart, it indicates a broken internal contract rather than a DynamoDB-side error.

Source

Thrown at crates/dbx-core/src/db/dynamodb_driver.rs:374

            let filter =
                statement.filter.as_ref().map(serde_json::to_string).transpose().map_err(|error| error.to_string())?;
            let sort =
                statement.sort.as_ref().map(serde_json::to_string).transpose().map_err(|error| error.to_string())?;
            let result = find_items(
                client,
                &statement.table,
                effective_limit,
                filter.as_deref(),
                sort.as_deref(),
                statement.cursor.as_deref(),
            )
            .await?;
            Ok(document_query_result(result, started))
        }
        DynamoDbStatementOperation::Insert => {
            let key = serde_json::to_string(statement.key.as_ref().expect("validated DynamoDB insert key"))
                .map_err(|error| error.to_string())?;
            let item = serde_json::to_string(statement.item.as_ref().expect("validated DynamoDB insert item"))
                .map_err(|error| error.to_string())?;
            insert_item_with_expected_identity(client, &statement.table, &item, Some(&key)).await?;
            Ok(affected_query_result(1, started))
        }
        DynamoDbStatementOperation::Put => {
            let key = serde_json::to_string(statement.key.as_ref().expect("validated DynamoDB put key"))
                .map_err(|error| error.to_string())?;
            let item = serde_json::to_string(statement.item.as_ref().expect("validated DynamoDB put item"))
                .map_err(|error| error.to_string())?;
            let affected = update_item(client, &statement.table, &key, &item).await?;
            Ok(affected_query_result(affected, started))
        }
        DynamoDbStatementOperation::Delete => {
            let key = serde_json::to_string(statement.key.as_ref().expect("validated DynamoDB delete key"))
                .map_err(|error| error.to_string())?;
            let affected = delete_item(client, &statement.table, &key).await?;
            Ok(affected_query_result(affected, started))
        }

View on GitHub (pinned to c0390bff16)

Solutions

  1. Route all insert statements through parse_dynamodb_statement so item presence is validated before execution
  2. Guard with statement.item.is_some() before calling execute_statement for Insert
  3. Swap expect for ok_or_else to return a descriptive error string instead of panicking
  4. Add a test asserting a keyless/itemless Insert yields a clean validation error

Example fix

// before
let item = serde_json::to_string(statement.item.as_ref().expect("validated DynamoDB insert item"))
    .map_err(|error| error.to_string())?;
// after
let item_src = statement.item.as_ref()
    .ok_or_else(|| "DynamoDB insert statement requires an item".to_string())?;
let item = serde_json::to_string(item_src).map_err(|error| error.to_string())?;
Defensive patterns

Strategy: validation

Validate before calling

if stmt.operation == DynamoDbStatementOperation::Insert && stmt.item.is_none() {
    return Err("DynamoDB insert statement requires an item".into());
}

Type guard

fn has_dynamodb_item(stmt: &Statement) -> bool {
    stmt.item.is_some()
}

Try / catch

let result = driver.execute_statement(stmt).await?; // Err path handles parse/exec errors; validate item first to avoid panics

Prevention

When it happens

Trigger: Executing a DynamoDbStatementOperation::Insert where `item` is None — typically a programmatically built Statement or one deserialized from untrusted input that skipped parse_dynamodb_statement validation.

Common situations: Hand-assembling statements in tests/tools; passing API-supplied statement JSON straight through to the driver; refactoring the item validation out of the insert path.

Related errors


AI-assisted analysis of t8y2/dbx@c0390bff16 (2026-09-05). Data as JSON: /api/errors/2d4cddf6f634da9e. Report an issue: GitHub.