influxdata/influxdb · error · Error::MultiDatabase

can only perform queries on a single database

Error message

can only perform queries on a single database

What it means

Error::MultiDatabase from iox_query_influxql_rewrite: raised when parsed statements reference more than one database. IOx InfluxQL rewriting only supports queries scoped to a single database per request.

Solutions

  1. Split the request into one request per database
  2. Remove explicit database qualifiers so all statements use the request's single database
  3. Validate target databases of all statements before submission

Example fix

// before
parse_statements("SELECT * FROM db1.m; SELECT * FROM db2.m")?;
// after
parse_statements("SELECT * FROM db1.m")?;
parse_statements("SELECT * FROM db2.m")?;
Defensive patterns

Strategy: validation

Validate before calling

let dbs: HashSet<_> = extract_databases(query); if dbs.len() > 1 { /* split request */ }

Try / catch

match parse_statements(input) {
    Err(Error::MultiDatabase) => split_and_run_per_database(input),
    other => other?,
}

Prevention

When it happens

Trigger: Submitting multiple InfluxQL statements (or one statement) that target different databases via per-measurement database qualifiers, through parse_statements/parse_internal's rewrite pass.

Common situations: Batching queries copied from different dashboards into one request; queries mixing explicit database qualifiers across measurements; migration scripts concatenating statements for several databases.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at core/iox_query_influxql_rewrite/src/lib.rs:200

                if db_rp_set.insert((db, rp)) && db_rp_set.len() > 1 {
                    Err(Error::MultiDatabase)
                } else {
                    Ok(ms)
                }
            })
            .collect::<Result<Vec<MeasurementSelection>, Error>>()?;
        select_statement.from.replace(from_clause);
        let mut result = Self::new(select_statement);
        if let Some((db, rp)) = db_rp_set.into_iter().next() {
            result = result.with_database(db).with_retention_policy(rp);
        }
        Ok(result)
    }
}

#[derive(Debug, thiserror::Error, Clone, PartialEq, Eq)]
pub enum Error {
    #[error("can only perform queries on a single database")]
    MultiDatabase,
    #[error("parsing error: {0}")]
    Parse(ParseError),
}

pub fn parse_statements(input: &str) -> Result<Vec<Rewritten<Statement>>, Error> {
    parse_internal(input)
        .map_err(Error::Parse)?
        .into_iter()
        .map(Rewritten::<Statement>::try_from)
        .collect::<Result<Vec<Rewritten<Statement>>, Error>>()
}

#[cfg(test)]
mod tests {
    use influxdb_influxql_parser::statement::Statement;

    use crate::{Error, Rewritten, parse_statements};

View on GitHub (pinned to 06200ef96b)