risingwavelabs/risingwave · error

{} must contain 1 argument

Error message

{} must contain 1 argument

What it means

`resolve_single_name` in the frontend binder expects a list of SQL identifiers to contain exactly one name (e.g. a database name or schema name given as a single identifier). If more than one identifier is supplied where a single name is required, it bails with "{desc} must contain 1 argument".

Source

Thrown at src/frontend/src/binder/relation/mod.rs:369

        if identifiers.len() > 3 {
            return Err(ResolveQualifiedNameError::new(
                formatted_name,
                ResolveQualifiedNameErrorKind::QualifiedNameTooLong,
            ));
        }

        let name = identifiers.pop().unwrap().real_value();
        let schema_name = identifiers.pop().map(|ident| ident.real_value());
        let database_name = identifiers.pop().map(|ident| ident.real_value());

        Ok((database_name, schema_name, name))
    }

    /// return first name in identifiers, must have only one name.
    fn resolve_single_name(mut identifiers: Vec<Ident>, ident_desc: &str) -> Result<String> {
        if identifiers.len() > 1 {
            bail!("{} must contain 1 argument", ident_desc);
        }
        let name = identifiers.pop().unwrap().real_value();

        Ok(name)
    }

    /// return the `database_name`
    pub fn resolve_database_name(name: ObjectName) -> Result<String> {
        Self::resolve_single_name(name.0, "database name")
    }

    /// return the `schema_name`
    pub fn resolve_schema_name(name: ObjectName) -> Result<String> {
        Self::resolve_single_name(name.0, "schema name")
    }

    /// return the `index_name`
    pub fn resolve_index_name(name: ObjectName) -> Result<String> {

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Provide exactly one unqualified identifier for the name, e.g. `USE mydb` instead of `USE a.b`.
  2. Set the database and schema separately (via connection parameters or separate SET commands) instead of one qualified name.
  3. If you control the SQL generation, stop emitting multi-part names in single-name positions.

Example fix

// before
SET SCHEMA my_schema.extra;
// after
SET SCHEMA my_schema;
Defensive patterns

Strategy: validation

Validate before calling

if (name.includes('.')) {
  throw new Error("supply a single unqualified identifier for this statement");
}

Type guard

function isSingleIdent(parts) { return Array.isArray(parts) && parts.length === 1; }

Try / catch

try {
  await client.query(`SET SCHEMA ${schema}`);
} catch (e) {
  if (String(e.message).includes("must contain 1 argument")) {
    // split qualified name and set database/schema separately
  } else throw e;
}

Prevention

When it happens

Trigger: Statements that resolve a database/schema/catalog name from identifiers, e.g. `USE db1.db2` style multi-part names, or `SET SCHEMA a.b` where a single identifier is expected but a qualified multi-part identifier was parsed.

Common situations: Users porting Postgres/MySQL syntax that allows qualified names where RisingWave expects a simple name; accidentally quoting or qualifying a schema/database name; auto-generated SQL emitting dotted names.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/0050a2c8362304eb. Report an issue: GitHub.