{"record":{"id":"e496bcf144845216","repo":"nats-io/nats-server","slug":"beginning-of-range-d-beyond-end-of-range-d","errorCode":null,"errorMessage":"beginning of range (%d) beyond end of range (%d): %s","messagePattern":"beginning of range \\((.+?)\\) beyond end of range \\((.+?)\\): (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/cron.go","lineNumber":228,"sourceCode":"\t\t// Special handling: \"N/step\" means \"N-max/step\".\n\t\tif singleDigit {\n\t\t\tend = r.max\n\t\t}\n\t\tif step > 1 {\n\t\t\textra = 0\n\t\t}\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"too many slashes: %s\", expr)\n\t}\n\n\tif start < r.min {\n\t\treturn 0, fmt.Errorf(\"beginning of range (%d) below minimum (%d): %s\", start, r.min, expr)\n\t}\n\tif end > r.max {\n\t\treturn 0, fmt.Errorf(\"end of range (%d) above maximum (%d): %s\", end, r.max, expr)\n\t}\n\tif start > end {\n\t\treturn 0, fmt.Errorf(\"beginning of range (%d) beyond end of range (%d): %s\", start, end, expr)\n\t}\n\tif step == 0 {\n\t\treturn 0, fmt.Errorf(\"step of range should be a positive number: %s\", expr)\n\t}\n\treturn getBits(start, end, step) | extra, nil\n}\n\n// parseIntOrName returns the (possibly-named) integer contained in expr.\nfunc parseIntOrName(expr string, names map[string]uint) (uint, error) {\n\tif names != nil {\n\t\tif namedInt, ok := names[strings.ToLower(expr)]; ok {\n\t\t\treturn namedInt, nil\n\t\t}\n\t}\n\treturn mustParseInt(expr)\n}\n\n// mustParseInt parses the given expression as an int or returns an error.","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/cron.go#L210-L246","documentation":"Cron expression range parser: within a single range component the start value is greater than the end value (e.g. 50-10), making the range unsatisfiable.","triggerScenarios":"Any '-' range where the left value is greater than the right, e.g. hours \"22-2\", minutes \"50-10\", parsed via parseCron -> getField -> getRange.","commonSituations":"Trying to express a wrap-around overnight window (22:00-02:00) in one range; typos transposing range endpoints.","solutions":["Split wrap-around ranges into two comma-separated ascending ranges: \"22-23,0-2\"","Swap the endpoints so start <= end","Use '*' with steps if a recurring spread is intended"],"exampleFix":"// before (hour field)\n expr := \"22-2\"\n// after\n expr := \"22-23,0-2\"","handlingStrategy":"validation","validationCode":"if start > end {\n    return fmt.Errorf(\"range %d-%d is inverted; split wrap-around into comma ranges\", start, end)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Express overnight windows as two ascending ranges joined by commas","Never rely on wrap-around ranges; they are unsupported"],"tags":["cron","parsing","range-validation"],"backgroundTag":"invalid-cron-expression","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}