{"record":{"id":"62e3ec0257ee9f63","repo":"plandex-ai/plandex","slug":"unsupported-data-type-t-62e3ec","errorCode":null,"errorMessage":"unsupported data type: %T","messagePattern":"unsupported data type: %T","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/shared/ai_models_data_models.go","lineNumber":669,"sourceCode":"\tcustomModel := customModels[m.ModelId]\n\tif customModel != nil {\n\t\treturn &customModel.BaseModelShared\n\t}\n\n\treturn nil\n}\n\nfunc (m *ModelRoleConfig) Scan(src interface{}) error {\n\tif src == nil {\n\t\treturn nil\n\t}\n\tswitch s := src.(type) {\n\tcase []byte:\n\t\treturn json.Unmarshal(s, m)\n\tcase string:\n\t\treturn json.Unmarshal([]byte(s), m)\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported data type: %T\", src)\n\t}\n}\n\nfunc (m ModelRoleConfig) Value() (driver.Value, error) {\n\treturn json.Marshal(m)\n}\n\ntype PlannerRoleConfig struct {\n\tModelRoleConfig\n\tPlannerModelConfig\n}\n\nfunc (p *PlannerRoleConfig) Scan(src interface{}) error {\n\tif src == nil {\n\t\treturn nil\n\t}\n\tswitch s := src.(type) {\n\tcase []byte:","sourceCodeStart":651,"sourceCodeEnd":687,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/shared/ai_models_data_models.go#L651-L687","documentation":"ModelRoleConfig implements sql.Scanner; its Scan method only accepts []byte and string (JSON text from the DB column) and rejects any other driver.Value type with this error. It fires when the database driver hands Scan a value type it does not handle, typically nil/NULL or a non-text type.","triggerScenarios":"Scanning a NULL model_role_config column into a ModelRoleConfig field (driver passes nil, which hits default); a driver returning []int or other unusual types for the column.","commonSituations":"Reading a row where the JSONB config column is NULL without COALESCE; using a driver or ORM that decodes JSON columns into types other than []byte/string; direct raw queries returning typed columns.","solutions":["COALESCE the column in SQL (e.g. SELECT COALESCE(model_role_config, '{}')) so NULL never reaches Scan.","Add a nil case to the switch: if src == nil { *m = ModelRoleConfig{}; return nil }.","Ensure the column type is JSONB/TEXT so the driver delivers []byte or string.","Check the driver/ORM version for changed column decoding behavior."],"exampleFix":"// before\nswitch s := src.(type) {\ncase []byte:\n    return json.Unmarshal(s, m)\ncase string:\n    return json.Unmarshal([]byte(s), m)\ndefault:\n    return fmt.Errorf(\"unsupported data type: %T\", src)\n}\n// after\nswitch s := src.(type) {\ncase nil:\n    *m = ModelRoleConfig{}\n    return nil\ncase []byte:\n    return json.Unmarshal(s, m)\ncase string:\n    return json.Unmarshal([]byte(s), m)\ndefault:\n    return fmt.Errorf(\"unsupported data type: %T\", src)\n}","handlingStrategy":"type-guard","validationCode":"// ensure the column is never NULL in SQL\nvar cfg ModelRoleConfig\nerr := db.QueryRow(\"SELECT COALESCE(model_role_config, '{}'::jsonb) FROM orgs WHERE id=$1\", orgId).Scan(&cfg)","typeGuard":"func scanableJSON(src any) bool {\n    switch src.(type) {\n    case []byte, string:\n        return true\n    default:\n        return false\n    }\n}","tryCatchPattern":"var cfg ModelRoleConfig\nerr := rows.Scan(&cfg)\nif err != nil {\n    var typeErr *json.UnmarshalTypeError\n    if strings.Contains(err.Error(), \"unsupported data type\") {\n        cfg = ModelRoleConfig{} // fall back to zero value\n    } else {\n        return err\n    }\n}","preventionTips":["Add nil handling to every sql.Scanner implementation for JSON columns.","Use COALESCE/NOT NULL DEFAULT '{}' on all JSONB config columns.","Test Scan against NULL and empty-string values in unit tests.","Keep column types JSONB/TEXT so drivers deliver bytes or strings."],"tags":["database","go","sql-scan","type-mismatch"],"backgroundTag":"sql-scan-type-mismatch","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}