{"record":{"id":"44c18c93eda93847","repo":"prestodb/presto","slug":"not-supported-44c18c","errorCode":"NOT_SUPPORTED","errorMessage":"Catalog %s does not support Unique constraints","messagePattern":"Catalog (.+?) does not support Unique constraints","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/AddConstraintTask.java","lineNumber":62,"sourceCode":"import static com.facebook.presto.spi.connector.ConnectorCapabilities.PRIMARY_KEY_CONSTRAINT;\nimport static com.facebook.presto.spi.connector.ConnectorCapabilities.UNIQUE_CONSTRAINT;\nimport static com.facebook.presto.sql.analyzer.SemanticErrorCode.MISSING_TABLE;\nimport static com.facebook.presto.sql.analyzer.SemanticErrorCode.NOT_SUPPORTED;\nimport static com.google.common.util.concurrent.Futures.immediateFuture;\nimport static java.lang.String.format;\nimport static java.util.stream.Collectors.toCollection;\n\npublic class AddConstraintTask\n        implements DDLDefinitionTask<AddConstraint>\n{\n    public static TableConstraint<String> convertToTableConstraint(Metadata metadata, Session session, ConnectorId connectorId, ConstraintSpecification node, WarningCollector warningCollector, String query)\n    {\n        TableConstraint<String> tableConstraint;\n        LinkedHashSet<String> constraintColumns = node.getColumns().stream().collect(toCollection(LinkedHashSet::new));\n        switch (node.getConstraintType()) {\n            case UNIQUE:\n                if (!metadata.getConnectorCapabilities(session, connectorId).contains(UNIQUE_CONSTRAINT)) {\n                    throw new SemanticException(NOT_SUPPORTED, node, \"Catalog %s does not support Unique constraints\", connectorId.getCatalogName());\n                }\n                tableConstraint = new UniqueConstraint<>(node.getConstraintName(), constraintColumns, node.isEnabled(), node.isRely(), node.isEnforced());\n                break;\n            case PRIMARY_KEY:\n                if (!metadata.getConnectorCapabilities(session, connectorId).contains(PRIMARY_KEY_CONSTRAINT)) {\n                    throw new SemanticException(NOT_SUPPORTED, node, \"Catalog %s does not support Primary Key constraints\", connectorId.getCatalogName());\n                }\n                tableConstraint = new PrimaryKeyConstraint<>(node.getConstraintName(), constraintColumns, node.isEnabled(), node.isRely(), node.isEnforced());\n                break;\n            default:\n                throw new SemanticException(NOT_SUPPORTED, node, \"Given constraint type %s is not supported\", node.getConstraintType().toString());\n        }\n\n        if (!metadata.getConnectorCapabilities(session, connectorId).contains(ENFORCE_CONSTRAINTS) && node.isEnforced()) {\n            warningCollector.add(new PrestoWarning(SEMANTIC_WARNING, format(\"Constraint %s is set to ENFORCED. This connector does not support enforcement of table constraints\", node.getConstraintName().orElse(\"\"))));\n        }\n\n        return tableConstraint;","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/AddConstraintTask.java#L44-L80","documentation":"Thrown by AddConstraintTask.convertToTableConstraint when ALTER TABLE ... ADD CONSTRAINT declares a UNIQUE constraint but the target catalog's connector lacks the UNIQUE_CONSTRAINT capability. Presto refuses to build the UniqueConstraint because the connector cannot represent it.","triggerScenarios":"`ALTER TABLE cat.schema.t ADD CONSTRAINT uq UNIQUE (col)` against a connector that does not report UNIQUE_CONSTRAINT in its capabilities.","commonSituations":"Adding UNIQUE constraints on Hive or other connectors without constraint support; DDL scripts moved from RDBMS catalogs; assuming all catalogs honor table constraints.","solutions":["Use a catalog/connector that supports UNIQUE_CONSTRAINT","Drop the UNIQUE constraint from the statement and enforce uniqueness in application logic","Verify connector capabilities before issuing constraint DDL"],"exampleFix":"// before\nALTER TABLE hive.default.users ADD CONSTRAINT uq_email UNIQUE (email);\n// after -- on a connector supporting constraints (e.g. Iceberg with enforcement)\nALTER TABLE iceberg.db.users ADD CONSTRAINT uq_email UNIQUE (email);","handlingStrategy":"validation","validationCode":"if (!metadata.getConnectorCapabilities(session, connectorId).contains(ConnectorCapability.UNIQUE_CONSTRAINT)) {\n    throw new SemanticException(NOT_SUPPORTED, node, \"Catalog %s does not support Unique constraints\", connectorId.getCatalogName());\n}","typeGuard":"boolean supportsUnique(Metadata metadata, Session session, ConnectorId id) {\n    return metadata.getConnectorCapabilities(session, id).contains(ConnectorCapability.UNIQUE_CONSTRAINT);\n}","tryCatchPattern":"try {\n    executeAddConstraint(statement);\n} catch (SemanticException e) {\n    if (e.getCode() == NOT_SUPPORTED && e.getMessage().contains(\"Unique constraints\")) {\n        log.warn(\"Skipping UNIQUE constraint; connector does not support it\");\n    } else throw e;\n}","preventionTips":["Check ConnectorCapability.UNIQUE_CONSTRAINT before constraint DDL","Keep constraint DDL in connector-specific migration scripts","Document which catalogs in your deployment support table constraints"],"tags":["presto","ddl","unique-constraint","connector-capability"],"backgroundTag":"connector-capability-not-supported","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"}