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{}, errView on GitHub (pinned to c9def3e214)
Solutions
- Identify the attribute with the invalid Type in the provider schema and set a valid ValueType.
- Add provider schema validation tests to fail fast on TypeInvalid.
- Pin SDK and provider versions consistently.
- 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
- Set a valid Type on every schema attribute the diff path touches.
- Add a state migration whenever a field Type changes so old diffs stay consistent.
- Pin provider versions across plan and apply to keep set/schema hashing stable.
- Add provider schema tests that fail on TypeInvalid.
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.