{"record":{"id":"f5d4d5f28e60a0a7","repo":"bytebase/bytebase","slug":"number-payload-is-required-for-column-maximum-char","errorCode":null,"errorMessage":"number_payload is required for column maximum character length rule","messagePattern":"number_payload is required for column maximum character length rule","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/plugin/advisor/mysql/rule_column_maximum_character_length.go","lineNumber":39,"sourceCode":"func init() {\n\tadvisor.Register(storepb.Engine_MYSQL, storepb.SQLReviewRule_COLUMN_MAXIMUM_CHARACTER_LENGTH, &ColumnMaximumCharacterLengthAdvisor{})\n\tadvisor.Register(storepb.Engine_MARIADB, storepb.SQLReviewRule_COLUMN_MAXIMUM_CHARACTER_LENGTH, &ColumnMaximumCharacterLengthAdvisor{})\n\tadvisor.Register(storepb.Engine_OCEANBASE, storepb.SQLReviewRule_COLUMN_MAXIMUM_CHARACTER_LENGTH, &ColumnMaximumCharacterLengthAdvisor{})\n}\n\n// ColumnMaximumCharacterLengthAdvisor is the advisor checking for max character length.\ntype ColumnMaximumCharacterLengthAdvisor struct {\n}\n\n// Check checks for maximum character length.\nfunc (*ColumnMaximumCharacterLengthAdvisor) Check(_ context.Context, checkCtx advisor.Context) ([]*storepb.Advice, error) {\n\tlevel, err := advisor.NewStatusBySQLReviewRuleLevel(checkCtx.Rule.Level)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnumberPayload := checkCtx.Rule.GetNumberPayload()\n\tif numberPayload == nil {\n\t\treturn nil, errors.New(\"number_payload is required for column maximum character length rule\")\n\t}\n\n\trule := &columnMaximumCharacterLengthOmniRule{\n\t\tOmniBaseRule: OmniBaseRule{\n\t\t\tLevel: level,\n\t\t\tTitle: checkCtx.Rule.Type.String(),\n\t\t},\n\t\tmaximum: int(numberPayload.Number),\n\t}\n\n\tfor _, stmt := range checkCtx.ParsedStatements {\n\t\tif stmt.AST == nil {\n\t\t\tcontinue\n\t\t}\n\t\tnode, ok := mysqlparser.GetOmniNode(stmt.AST)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/bytebase/bytebase/blob/1870550677fe08f0d2a78c07acd27541464eb945/backend/plugin/advisor/mysql/rule_column_maximum_character_length.go#L21-L57","documentation":"The MySQL column maximum character length rule requires a number payload specifying the maximum allowed length (e.g. of VARCHAR/CHAR columns). Check() fails with this error when GetNumberPayload() returns nil, as there is no limit to enforce.","triggerScenarios":"Calling Check() with the MySQL column maximum character length rule while Rule.Payload is absent, empty JSON, or a different payload oneof than NumberPayload.","commonSituations":"Admin enabled the rule without specifying the max length; rule config migration lost the numeric field; caller building storepb.SQLReviewRule forgot the payload.","solutions":["Populate Rule.Payload with a NumberPayload such as {\"number\": 255} before Check().","Ensure the JSON payload keys unmarshal into NumberPayload (protojson camelCase 'number').","Re-edit the SQL review rule and fill the numeric maximum field."],"exampleFix":"// before\nrule := &storepb.SQLReviewRule{Type: storepb.SQLReviewRuleType_COLUMN_MAXIMUM_CHARACTER_LENGTH, Level: storepb.SQLReviewRuleLevel_ERROR}\nCheck(ctx, &advisor.CheckContext{Rule: rule})\n\n// after\npayload, _ := protojson.Marshal(&storepb.NumberPayload{Number: 255})\nrule := &storepb.SQLReviewRule{Type: storepb.SQLReviewRuleType_COLUMN_MAXIMUM_CHARACTER_LENGTH, Level: storepb.SQLReviewRuleLevel_ERROR, Payload: string(payload)}\nCheck(ctx, &advisor.CheckContext{Rule: rule})","handlingStrategy":"validation","validationCode":"if rule.GetNumberPayload() == nil {\n    return fmt.Errorf(\"rule %s requires a number payload before Check()\", rule.Type)\n}","typeGuard":"func hasNumberPayload(r *storepb.SQLReviewRule) bool { return r != nil && r.GetNumberPayload() != nil }","tryCatchPattern":"resp, err := advisor.Check(ctx, checkCtx)\nif err != nil {\n    if strings.Contains(err.Error(), \"number_payload is required\") {\n        return nil, fmt.Errorf(\"rule %s is missing its max character length\", checkCtx.Rule.Type)\n    }\n    return nil, err\n}","preventionTips":["Specify the max character length when enabling the rule.","Validate that numeric rule types carry NumberPayload before persistence.","Re-check payloads after copying rule configs between projects."],"tags":["mysql","sql-review","configuration"],"backgroundTag":"missing-required-config-field","analyzedSha":"1870550677fe08f0d2a78c07acd27541464eb945","analyzedAt":"2026-09-06T21:16:13.665Z","contentChangedAt":"2026-09-06T21:16:13.665Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}