influxdata/influxdb · error · QueryError

unexpected query error

Error message

unexpected query error: {0}

What it means

`iox_v1_query_api::QueryError` is a newtype over `anyhow::Error` used as a catch-all for any failure during the v1 query streaming process. Because anything failing mid-stream must result in a 500 INTERNAL ERROR, the library wraps arbitrary errors into this type and renders them as `unexpected query error: {0}`.

Solutions

  1. Inspect the chained `source()` of the inner `anyhow::Error` (print with `{:?}`) to find the root cause.
  2. Check server logs for the full error chain; the 500 response body intentionally hides details.
  3. Fix the underlying query/data issue that caused the internal failure (bad query, missing data, storage error).

Example fix

// before
let result = run_query(ctx, q)?; // surfaces as unexpected query error
// after
let result = run_query(ctx, q).map_err(|e| { tracing::error!(error = ?e, "query failed"); QueryError(e) })?;
Defensive patterns

Strategy: try-catch

Type guard

fn is_query_error(e: &dyn std::error::Error) -> bool {
    e.downcast_ref::<iox_v1_query_api::QueryError>().is_some()
}

Try / catch

match api.query(sql).await {
    Ok(rows) => use(rows),
    Err(e) if is_query_error(e.as_ref()) => {
        let chain: Vec<_> = e.chain().map(|c| c.to_string()).collect();
        log::error!("query 500 chain: {chain:?}");
    }
    Err(e) => return Err(e.into()),
}

Prevention

When it happens

Trigger: Any `?`-propagated `anyhow::Error` inside the v1 query API handlers — e.g. failures while executing the query plan, streaming result rows, or converting data — converted automatically via the `#[from] anyhow::Error` impl.

Common situations: A malformed InfluxQL query slips past earlier validation, storage/reader errors occur mid-response, or an internal dependency returns an error that the API layer deliberately does not classify (all become 500s).

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


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

Appendix: source

Thrown at core/iox_v1_query_api/src/error.rs:13

use std::fmt::Debug;

use datafusion::error::DataFusionError;
use iox_query_influxql_rewrite as rewrite;
use thiserror::Error;

/// Error type for the v1 API
///
/// This is used to catch errors that occur during the streaming process.
/// [`anyhow::Error`] is used as a catch-all because if anything fails during
/// that process it will result in a 500 INTERNAL ERROR.
#[derive(Debug, thiserror::Error)]
#[error("unexpected query error: {0}")]
pub struct QueryError(#[from] pub anyhow::Error);

#[derive(Debug, Error)]
pub enum Error {
    /// The requested path has no registered handler.
    #[error("not found: {0}")]
    NoHandler(String),

    #[error("authorization failure: {0}")]
    AuthorizationFailure(String),

    #[error("invalid mime type ({0})")]
    InvalidMimeType(String),

    /// Missing parameters for query
    #[error("missing query parameters 'db' and 'q'")]
    MissingQueryParams,

View on GitHub (pinned to 06200ef96b)