{"record":{"id":"7c46c3d6294269ba","repo":"gastownhall/beads","slug":"database-name-too-long","errorCode":null,"errorMessage":"database name too long","messagePattern":"database name too long","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/dolt/history.go","lineNumber":34,"sourceCode":"var validTablePattern = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_]*$`)\n\n// validDatabasePattern matches valid MySQL database names (alphanumeric, underscore, hyphen)\nvar validDatabasePattern = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_\\-]*$`)\n\n// validateRef checks if a ref is safe to use in queries.\n// Delegates to issueops.ValidateRef.\nfunc validateRef(ref string) error {\n\treturn issueops.ValidateRef(ref)\n}\n\n// ValidateDatabaseName checks if a database name is safe to use in queries.\n// Prevents SQL injection via backtick escaping in CREATE DATABASE statements.\nfunc ValidateDatabaseName(name string) error {\n\tif name == \"\" {\n\t\treturn fmt.Errorf(\"database name cannot be empty\")\n\t}\n\tif len(name) > 64 {\n\t\treturn fmt.Errorf(\"database name too long\")\n\t}\n\tif !validDatabasePattern.MatchString(name) {\n\t\treturn fmt.Errorf(\"invalid database name: %s\", name)\n\t}\n\treturn nil\n}\n\n// validateTableName checks if a table name is safe to use in queries\nfunc validateTableName(table string) error {\n\tif table == \"\" {\n\t\treturn fmt.Errorf(\"table name cannot be empty\")\n\t}\n\tif len(table) > 64 {\n\t\treturn fmt.Errorf(\"table name too long\")\n\t}\n\tif !validTablePattern.MatchString(table) {\n\t\treturn fmt.Errorf(\"invalid table name: %s\", table)\n\t}","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/dolt/history.go#L16-L52","documentation":"ValidateDatabaseName rejects any database name longer than 64 characters. Dolt, like MySQL, limits identifiers to 64 bytes, and the name is interpolated into CREATE DATABASE statements, so an over-long name would fail server-side anyway. The check runs before any query is issued, so callers get a deterministic client-side error instead of a driver error.","triggerScenarios":"Calling BootstrapFromRemoteWithDB, openServerConnection, or the anonymous caller (connection setup) with a remote URL/org-repo slug or database argument whose length exceeds 64 characters.","commonSituations":"Deriving a database name from a long GitHub repo URL or org/repo path; embedding timestamps or UUID suffixes into already-long names; configuring a remote like 'https://doltremoteapi.dolthub.com/very-long-org/very-long-repository-name' producing a name over the limit.","solutions":["Shorten the database name to 64 characters or fewer (len(name) <= 64) before passing it to any dolt store bootstrap/connect function.","If the name is derived from a repo URL, truncate or hash the long portion (e.g. take a sha256 prefix) and keep it within the 64-byte identifier limit.","Verify the value being passed is the short database name, not the full remote URL or path."],"exampleFix":"// before\nremoteURL := \"https://doltremoteapi.dolthub.com/my-very-long-organization-name/my-extremely-long-repository-name\"\nstore, err := dolt.BootstrapFromRemoteWithDB(ctx, remoteURL, \"workdb\")\n// after\ndbName := \"my-org-my-repo\" // <= 64 chars, matches validDatabasePattern\nstore, err := dolt.BootstrapFromRemoteWithDB(ctx, \"https://doltremoteapi.dolthub.com/my-org/my-repo\", dbName)","handlingStrategy":"validation","validationCode":"func validDBName(name string) bool { return len(name) > 0 && len(name) <= 64 }\nif !validDBName(dbName) { return fmt.Errorf(\"db name %q must be 1-64 chars\", dbName) }","typeGuard":"func isShortIdentifier(s string) bool { return len(s) <= 64 }","tryCatchPattern":null,"preventionTips":["Derive database names from repo slugs by truncating to 64 bytes at creation time, not at call time.","Centralize database-name generation in one helper used by all bootstrap calls.","Validate configured names at config-load/startup rather than inside storage calls."],"tags":["database","validation","identifier-length","dolt"],"backgroundTag":"database-name-too-long","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}