influxdata/influxdb · error · TimestampMinMaxError

Could not find time column statistics

Error message

Could not find time column statistics

What it means

Thrown by TimestampMinMaxError when scanning a Parquet row group's metadata for statistics on the time column and none are found. The library requires per-row-group min/max statistics for the time column to build TimestampMinMax ranges used for query pruning. This indicates the Parquet file was written without statistics for the time column.

Solutions

  1. Ensure the writer that produced the Parquet file has column statistics enabled (do not disable statistics when writing)
  2. Verify the file contains statistics for the time column using parquet-tools or the parquet crate metadata inspection
  3. Re-write the offending Parquet file with a writer that emits statistics
  4. If consuming externally-produced files, treat missing statistics as unsupported input and reject before query planning

Example fix

// before: parquet writer options disabling stats
let props = WriterProperties::builder().set_statistics_enabled(Enabled(false)).build();
// after: keep statistics enabled so timestamp_min_max can find them
let props = WriterProperties::builder().set_statistics_enabled(Enabled(true)).build();
Defensive patterns

Strategy: validation

Validate before calling

let meta = footer_metadata(&file)?;
let has_stats = meta.row_groups().iter().all(|rg|
    rg.column(0).statistics().is_some());
if !has_stats { return Err("time column statistics missing".into()); }

Try / catch

match res {
    Err(TimestampMinMaxError::NoColumnStatisticsFound) => warn!("file lacks column stats; skipping pruning"),
    other => other?,
}

Prevention

When it happens

Trigger: Calling timestamp_min_max() on a ParquetRowGroupMetaData whose column chunk metadata has no statistics entry for the time column (statistics None or missing for that column).

Common situations: Reading Parquet files produced by writers that disabled statistics (set_statistics_disabled / write_statistics disabled), files written by third-party tools without column stats, or truncated/corrupted metadata.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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

Appendix: source

Thrown at core/parquet_file/src/metadata.rs:1017

        .collect::<Result<Vec<_>, _>>()?;
    let file_timestamp_min_max = timestamp_min_maxes
        .into_iter()
        .reduce(|acc, i| acc.union(&i));

    Ok(file_timestamp_min_max)
}

/// Errors that may happen while collecting the min and max timestamps
#[expect(missing_docs)]
#[derive(Debug, Error)]
pub enum TimestampMinMaxError {
    #[error("Could not convert Parquet schema to Arrow schema: {0}")]
    SchemaConversion(#[from] parquet::errors::ParquetError),

    #[error("Could not find a time column")]
    NoTimeColumnFound,

    #[error("Could not find time column statistics")]
    NoColumnStatisticsFound,

    #[error("Expected time column to have type Int64; instead found {actual:?}")]
    IncorrectTimeColumnType { actual: parquet::basic::Type },
}

fn timestamp_min_max(
    row_group: &ParquetRowGroupMetaData,
) -> Result<TimestampMinMax, TimestampMinMaxError> {
    let statistics = row_group
        .columns()
        .iter()
        .find(|c| c.column_descr().name() == schema::TIME_COLUMN_NAME)
        .ok_or(TimestampMinMaxError::NoTimeColumnFound)?
        .statistics()
        .ok_or(TimestampMinMaxError::NoColumnStatisticsFound)?;

    match statistics {

View on GitHub (pinned to 06200ef96b)