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

Expect a BigqueryPartitionConfigStruct

Error message

Expect a BigqueryPartitionConfigStruct

What it means

After deserializing partition_by into a PartitionConfig, add_time_ingestion_partition_column() converts it into a BigQuery-specific partition config via into_bigquery(). If that conversion returns None — meaning the PartitionConfig is not a BigQuery-compatible variant — this InvalidArgument error is thrown because time-ingestion partition columns only exist for BigQuery partition configs.

Source

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

                );
                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)
            }
            // In parse mode, return stub value early without validation
            Parse(_) => Ok(empty_vec_value()),
        }
    }

    #[tracing::instrument(skip(self, state), level = "trace")]
    pub fn grant_access_to(
        &self,
        state: &State,

View on GitHub (pinned to 0267ce9170)

Solutions

  1. Only call add_time_ingestion_partition_column when the adapter is BigQuery.
  2. Ensure partition_by comes from adapter.parse_partition_by within a BigQuery project so it carries the BigQuery partition variant.
  3. Check that config.model.partition_by uses BigQuery syntax (type: time_ingestion / range with valid granularity fields).
  4. If you support multiple warehouses, guard the macro call behind target.type == 'bigquery'.

Example fix

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

// after
{% if target.type == 'bigquery' %}
  {% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}
{% else %}
  {{ exceptions.raise_compiler_error("time ingestion partitioning is BigQuery-only") }}
{% endif %}
Defensive patterns

Strategy: validation

Validate before calling

{% if target.type == 'bigquery' and config.model.get('partition_by') is defined %}
  {% set pb = adapter.parse_partition_by(config.model.partition_by) %}
  {% do adapter.add_time_ingestion_partition_column(pb, columns) %}
{% endif %}

Prevention

When it happens

Trigger: Calling adapter.add_time_ingestion_partition_column(partition_by, columns) with a PartitionConfig whose variant cannot be converted to BigqueryPartitionConfigStruct — typically a partition config from a non-BigQuery adapter shape, or a PartitionConfig missing the BigQuery-specific fields/variant.

Common situations: Running BigQuery macros on a project whose partition config came from another warehouse's syntax; mixing adapter-specific partition config types; using this macro on a non-BigQuery adapter (it is BigQuery-specific); corrupted or partially-built PartitionConfig values passed from custom macros.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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