{"record":{"id":"2d4cddf6f634da9e","repo":"t8y2/dbx","slug":"validated-dynamodb-insert-item","errorCode":null,"errorMessage":"validated DynamoDB insert item","messagePattern":"validated DynamoDB insert item","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/dbx-core/src/db/dynamodb_driver.rs","lineNumber":374,"sourceCode":"            let filter =\n                statement.filter.as_ref().map(serde_json::to_string).transpose().map_err(|error| error.to_string())?;\n            let sort =\n                statement.sort.as_ref().map(serde_json::to_string).transpose().map_err(|error| error.to_string())?;\n            let result = find_items(\n                client,\n                &statement.table,\n                effective_limit,\n                filter.as_deref(),\n                sort.as_deref(),\n                statement.cursor.as_deref(),\n            )\n            .await?;\n            Ok(document_query_result(result, started))\n        }\n        DynamoDbStatementOperation::Insert => {\n            let key = serde_json::to_string(statement.key.as_ref().expect(\"validated DynamoDB insert key\"))\n                .map_err(|error| error.to_string())?;\n            let item = serde_json::to_string(statement.item.as_ref().expect(\"validated DynamoDB insert item\"))\n                .map_err(|error| error.to_string())?;\n            insert_item_with_expected_identity(client, &statement.table, &item, Some(&key)).await?;\n            Ok(affected_query_result(1, started))\n        }\n        DynamoDbStatementOperation::Put => {\n            let key = serde_json::to_string(statement.key.as_ref().expect(\"validated DynamoDB put key\"))\n                .map_err(|error| error.to_string())?;\n            let item = serde_json::to_string(statement.item.as_ref().expect(\"validated DynamoDB put item\"))\n                .map_err(|error| error.to_string())?;\n            let affected = update_item(client, &statement.table, &key, &item).await?;\n            Ok(affected_query_result(affected, started))\n        }\n        DynamoDbStatementOperation::Delete => {\n            let key = serde_json::to_string(statement.key.as_ref().expect(\"validated DynamoDB delete key\"))\n                .map_err(|error| error.to_string())?;\n            let affected = delete_item(client, &statement.table, &key).await?;\n            Ok(affected_query_result(affected, started))\n        }","sourceCodeStart":356,"sourceCodeEnd":392,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/crates/dbx-core/src/db/dynamodb_driver.rs#L356-L392","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Route all insert statements through parse_dynamodb_statement so item presence is validated before execution","Guard with statement.item.is_some() before calling execute_statement for Insert","Swap expect for ok_or_else to return a descriptive error string instead of panicking","Add a test asserting a keyless/itemless Insert yields a clean validation error"],"exampleFix":"// before\nlet item = serde_json::to_string(statement.item.as_ref().expect(\"validated DynamoDB insert item\"))\n    .map_err(|error| error.to_string())?;\n// after\nlet item_src = statement.item.as_ref()\n    .ok_or_else(|| \"DynamoDB insert statement requires an item\".to_string())?;\nlet item = serde_json::to_string(item_src).map_err(|error| error.to_string())?;","handlingStrategy":"validation","validationCode":"if stmt.operation == DynamoDbStatementOperation::Insert && stmt.item.is_none() {\n    return Err(\"DynamoDB insert statement requires an item\".into());\n}","typeGuard":"fn has_dynamodb_item(stmt: &Statement) -> bool {\n    stmt.item.is_some()\n}","tryCatchPattern":"let result = driver.execute_statement(stmt).await?; // Err path handles parse/exec errors; validate item first to avoid panics","preventionTips":["Parse statements from text/JSON through parse_dynamodb_statement","Never forward unvalidated external statement objects to the driver","Add fixture tests covering insert statements with and without items"],"tags":["rust","dynamodb","panic","invariant-violation"],"backgroundTag":"internal-invariant-panic","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}