{"record":{"id":"45e48cc2699bc685","repo":"golang-migrate/migrate","slug":"register-driver-is-nil-45e48c","errorCode":null,"errorMessage":"Register driver is nil","messagePattern":"Register driver is nil","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"source/driver.go","lineNumber":101,"sourceCode":"\t\treturn nil, fmt.Errorf(\"source driver: invalid URL scheme\")\n\t}\n\n\tdriversMu.RLock()\n\td, ok := drivers[u.Scheme]\n\tdriversMu.RUnlock()\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"source driver: unknown driver '%s' (forgotten import?)\", u.Scheme)\n\t}\n\n\treturn d.Open(url)\n}\n\n// Register globally registers a driver.\nfunc Register(name string, driver Driver) {\n\tdriversMu.Lock()\n\tdefer driversMu.Unlock()\n\tif driver == nil {\n\t\tpanic(\"Register driver is nil\")\n\t}\n\tif _, dup := drivers[name]; dup {\n\t\tpanic(\"Register called twice for driver \" + name)\n\t}\n\tdrivers[name] = driver\n}\n\n// List lists the registered drivers\nfunc List() []string {\n\tdriversMu.RLock()\n\tdefer driversMu.RUnlock()\n\tnames := make([]string, 0, len(drivers))\n\tfor n := range drivers {\n\t\tnames = append(names, n)\n\t}\n\treturn names\n}\n","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/golang-migrate/migrate/blob/01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a/source/driver.go#L83-L119","documentation":"source.Register panics when the migration-source driver argument is nil. Source drivers (file, iofs, pkger, etc.) are stored in a global map by name; a nil entry would panic on later lookup/use, so registration rejects it eagerly.","triggerScenarios":"Calling source.Register(\"mysrc\", nil) or registering an interface variable that is nil because the source driver failed to initialize, typically in a package's init().","commonSituations":"Custom source drivers registered from init() with a failed constructor, copied boilerplate where the driver was never assigned, or typed-nil interface values passed by mistake.","solutions":["Construct the source Driver before registering and propagate any constructor errors.","Avoid nil typed-interface values; compare against nil carefully before Register.","Move registration out of init() into explicit setup code if initialization can fail."],"exampleFix":"// before\nfunc init() { source.Register(\"mem\", s) } // s nil when setup failed\n// after\nfunc init() {\n\tif s == nil { panic(\"source driver not initialized\") }\n\tsource.Register(\"mem\", s)\n}","handlingStrategy":"validation","validationCode":"if srcDrv == nil {\n\tpanic(\"refusing to call source.Register with nil driver\")\n}\nsource.Register(name, srcDrv)","typeGuard":"func isNilSource(s source.Driver) bool {\n\tif s == nil { return true }\n\treturn reflect.ValueOf(s).Kind() == reflect.Ptr && reflect.ValueOf(s).IsNil()\n}","tryCatchPattern":"defer func() {\n\tif r := recover(); r != nil {\n\t\tif s, ok := r.(string); ok && s == \"Register driver is nil\" {\n\t\t\tlog.Fatalf(\"nil source driver: check driver initialization order\")\n\t\t}\n\t\tpanic(r)\n\t}\n}()\nsource.Register(name, srcDrv)","preventionTips":["Check constructor errors before registering; never assign a possibly-nil value to the driver variable.","Register in explicit setup code where failures are visible rather than silent init() paths.","Assert non-nil registration results in unit tests via source.List()."],"tags":["go","migrate","panic","driver-registration","nil"],"backgroundTag":"nil-driver-registration-panic","analyzedSha":"01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a","analyzedAt":"2026-09-02T19:38:29.671Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}