{"record":{"id":"7b6177574111d1a9","repo":"prestodb/presto","slug":"missing-table-7b6177","errorCode":"MISSING_TABLE","errorMessage":"Table '%s' does not exist","messagePattern":"Table '(.+?)' does not exist","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/RevokeTask.java","lineNumber":56,"sourceCode":"import static com.google.common.collect.ImmutableSet.toImmutableSet;\nimport static com.google.common.util.concurrent.Futures.immediateFuture;\n\npublic class RevokeTask\n        implements DDLDefinitionTask<Revoke>\n{\n    @Override\n    public String getName()\n    {\n        return \"REVOKE\";\n    }\n\n    @Override\n    public ListenableFuture<?> execute(Revoke statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector, String query)\n    {\n        QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getTableName(), metadata);\n        Optional<TableHandle> tableHandle = metadata.getMetadataResolver(session).getTableHandle(tableName);\n        if (!tableHandle.isPresent()) {\n            throw new SemanticException(MISSING_TABLE, statement, \"Table '%s' does not exist\", tableName);\n        }\n\n        Set<Privilege> privileges;\n        if (statement.getPrivileges().isPresent()) {\n            privileges = statement.getPrivileges().get().stream()\n                    .map(privilege -> parsePrivilege(statement, privilege))\n                    .collect(toImmutableSet());\n        }\n        else {\n            // All privileges\n            privileges = EnumSet.allOf(Privilege.class);\n        }\n\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","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/RevokeTask.java#L38-L74","documentation":"Thrown when a REVOKE statement targets a table that cannot be resolved in the metadata after qualification with the session catalog/schema. Presto looks up a TableHandle before applying privileges; if absent, the statement fails fast with a semantic error. No privilege changes occur.","triggerScenarios":"REVOKE ... ON <qualified table name> where metadata.getMetadataResolver(session).getTableHandle(tableName) returns empty for the resolved QualifiedObjectName.","commonSituations":"Typo in table/schema/catalog name; table dropped by another process; querying before the connector registered the table; wrong catalog selected.","solutions":["Verify the fully qualified table name (catalog.schema.table) with a SELECT or SHOW TABLES first","Correct typos or stale names in the REVOKE statement","Recreate the table if it was dropped"],"exampleFix":"// before\nREVOKE SELECT ON hive.default.orers FROM USER alice;\n// after\nREVOKE SELECT ON hive.default.orders FROM USER alice;","handlingStrategy":"validation","validationCode":"QualifiedObjectName name = createQualifiedObjectName(session, statement, table, metadata);\nif (metadata.getMetadataResolver(session).getTableHandle(name).isEmpty()) {\n    throw new IllegalArgumentException(\"Table not found: \" + name);\n}","typeGuard":null,"tryCatchPattern":"try {\n    return revokeTask.execute(statement, ...);\n} catch (SemanticException e) {\n    if (e.getCode() == SemanticErrorCode.MISSING_TABLE) {\n        // handle absent table: skip or surface a friendly message\n    } else {\n        throw e;\n    }\n}","preventionTips":["Always use fully qualified catalog.schema.table names in REVOKE statements","Check table existence with a lightweight SELECT/SHOW before privilege DDL","Re-run grants after table recreation/drops"],"tags":["sql","permissions","table-not-found","semantic-error"],"backgroundTag":"table-does-not-exist","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"}