jackc/pgx · error

Multirange element OID

Error message

Multirange element OID %v was not already registered, needed for %q

What it means

LoadTypes found a multirange type ('m') whose underlying range type OID is not registered. Multirange codecs delegate to the range codec, so the range must be loaded first.

Solutions

  1. Include the corresponding range type in the LoadTypes call
  2. Pre-register the range type before loading the multirange
  3. Note multiranges require PostgreSQL 14+
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at derived_types.go:229 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of jackc/pgx@ec1a0befd2 (2026-08-04). Data as JSON: /api/errors/e9d64ccdb62f24a8. Report an issue: GitHub.

Appendix: source

Thrown at derived_types.go:229

			dt, ok := m.TypeForOID(ti.Typbasetype)
			if !ok {
				return nil, fmt.Errorf("Domain base type OID %v was not already registered, needed for %q", ti.Typbasetype, ti.TypeName)
			}

			type_ = &pgtype.Type{Name: ti.TypeName, OID: ti.Oid, Codec: dt.Codec}
		case "e": // enum
			type_ = &pgtype.Type{Name: ti.TypeName, OID: ti.Oid, Codec: &pgtype.EnumCodec{}}
		case "r": // range
			dt, ok := m.TypeForOID(ti.Rngsubtype)
			if !ok {
				return nil, fmt.Errorf("Range element OID %v was not already registered, needed for %q", ti.Rngsubtype, ti.TypeName)
			}

			type_ = &pgtype.Type{Name: ti.TypeName, OID: ti.Oid, Codec: &pgtype.RangeCodec{ElementType: dt}}
		case "m": // multirange
			dt, ok := m.TypeForOID(ti.Rngtypid)
			if !ok {
				return nil, fmt.Errorf("Multirange element OID %v was not already registered, needed for %q", ti.Rngtypid, ti.TypeName)
			}

			type_ = &pgtype.Type{Name: ti.TypeName, OID: ti.Oid, Codec: &pgtype.MultirangeCodec{ElementType: dt}}
		default:
			return nil, fmt.Errorf("Unknown typtype %q was found while registering %q", ti.Typtype, ti.TypeName)
		}

		// the type_ is impossible to be null
		m.RegisterType(type_)
		if ti.NspName != "" {
			nspType := &pgtype.Type{Name: ti.NspName + "." + type_.Name, OID: type_.OID, Codec: type_.Codec}
			m.RegisterType(nspType)
			result = append(result, nspType)
		}
		result = append(result, type_)
	}

	if err := rows.Err(); err != nil {

View on GitHub (pinned to ec1a0befd2)