{"record":{"id":"c735c59bdbf7f091","repo":"prestodb/presto","slug":"not-supported-c735c5","errorCode":"NOT_SUPPORTED","errorMessage":"'%s' is a materialized view, and create tag is not supported","messagePattern":"'(.+?)' is a materialized view, and create tag is not supported","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/CreateTagTask.java","lineNumber":77,"sourceCode":"    @Override\n    public String getName()\n    {\n        return \"CREATE TAG\";\n    }\n\n    @Override\n    public ListenableFuture<?> execute(CreateTag 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> tableHandleOptional = metadata.getMetadataResolver(session).getTableHandle(tableName);\n\n        if (statement.isTableExists() && !tableHandleOptional.isPresent()) {\n            return immediateFuture(null);\n        }\n\n        Optional<MaterializedViewDefinition> optionalMaterializedView = metadata.getMetadataResolver(session).getMaterializedView(tableName);\n        if (optionalMaterializedView.isPresent()) {\n            throw new SemanticException(NOT_SUPPORTED, statement, \"'%s' is a materialized view, and create tag is not supported\", tableName);\n        }\n\n        getConnectorIdOrThrow(session, metadata, tableName.getCatalogName());\n        accessControl.checkCanCreateTag(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), tableName);\n\n        if (statement.isReplace() && statement.isIfNotExists()) {\n            throw new SemanticException(NOT_SUPPORTED, statement,\n                    \"Cannot specify both OR REPLACE and IF NOT EXISTS in CREATE TAG statement\");\n        }\n\n        Optional<ConnectorTableVersion> tableVersion = Optional.empty();\n\n        if (statement.getTableVersion().isPresent()) {\n            TableVersionExpression tableVersionExpr = statement.getTableVersion().get();\n            Expression stateExpr = tableVersionExpr.getStateExpression();\n            TableVersionExpression.TableVersionType tableVersionType = tableVersionExpr.getTableVersionType();\n            TableVersionExpression.TableVersionOperator tableVersionOperator = tableVersionExpr.getTableVersionOperator();\n","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/CreateTagTask.java#L59-L95","documentation":"CREATE TAG was executed against a name that resolves to a materialized view. Tags are only supported on tables, so CreateTagTask.execute checks getMaterializedView(tableName) and rejects with NOT_SUPPORTED before any connector work.","triggerScenarios":"CREATE TAG <mv_name> ... (or CREATE TAG IF EXISTS variant) where the qualified object name resolves to a materialized view definition via metadata.getMetadataResolver(session).","commonSituations":"Assuming tags work on all catalog objects; scripting tag creation over a list of names that includes materialized views; confusion between tables and materialized views in Iceberg-style catalogs.","solutions":["Target a base table with CREATE TAG instead of a materialized view.","Skip or filter materialized views out of any automated tagging script.","Use the materialized view's underlying table if tagging the source data is the goal."],"exampleFix":"// before\nCREATE TAG my_mv TAG 'v1'; -- my_mv is a materialized view\n// after\nCREATE TAG my_table TAG 'v1'; -- a real table","handlingStrategy":"validation","validationCode":"Optional<MaterializedViewDefinition> mv = metadata.getMetadataResolver(session).getMaterializedView(tableName);\nif (mv.isPresent()) {\n    throw new IllegalArgumentException(tableName + \" is a materialized view; tags are not supported\");\n}","typeGuard":"boolean isMaterializedView(Session s, Metadata m, QualifiedObjectName name) {\n    return m.getMetadataResolver(s).getMaterializedView(name).isPresent();\n}","tryCatchPattern":"try {\n    future = createTagTask.execute(statement, ...);\n} catch (SemanticException e) {\n    if (e.getCode() == NOT_SUPPORTED && e.getMessage().contains(\"materialized view\")) {\n        // retarget the CREATE TAG at the base table\n    }\n}","preventionTips":["Resolve object type (system metadata / information_schema) before scripting CREATE TAG.","Filter materialized views out of batch tagging jobs.","Document that tags apply to base tables only."],"tags":["presto","ddl","create-tag","materialized-view","not-supported"],"backgroundTag":"tag-on-materialized-view-unsupported","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"}