{"record":{"id":"c7d926b19a70219d","repo":"plandex-ai/plandex","slug":"unsupported-data-type-t-c7d926","errorCode":null,"errorMessage":"unsupported data type: %T","messagePattern":"unsupported data type: %T","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/shared/plan_config.go","lineNumber":120,"sourceCode":"\tif src == nil {\n\t\t*p = DefaultPlanConfig\n\t\treturn nil\n\t}\n\tswitch s := src.(type) {\n\tcase []byte:\n\t\tif len(s) == 0 {\n\t\t\t*p = DefaultPlanConfig\n\t\t\treturn nil\n\t\t}\n\t\treturn json.Unmarshal(s, p)\n\tcase string:\n\t\tif s == \"\" {\n\t\t\t*p = DefaultPlanConfig\n\t\t\treturn nil\n\t\t}\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 PlanConfig) Value() (driver.Value, error) {\n\treturn json.Marshal(p)\n}\n\nfunc (p *PlanConfig) SetAutoMode(mode AutoModeType) {\n\tp.AutoMode = mode\n\n\tswitch p.AutoMode {\n\tcase AutoModeFull:\n\t\tp.AutoContinue = true\n\t\tp.AutoBuild = true\n\t\tp.AutoUpdateContext = true\n\t\tp.AutoLoadContext = true\n\t\tp.SmartContext = true\n\t\tp.AutoApply = true","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/shared/plan_config.go#L102-L138","documentation":"PlanConfig's Scan method only accepts []byte and string (with empty string mapping to DefaultPlanConfig) and returns this error for any other driver.Value, most importantly nil for NULL columns. It indicates the plan config column value isn't JSON text the scanner can unmarshal.","triggerScenarios":"Scanning a NULL plan_config column; a driver/ORM delivering the column as a non-[]byte/string type; column type changed away from JSONB/TEXT.","commonSituations":"Legacy plans with NULL config columns; migrations that dropped defaults; switching drivers (e.g. pgx stdlib vs lib/pq differences in JSON decoding); raw SQL joins producing unexpected column types.","solutions":["COALESCE(plan_config, '{}'::jsonb) in queries to avoid NULL reaching Scan.","Add a nil case to Scan that assigns DefaultPlanConfig.","Ensure the column is JSONB/TEXT with a NOT NULL DEFAULT '{}' constraint.","Verify driver/ORM version behavior for JSON column decoding."],"exampleFix":"// before\ndefault:\n    return fmt.Errorf(\"unsupported data type: %T\", src)\n// after\ncase nil:\n    *p = DefaultPlanConfig\n    return nil\ndefault:\n    return fmt.Errorf(\"unsupported data type: %T\", src)","handlingStrategy":"type-guard","validationCode":"var pc PlanConfig\nerr := db.QueryRow(\"SELECT COALESCE(plan_config, '{}'::jsonb) FROM plans WHERE id=$1\", planId).Scan(&pc)","typeGuard":"func scanableJSONValue(src any) bool {\n    switch src.(type) {\n    case []byte, string:\n        return true\n    default:\n        return false\n    }\n}","tryCatchPattern":"var pc PlanConfig\nif err := rows.Scan(&pc); err != nil {\n    if strings.Contains(err.Error(), \"unsupported data type\") {\n        pc = shared.DefaultPlanConfig // fall back to defaults\n    } else {\n        return err\n    }\n}","preventionTips":["Handle nil in PlanConfig.Scan by assigning DefaultPlanConfig.","Keep plan_config JSONB NOT NULL with a server default.","COALESCE in any query selecting the column.","Cover NULL-scan behavior in unit tests."],"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-12T22:17:10.623Z"}