t8y2/dbx · error

required table field

Error message

required table field

What it means

Panic from `Option::expect` on the result of take_dynamodb_string_field("table", true). The helper is asked to require the table field (required=true) but still returns Option, so the code asserts it with expect. A panic here means the field lookup logic failed to enforce its own required flag — an internal bug, since a genuinely missing table should already have produced an Err from take_dynamodb_string_field.

Source

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

    let mut current_name: Option<String> = None;
    let mut current_value = String::new();
    for line in lines {
        if let Some((name, value)) = dynamodb_statement_field(line) {
            finish_dynamodb_statement_field(&mut fields, current_name.take(), &mut current_value)?;
            current_name = Some(name.to_string());
            current_value.push_str(value.trim_start());
        } else if current_name.is_some() {
            if !current_value.is_empty() {
                current_value.push('\n');
            }
            current_value.push_str(line);
        } else if !line.trim().is_empty() {
            return Err(format!("Invalid DynamoDB statement line: {line}"));
        }
    }
    finish_dynamodb_statement_field(&mut fields, current_name.take(), &mut current_value)?;

    let table = take_dynamodb_string_field(&mut fields, "table", true)?.expect("required table field");
    let limit = take_dynamodb_integer_field(&mut fields, "limit")?;
    if limit.is_some_and(|value| value <= 0) {
        return Err("DynamoDB statement limit must be greater than zero".to_string());
    }
    let filter = take_dynamodb_object_field(&mut fields, "filter")?;
    let sort = take_dynamodb_object_field(&mut fields, "sort")?;
    let cursor = take_dynamodb_string_field(&mut fields, "cursor", false)?;
    let key = take_dynamodb_object_field(&mut fields, "key")?;
    let item = take_dynamodb_object_field(&mut fields, "item")?;
    if !fields.is_empty() {
        return Err(format!("Unsupported DynamoDB statement field: {}", fields.keys().next().unwrap()));
    }

    match operation {
        DynamoDbStatementOperation::Read => {
            if key.is_some() || item.is_some() {
                return Err("DynamoDB read statements do not accept key or item fields".to_string());
            }

View on GitHub (pinned to c0390bff16)

Solutions

  1. Change take_dynamodb_string_field so required=true returns Result<String, String> directly and drop the expect
  2. Fix the helper to return Err("missing required field: table") when required and absent
  3. Add tests for statements missing the table field to confirm a clean parse error
  4. Audit all call sites of take_dynamodb_*_field(..., true) for the same expect pattern

Example fix

// before
let table = take_dynamodb_string_field(&mut fields, "table", true)?.expect("required table field");
// after
let table = take_dynamodb_string_field(&mut fields, "table", true)?
    .ok_or_else(|| "DynamoDB statement requires a table field".to_string())?;
Defensive patterns

Strategy: validation

Validate before calling

let has_table = statement_text.lines()
    .any(|l| l.trim_start().to_lowercase().starts_with("table"));
if !has_table {
    return Err("DynamoDB statement text must include a 'table' field".into());
}

Try / catch

match parse_dynamodb_statement(text) {
    Ok(stmt) => stmt,
    Err(e) => return Err(format!("invalid statement: {e}")),
}

Prevention

When it happens

Trigger: Parsing a DynamoDB statement text without a `table` field where take_dynamodb_string_field somehow returns Ok(None) despite required=true — i.e. a bug in the field-taking helper's required handling rather than normal parser input.

Common situations: Changes to take_dynamodb_string_field altering its required-field semantics; regression where required=true no longer maps to an Err; fuzzer-generated inputs exploring the parser.

Understand the failure class

Background: "Missing required field" and "field is required" errors: why libraries reject payloads that omit mandatory fields — this error's family across 20 libraries.

Related errors


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