{"record":{"id":"7829ec36deffeac5","repo":"bytebase/bytebase","slug":"unsupported-status-q","errorCode":null,"errorMessage":"unsupported status %q","messagePattern":"unsupported status %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/store/access_grant.go","lineNumber":567,"sourceCode":"func getAccessGrantStatusFilter(status string) (*qb.Query, error) {\n\trejectedIssueQ := qb.Q().Space(\"EXISTS (SELECT 1 FROM issue, jsonb_array_elements(issue.payload->'approval'->'approvers') AS approver WHERE issue.project = access_grant.project AND issue.id = (access_grant.payload->>'issueId')::bigint AND COALESCE((issue.payload->'approval'->>'approvalFindingDone')::boolean, false) AND issue.payload->'approval'->'approvalTemplate' IS NOT NULL AND approver->>'status' = ?)\", storepb.IssuePayloadApproval_Approver_REJECTED.String())\n\tcanceledIssueQ := qb.Q().Space(\"EXISTS (SELECT 1 FROM issue WHERE issue.project = access_grant.project AND issue.id = (access_grant.payload->>'issueId')::bigint AND issue.status = ?)\", storepb.Issue_CANCELED.String())\n\n\tswitch status {\n\tcase \"ACTIVE\":\n\t\treturn qb.Q().Space(\"(access_grant.status = ? AND access_grant.expire_time > now())\", storepb.AccessGrant_ACTIVE.String()), nil\n\tcase \"EXPIRED\":\n\t\treturn qb.Q().Space(\"(access_grant.status = ? AND access_grant.expire_time <= now())\", storepb.AccessGrant_ACTIVE.String()), nil\n\tcase \"REVOKED\":\n\t\treturn qb.Q().Space(\"access_grant.status = ?\", storepb.AccessGrant_REVOKED.String()), nil\n\tcase \"PENDING\":\n\t\treturn qb.Q().Space(\"(access_grant.status = ? AND NOT ? AND NOT ?)\", storepb.AccessGrant_PENDING.String(), canceledIssueQ, rejectedIssueQ), nil\n\tcase \"CANCELED\":\n\t\treturn qb.Q().Space(\"(access_grant.status = ? AND ? AND NOT ?)\", storepb.AccessGrant_PENDING.String(), canceledIssueQ, rejectedIssueQ), nil\n\tcase \"REJECTED\":\n\t\treturn qb.Q().Space(\"(access_grant.status = ? AND ?)\", storepb.AccessGrant_PENDING.String(), rejectedIssueQ), nil\n\tdefault:\n\t\treturn nil, errors.Errorf(\"unsupported status %q\", status)\n\t}\n}\n","sourceCodeStart":549,"sourceCodeEnd":570,"githubUrl":"https://github.com/bytebase/bytebase/blob/1870550677fe08f0d2a78c07acd27541464eb945/backend/store/access_grant.go#L549-L570","documentation":"getAccessGrantStatusFilter maps a user-supplied status string from a CEL `status == \"...\"` / `status in [...]` filter to SQL, and throws this when the status is not one of ACTIVE, EXPIRED, REVOKED, PENDING, CANCELED, or REJECTED. These are virtual statuses: PENDING/CANCELED/REJECTED are derived from issue approval state, not stored directly in access_grant.status.","triggerScenarios":"Filtering access grants with a status literal not in the supported set, e.g. `status == \"active\"` (lowercase), `status == \"PENDING_APPROVAL\"`, or a proto enum name like `STATUS_ACTIVE`.","commonSituations":"Case-sensitivity mistakes (lowercase status), clients reusing status enums from other Bytebase resources (issues, instances), or API version drift after the status vocabulary changed.","solutions":["Use one of the exact values: ACTIVE, EXPIRED, REVOKED, PENDING, CANCELED, REJECTED (uppercase, no prefix)","Check the ListAccessGrants API reference for the documented status filter vocabulary","If combining statuses, use `status in [\"ACTIVE\", \"PENDING\"]` instead of inventing intermediate values"],"exampleFix":"// before\nfilter = \"status == \\\"active\\\"\"\n// after\nfilter = \"status == \\\"ACTIVE\\\"\"","handlingStrategy":"validation","validationCode":"var validStatuses = map[string]bool{\"ACTIVE\":true,\"EXPIRED\":true,\"REVOKED\":true,\"PENDING\":true,\"CANCELED\":true,\"REJECTED\":true}\nif !validStatuses[status] {\n    return fmt.Errorf(\"status %q not in %v\", status, []string{\"ACTIVE\",\"EXPIRED\",\"REVOKED\",\"PENDING\",\"CANCELED\",\"REJECTED\"})\n}","typeGuard":null,"tryCatchPattern":"if err := validateAccessGrantStatuses(filterStatuses); err != nil {\n    return status.Errorf(codes.InvalidArgument, \"unsupported status filter: %v\", err)\n}","preventionTips":["Use uppercase, unprefixed status values exactly as documented","Copy status values from the API reference, not other resource enums","Use `status in [...]` for multi-status queries"],"tags":["cel","filter","enum","access-grant"],"backgroundTag":"invalid-enum-value","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"}