{"record":{"id":"319be50ef1937bf9","repo":"prestodb/presto","slug":"invalid-privilege-319be5","errorCode":"INVALID_PRIVILEGE","errorMessage":"Unknown privilege: '%s'","messagePattern":"Unknown privilege: '(.+?)'","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/RevokeTask.java","lineNumber":87,"sourceCode":"\n        // verify current identity has permissions to revoke permissions\n        for (Privilege privilege : privileges) {\n            accessControl.checkCanRevokeTablePrivilege(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), privilege, tableName, createPrincipal(statement.getGrantee()), statement.isGrantOptionFor());\n        }\n\n        metadata.revokeTablePrivileges(session, tableName, privileges, createPrincipal(statement.getGrantee()), statement.isGrantOptionFor());\n        return immediateFuture(null);\n    }\n\n    private static Privilege parsePrivilege(Revoke statement, String privilegeString)\n    {\n        for (Privilege privilege : Privilege.values()) {\n            if (privilege.name().equalsIgnoreCase(privilegeString)) {\n                return privilege;\n            }\n        }\n\n        throw new SemanticException(INVALID_PRIVILEGE, statement, \"Unknown privilege: '%s'\", privilegeString);\n    }\n}\n","sourceCodeStart":69,"sourceCodeEnd":90,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/RevokeTask.java#L69-L90","documentation":"parsePrivilege matches the privilege keyword in a GRANT/REVOKE statement case-insensitively against the Privilege enum values. If no enum matches, the statement is rejected with INVALID_PRIVILEGE before any permission change. Only privileges defined in the Presto Privilege enum are accepted.","triggerScenarios":"REVOKE <word> ... ON <table> where <word> does not equal (ignoring case) any Privilege enum name, e.g. 'WRITE', 'DROP', 'ALL PRIVILEGES'.","commonSituations":"Using privileges from other SQL dialects (INSERT/UPDATE/DELETE depend on dialect); guessing privilege names; copy-pasting GRANT syntax from another database.","solutions":["Use one of the supported privilege names (e.g. SELECT, INSERT, UPDATE, DELETE — exactly the Privilege enum values)","Omit the privilege to apply all privileges in the statement","Check the Presto version's Privilege enum for the exact supported set"],"exampleFix":"// before\nREVOKE TRUNCATE ON hive.default.orders FROM USER alice;\n// after\nREVOKE DELETE ON hive.default.orders FROM USER alice;","handlingStrategy":"validation","validationCode":"Set<String> valid = Arrays.stream(Privilege.values())\n        .map(p -> p.name().toUpperCase())\n        .collect(Collectors.toSet());\nif (!valid.contains(privilegeString.toUpperCase())) {\n    throw new IllegalArgumentException(\"Unknown privilege: \" + privilegeString);\n}","typeGuard":null,"tryCatchPattern":"try {\n    return revokeTask.execute(statement, ...);\n} catch (SemanticException e) {\n    if (e.getCode() == SemanticErrorCode.INVALID_PRIVILEGE) {\n        // map or reject the privilege keyword before retry\n    } else {\n        throw e;\n    }\n}","preventionTips":["Only use privilege keywords matching the Presto Privilege enum","Do not copy GRANT/REVOKE syntax from other databases verbatim","Pin the Presto version and review its supported privileges"],"tags":["sql","permissions","invalid-privilege","semantic-error"],"backgroundTag":"unknown-privilege","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}