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
- Provide exactly one unqualified identifier for the name, e.g. `USE mydb` instead of `USE a.b`.
- Set the database and schema separately (via connection parameters or separate SET commands) instead of one qualified name.
- 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
- Never emit qualified (dotted) names where a single identifier is expected
- Set database via connection parameters and schema via SET SCHEMA separately
- Quote identifiers to avoid accidental splitting
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
- Bind error: {0}
- Invalid order key column `{column}` HINT: Only plain column
- relative_error={} does not satisfy 0.0 < relative_error < 1.
- {object_type} not found: {name}
- Not supported: {0}\nHINT: {1}
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/0050a2c8362304eb.
Report an issue: GitHub.