{"record":{"id":"4cfe90512fd1e1ba","repo":"prestodb/presto","slug":"not-supported-4cfe90","errorCode":"NOT_SUPPORTED","errorMessage":"'%s' is a materialized view, and alter column is not supported","messagePattern":"'(.+?)' is a materialized view, and alter column is not supported","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/SetColumnTypeTask.java","lineNumber":77,"sourceCode":"    {\n        return \"SET COLUMN TYPE\";\n    }\n\n    public ListenableFuture<Void> execute(SetColumnType 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(SemanticErrorCode.NOT_SUPPORTED, statement, \"'%s' is a materialized view, and alter column is not supported\", tableName);\n            }\n            return immediateFuture(null);\n        }\n\n        accessControl.checkCanAlterColumn(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), tableName);\n\n        TableHandle tableHandleOptional = tableHandle.get();\n        Map<String, ColumnHandle> columnHandles = metadata.getColumnHandles(session, tableHandleOptional);\n        ColumnHandle column = columnHandles.get(statement.getColumnName().getValue());\n        if (column == null) {\n            throw new SemanticException(MISSING_COLUMN, statement, \"Column '%s' does not exist\", statement.getColumnName());\n        }\n        metadata.setColumnType(session, tableHandleOptional, column, getColumnType(statement));\n\n        return immediateFuture(null);\n    }\n\n    private Type getColumnType(SetColumnType statement)","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/SetColumnTypeTask.java#L59-L95","documentation":"Changing a column's type is only supported on real tables. When the resolved name refers to a materialized view and IF EXISTS was not specified, Presto rejects the ALTER with NOT_SUPPORTED because altering materialized view columns is not implemented.","triggerScenarios":"ALTER TABLE <mv name> ALTER COLUMN ... SET DATA TYPE ... where getMaterializedView(tableName) returns a definition and statement.isTableExists() is false.","commonSituations":"Treating materialized views like tables in migration scripts; the object was replaced by a materialized view since the script was authored; schema drift between environments.","solutions":["Alter the column type on the underlying base table and let the materialized view refresh/recreate accordingly","Drop and recreate the materialized view with the corrected column type","Use IF EXISTS if the statement should skip non-table targets silently"],"exampleFix":"// before\nALTER TABLE hive.default.mv_sales ALTER COLUMN amount SET DATA TYPE DOUBLE;\n// after\nALTER TABLE hive.default.base_sales ALTER COLUMN amount SET DATA TYPE DOUBLE;","handlingStrategy":"validation","validationCode":"QualifiedObjectName name = createQualifiedObjectName(session, stmt, table, metadata);\nif (metadata.getMetadataResolver(session).getMaterializedView(name).isPresent()) {\n    throw new IllegalArgumentException(\"Cannot ALTER COLUMN on materialized view: \" + name);\n}","typeGuard":null,"tryCatchPattern":"try {\n    return task.execute(stmt, ...);\n} catch (SemanticException e) {\n    if (e.getCode() == SemanticErrorCode.NOT_SUPPORTED) {\n        // target the base table instead\n    } else {\n        throw e;\n    }\n}","preventionTips":["Resolve materialized views to their base tables before column type changes","Recreate materialized views when base column types change","Keep environment schemas in sync to avoid stale DDL targets"],"tags":["sql","materialized-view","alter-table","not-supported","type-change"],"backgroundTag":"operation-not-supported-on-view","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}