dbt-labs/dbt-core · error · minijinja::Error::SerdeDeserializeError

adapter.add_time_ingestion_partition_column failed on partit

Error message

adapter.add_time_ingestion_partition_column failed on partition_by {partition_by:?}: {e}

What it means

add_time_ingestion_partition_column() (a BigQuery-specific adapter macro) deserializes its `partition_by` argument into a PartitionConfig struct before building the time-ingestion partition column. If the value cannot be converted — e.g. it is not a dict with a recognized `granularity`/`type` combination, or field types are wrong — this SerdeDeserializeError is raised echoing the offending value and serde detail. The message deliberately includes the partition_by value to aid debugging.

Source

Thrown at crates/dbt-adapter/src/adapter/mod.rs:2243

        _state: &State,
        args: &[Value],
    ) -> Result<Value, minijinja::Error> {
        match &self.inner {
            Typed { adapter, .. } => {
                let iter = ArgsIter::new(
                    "add_time_ingestion_partition_column",
                    &["partition_by", "columns"],
                    args,
                );
                let partition_by = iter.next_arg::<&Value>()?;
                let columns = iter.next_arg::<&Value>()?;
                iter.finish()?;

                // Match original behavior: try to deserialize directly, let deserialization handle errors
                let partition_by =
                    minijinja_value_to_typed_struct::<PartitionConfig>(partition_by.clone())
                        .map_err(|e| {
                            minijinja::Error::new(
                                minijinja::ErrorKind::SerdeDeserializeError,
                                format!(
                                    "adapter.add_time_ingestion_partition_column failed on partition_by {partition_by:?}: {e}"
                                ),
                            )
                        })?;

                let partition_config = partition_by.into_bigquery().ok_or_else(|| {
                    minijinja::Error::new(
                        minijinja::ErrorKind::InvalidArgument,
                        "Expect a BigqueryPartitionConfigStruct",
                    )
                })?;

                let result = adapter
                    .add_time_ingestion_partition_column(columns.clone(), partition_config)?;
                Ok(result)
            }

View on GitHub (pinned to 0267ce9170)

Solutions

  1. Read the serde detail and the echoed partition_by value to see what shape was actually received.
  2. Pass the result of adapter.parse_partition_by(raw_partition_by) as partition_by rather than a raw string or hand-built dict.
  3. Fix the partition_by config in the model so it deserializes into PartitionConfig (valid type/granularity fields with correct types).
  4. Ensure the value is a dict/object when it reaches the macro — avoid stringifying config values in macros.

Example fix

// before
{% do adapter.add_time_ingestion_partition_column(config.model.partition_by, columns) %}

// after
{% set partition_by = adapter.parse_partition_by(config.model.partition_by) %}
{% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}
Defensive patterns

Strategy: validation

Validate before calling

{% set partition_by = adapter.parse_partition_by(config.model.partition_by) %}
{% if partition_by is not none %}
  {% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}
{% endif %}

Try / catch

{% try %}
  {% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}
{% except %}
  {{ exceptions.raise_compiler_error("invalid partition_by: " ~ config.model.partition_by) }}
{% endtry %}

Prevention

When it happens

Trigger: Calling adapter.add_time_ingestion_partition_column(partition_by, columns) from Jinja where partition_by is a string like 'DATE', a dict with unsupported keys, an invalid granularity value, or a non-object value instead of a parsed PartitionConfig produced by parse_partition_by.

Common situations: BigQuery time-ingestion partitioning setups where users hand-write partition_by instead of passing the output of adapter.parse_partition_by(config.model.partition_by); typos in granularity (e.g. 'day' vs 'DAY'); config passed through string interpolation losing its dict shape.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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