hashicorp/terraform · critical

Unknown type: %#v

Error message

Unknown type: %#v

What it means

A panic in `DiffFieldReader.readField` (internal/legacy/helper/schema/field_reader_diff.go:80), default branch of the switch over `schema.Type`. The diff-backed reader handles the same type set as the config reader (TypeBool/TypeInt/TypeFloat/TypeString/TypeList/TypeMap/TypeSet/typeObject); any other Type panics with 'Unknown type: %#v'. This path runs when merging a diff against prior state/config, so it is exercised during plan diffing for a malformed schema.

Source

Thrown at internal/legacy/helper/schema/field_reader_diff.go:80

	}

	var res FieldReadResult
	var err error

	schema := schemaList[len(schemaList)-1]
	switch schema.Type {
	case TypeBool, TypeInt, TypeFloat, TypeString:
		res, err = r.readPrimitive(address, schema)
	case TypeList:
		res, err = readListField(r, address, schema)
	case TypeMap:
		res, err = r.readMap(address, schema)
	case TypeSet:
		res, err = r.readSet(address, schema)
	case typeObject:
		res, err = readObjectField(r, address, schema.Elem.(map[string]*Schema))
	default:
		panic(fmt.Sprintf("Unknown type: %#v", schema.Type))
	}

	r.cache[cacheKey] = cachedFieldReadResult{
		val: res,
		err: err,
	}
	return res, err
}

func (r *DiffFieldReader) readMap(
	address []string, schema *Schema) (FieldReadResult, error) {
	result := make(map[string]interface{})
	resultSet := false

	// First read the map from the underlying source
	source, err := r.Source.ReadField(address)
	if err != nil {
		return FieldReadResult{}, err

View on GitHub (pinned to c9def3e214)

Solutions

  1. Identify the attribute with the invalid Type in the provider schema and set a valid ValueType.
  2. Add provider schema validation tests to fail fast on TypeInvalid.
  3. Pin SDK and provider versions consistently.
  4. If a Type was renamed/removed, add a state migration so old state never reaches the new reader with the old Type.

Example fix

null
Defensive patterns

Strategy: validation

Validate before calling

// Go (provider): validate schema Types the diff reader will encounter
for name, s := range resource.Schema {
    switch s.Type {
    case schema.TypeString, schema.TypeBool, schema.TypeInt, schema.TypeFloat,
         schema.TypeList, schema.TypeMap, schema.TypeSet:
    default:
        return fmt.Errorf("diff reader cannot handle schema %q Type %d", name, s.Type)
    }
}

Type guard

// Go: confirm a Type is diff-reader-compatible
func diffReadableType(t schema.ValueType) bool {
    switch t {
    case schema.TypeString, schema.TypeBool, schema.TypeInt, schema.TypeFloat,
         schema.TypeList, schema.TypeMap, schema.TypeSet:
        return true
    }
    return false
}

Prevention

When it happens

Trigger: Computing/applying a diff for a provider resource whose schema has an attribute with a Type outside the recognized set. The diff reader dispatches on Type and falls through to the panic.

Common situations: Provider schema with an unset/invalid Type; SDK version mismatch; a field whose Type was changed in the provider without a state migration; legacy provider using a custom ValueType unknown to the diff reader.

Related errors


AI-assisted analysis of hashicorp/terraform@c9def3e214 (2026-08-07). Data as JSON: /api/errors/65251fdaa40fa46d. Report an issue: GitHub.