dbt-labs/dbt-core · error

Table.rename: slugging columns or rows is not implemented…

Error message

Table.rename: slugging columns or rows is not implemented yet

What it means

Table.rename accepts slug_columns/slug_rows flags (agate's slugification of column or row names), but this Rust port has not implemented slugification yet and refuses the call with an InvalidOperation error rather than silently ignoring the flags.

Solutions

  1. Set both slug_columns and slug_rows to false.
  2. Pre-slugify names yourself (lowercase, replace non-alphanumerics with underscores) and pass them via the map form of column_names.
  3. Track library updates; this is explicitly an unimplemented feature, not a usage error.

Example fix

// before
table.rename(Some(names), None, true, false)?
// after
let slugged: Vec<_> = names.iter().map(|n| slugify(n)).collect();
table.rename(Some(slugged), None, false, false)?
Defensive patterns

Strategy: validation

Validate before calling

if slug_columns || slug_rows {
    return Err("slugging not supported; pre-slugify names instead");
}

Try / catch

match result {
    Err(e) if e.to_string().contains("slugging columns or rows is not implemented") => {
        eprintln!("{e}; pre-slugify and pass explicit names");
        table.rename(Some(pre_slugged(names)), None, false, false)?
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling rename with slug_columns=true or slug_rows=true, regardless of the other arguments.

Common situations: Porting Python agate code that relied on slug_columns/slug_rows for snake_case column names; enabling the flags 'just in case' when porting an agate-based workflow to dbt's Rust agate implementation.

Related errors


AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07). Data as JSON: /api/errors/aa58b8eba300f17b. Report an issue: GitHub.

Appendix: source

Thrown at crates/dbt-agate/src/table.rs:822

                    ),
                ));
            }
        }
        if let Some(ref rows) = renamed_rows {
            if rows.len() != self.num_rows() {
                return Err(Error::new(
                    ErrorKind::InvalidArgument,
                    format!(
                        "Table.rename: renamed_rows length ({}) does not match number of rows ({})",
                        rows.len(),
                        self.num_rows()
                    ),
                ));
            }
        }

        if slug_columns || slug_rows {
            return Err(Error::new(
                ErrorKind::InvalidOperation,
                "Table.rename: slugging columns or rows is not implemented yet",
            ));
        }

        let repr = if let Some(renamed_columns) = renamed_columns {
            self.repr.with_renamed_columns(renamed_columns)
        } else {
            Arc::clone(&self.repr)
        };
        let repr = if let Some(renamed_rows) = renamed_rows {
            repr.with_renamed_rows(renamed_rows)
        } else {
            repr
        };

        Ok(AgateTable::from_repr(repr))
    }

View on GitHub (pinned to 0267ce9170)