{"record":{"id":"76e8256c2f32f5eb","repo":"plandex-ai/plandex","slug":"unsupported-data-type-t-76e825","errorCode":null,"errorMessage":"unsupported data type: %T","messagePattern":"unsupported data type: %T","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/shared/plan_model_settings.go","lineNumber":96,"sourceCode":"\tp.ModelPack = nil\n}\n\nfunc (p *PlanSettings) SetCustomModelPack(modelPack *ModelPack) {\n\tp.ModelPackName = \"\"\n\tp.ModelPack = modelPack\n}\n\nfunc (p *PlanSettings) 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, p)\n\tcase string:\n\t\treturn json.Unmarshal([]byte(s), p)\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported data type: %T\", src)\n\t}\n}\n\nfunc (p PlanSettings) Value() (driver.Value, error) {\n\treturn json.Marshal(p)\n}\n\nfunc (ps PlanSettings) GetPlannerMaxTokens() int {\n\tmodelPack := ps.GetModelPack()\n\tplanner := modelPack.Planner\n\tfallback := planner.GetFinalLargeContextFallback()\n\tbaseConfig := fallback.GetSharedBaseConfig(&ps)\n\treturn baseConfig.MaxTokens\n}\n\nfunc (ps PlanSettings) GetPlannerMaxReservedOutputTokens() int {\n\tmodelPack := ps.GetModelPack()\n\tplanner := modelPack.Planner","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/shared/plan_model_settings.go#L78-L114","documentation":"PlanSettings' Scan method accepts only []byte and string, unmarshaling JSON into the struct; any other driver.Value (nil/NULL, numeric, etc.) produces this error. Like errors 773/774/777/778 it guards a JSON-in-DB column.","triggerScenarios":"Scanning a NULL plan_model_settings column (nil hits default); driver returning a non-text Go type for the column; mapping Scan to a mismatched column type.","commonSituations":"Old rows predating the settings column; schema changes or defaults dropped in migration; driver upgrades changing how JSON columns are delivered to Scanner implementations.","solutions":["COALESCE the column in SQL so NULL is never passed to Scan.","Add a nil case assigning an empty PlanSettings before the default branch.","Keep the column as JSONB/TEXT so drivers deliver []byte/string.","Re-test after driver/ORM upgrades for changed JSON decoding types."],"exampleFix":"// before\nswitch s := src.(type) {\ncase []byte:\n    return json.Unmarshal(s, p)\ncase string:\n    return json.Unmarshal([]byte(s), p)\ndefault:\n    return fmt.Errorf(\"unsupported data type: %T\", src)\n}\n// after\nswitch s := src.(type) {\ncase nil:\n    *p = PlanSettings{}\n    return nil\ncase []byte:\n    return json.Unmarshal(s, p)\ncase string:\n    return json.Unmarshal([]byte(s), p)\ndefault:\n    return fmt.Errorf(\"unsupported data type: %T\", src)\n}","handlingStrategy":"type-guard","validationCode":"var ps PlanSettings\nerr := db.QueryRow(\"SELECT COALESCE(plan_model_settings, '{}'::jsonb) FROM plans WHERE id=$1\", planId).Scan(&ps)","typeGuard":"func isTextDriverValue(src any) bool {\n    switch src.(type) {\n    case []byte, string:\n        return true\n    default:\n        return false\n    }\n}","tryCatchPattern":"var ps PlanSettings\nif err := rows.Scan(&ps); err != nil {\n    if strings.Contains(err.Error(), \"unsupported data type\") {\n        ps = PlanSettings{} // zero-value fallback\n    } else {\n        return err\n    }\n}","preventionTips":["Add a nil case to PlanSettings.Scan.","Use NOT NULL DEFAULT '{}' on plan_model_settings columns.","COALESCE the column in raw SQL to avoid NULL scans.","Re-verify Scan behavior after DB driver upgrades."],"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"}