influxdata/influxdb · error · IdParseError

failed to parse as integer

Error message

failed to parse as integer: {0}

What it means

`IdParseError` in influxdb3_id is the newer parse error used by generated catalog identifier types (via the `catalog_identifier_type!` macro). It wraps `ParseIntError` and renders as "failed to parse as integer: {0}" when a string cannot be converted to the identifier's integer backing type.

Solutions

  1. Supply a valid numeric ID within the backing type's range
  2. Look up the numeric ID via the catalog/API instead of guessing from names
  3. Strip whitespace or encoding from the string before parsing

Example fix

// before
let table_id: TableId = "weather".parse()?;
// after
let table_id: TableId = "17".parse()?;
Defensive patterns

Strategy: type-guard

Type guard

// rust
fn try_table_id(s: &str) -> Option<TableId> {
    s.trim().parse::<TableId>().ok()
}

Try / catch

// rust
let id = try_table_id(raw).ok_or_else(|| anyhow!("expected numeric table id, got {raw}"))?;

Prevention

When it happens

Trigger: Parsing a catalog object ID (table, database, column IDs) from string input — path segments, query parameters, or serialized catalog — that is non-numeric, empty, or out of range for the backing integer type.

Common situations: Hand-editing serialized catalog data; passing names instead of numeric IDs; copying an ID from a different deployment with a different format.

Understand the failure class

Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.

Related errors


AI-assisted analysis of influxdata/influxdb@06200ef96b (2026-09-19). Data as JSON: /api/errors/5156bb121fb1c273. Report an issue: GitHub.

Appendix: source

Thrown at influxdb3_id/src/lib.rs:31

mod serialize;
pub use serialize::{SerdeVecMap, SerdeVecSet};

#[derive(Debug, thiserror::Error)]
#[error("unable to parse as integer: {0}")]
pub struct IdParsingError(#[from] ParseIntError);

pub trait CatalogId: Default + Hash + Eq + Copy + Ord + Serialize + Display {
    type Integer;

    const MAX: Self;

    fn next(&self) -> Self;

    fn checked_next(&self) -> Option<Self>;
}

#[derive(Debug, thiserror::Error)]
#[error("failed to parse as integer: {0}")]
pub struct IdParseError(#[from] ParseIntError);

macro_rules! catalog_identifier_type {
    ($name:ident, $ty:ty) => {
        #[derive(
            Debug, Copy, Clone, Eq, PartialOrd, Ord, PartialEq, Serialize, Deserialize, Hash,
        )]
        pub struct $name($ty);

        impl CatalogId for $name {
            type Integer = $ty;

            const MAX: Self = Self(<$ty>::MAX);

            fn next(&self) -> Self {
                Self::new(self.0.checked_add(1).expect("incrementing id overflow"))
            }

View on GitHub (pinned to 06200ef96b)