{"record":{"id":"429018afff9000db","repo":"prestodb/presto","slug":"missing-table-429018","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/AddConstraintTask.java","lineNumber":96,"sourceCode":"        }\n\n        return tableConstraint;\n    }\n\n    @Override\n    public String getName()\n    {\n        return \"ADD CONSTRAINT\";\n    }\n\n    @Override\n    public ListenableFuture<?> execute(AddConstraint 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            if (!statement.isTableExists()) {\n                throw new SemanticException(MISSING_TABLE, statement, \"Table '%s' does not exist\", tableName);\n            }\n            return immediateFuture(null);\n        }\n\n        Optional<MaterializedViewDefinition> optionalMaterializedView = metadata.getMetadataResolver(session).getMaterializedView(tableName);\n        if (optionalMaterializedView.isPresent()) {\n            if (!statement.isTableExists()) {\n                throw new SemanticException(NOT_SUPPORTED, statement, \"'%s' is a materialized view, and add constraint is not supported\", tableName);\n            }\n            return immediateFuture(null);\n        }\n\n        ConnectorId connectorId = metadata.getCatalogHandle(session, tableName.getCatalogName())\n                .orElseThrow(() -> new PrestoException(NOT_FOUND, \"Catalog does not exist: \" + tableName.getCatalogName()));\n\n        accessControl.checkCanAddConstraints(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), tableName);\n\n        metadata.addConstraint(session, tableHandle.get(), convertToTableConstraint(metadata, session, connectorId, statement.getConstraintSpecification(), warningCollector, query));","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/AddConstraintTask.java#L78-L114","documentation":"Thrown by AddConstraintTask.execute when ALTER TABLE ... ADD CONSTRAINT targets a table whose handle cannot be resolved via the metadata resolver, and the statement did not specify IF EXISTS. Presto fails fast because constraints can only be added to existing tables.","triggerScenarios":"`ALTER TABLE cat.schema.t ADD CONSTRAINT ...` where t does not exist (or exists under a different case/name) and no `IF EXISTS` guard was given.","commonSituations":"Typos in qualified table names; running DDL against the wrong catalog or schema; table dropped by a concurrent job; case-sensitivity differences across catalogs.","solutions":["Verify the table exists with SHOW TABLES / SHOW CREATE TABLE in the right catalog.schema","Correct the qualified table name (catalog.schema.table) in the statement","Add IF EXISTS semantics if your deployment should silently skip missing tables"],"exampleFix":"// before\nALTER TABLE hive.default.usr ADD CONSTRAINT uq UNIQUE (id);\n// after\nALTER TABLE hive.default.users ADD CONSTRAINT uq UNIQUE (id);","handlingStrategy":"validation","validationCode":"QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getTableName(), metadata);\nif (metadata.getMetadataResolver(session).getTableHandle(tableName).isEmpty()) {\n    if (!statement.isTableExists()) {\n        throw new SemanticException(MISSING_TABLE, statement, \"Table '%s' does not exist\", tableName);\n    }\n}","typeGuard":"boolean tableExists(Metadata metadata, Session session, QualifiedObjectName name) {\n    return metadata.getMetadataResolver(session).getTableHandle(name).isPresent();\n}","tryCatchPattern":"try {\n    executeAddConstraint(statement);\n} catch (SemanticException e) {\n    if (e.getCode() == MISSING_TABLE) {\n        log.warn(\"Table %s missing; skipping constraint DDL\", statement.getTableName());\n    } else throw e;\n}","preventionTips":["Verify table existence with SHOW TABLES before constraint DDL","Use fully qualified catalog.schema.table names in scripts","Use IF EXISTS variants when DDL should tolerate missing tables","Re-check names after environment or schema migrations"],"tags":["presto","ddl","missing-table"],"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"}