diesel-rs/diesel · error

unexpected `oid` when `name` is present help

Error message

unexpected `oid` when `name` is present
help: {help}

What it means

Compile-time error validating #[diesel(postgres_type(...))] arguments. In diesel 2.x a type can be identified either by `oid`/`array_oid` or by `name`/`schema`, but not both; this guard fires when `name = "..."` is present together with `oid = ...`, since the two lookup modes are mutually exclusive. Fix: remove `oid` (and `array_oid`) when using the name-based lookup, or remove `name`.

Solutions

  1. Remove `oid` and keep `name` for lookup by name
  2. Drop `name` and provide `oid`/`array_oid` instead
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at diesel_attribute_parser/src/parsers/postgres_type.rs:77 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of diesel-rs/diesel@6fa6ed01b2 (2026-09-07). Data as JSON: /api/errors/50b503866bf3f6cf. Report an issue: GitHub.

Appendix: source

Thrown at diesel_attribute_parser/src/parsers/postgres_type.rs:77

        Self::validate_and_build(input, oid, array_oid, name, schema)
    }
}

impl PostgresType {
    pub fn validate_and_build(
        input: ParseStream,
        oid: Option<(Ident, LitInt)>,
        array_oid: Option<(Ident, LitInt)>,
        name: Option<(Ident, LitStr)>,
        schema: Option<(Ident, LitStr)>,
    ) -> Result<Self> {
        let help = format!(
            "the correct format looks like either `#[diesel({POSTGRES_TYPE_NOTE})]` or `#[diesel({POSTGRES_TYPE_NOTE_ID})]`"
        );

        if let Some((_, name)) = name {
            if let Some((oid, _)) = oid {
                Err(syn::Error::new(
                    oid.span(),
                    format!("unexpected `oid` when `name` is present\nhelp: {help}"),
                ))
            } else if let Some((array_oid, _)) = array_oid {
                Err(syn::Error::new(
                    array_oid.span(),
                    format!("unexpected `array_oid` when `name` is present\nhelp: {help}"),
                ))
            } else {
                Ok(PostgresType::Lookup(name, schema.map(|s| s.1)))
            }
        } else if let Some((schema, lit)) = schema {
            Err(syn::Error::new(
                schema.span(),
                format!(
                    "expected `name` to be also present\n\
                     help: make sure `name` is present, `#[diesel(postgres_type(name = \"...\", schema = \"{}\"))]`",
                    lit.value()

View on GitHub (pinned to 6fa6ed01b2)