{"record":{"id":"9e74a0a05cf7e49c","repo":"prestodb/presto","slug":"not-supported-9e74a0","errorCode":"NOT_SUPPORTED","errorMessage":"'%s' is a materialized view, and drop column is not supported","messagePattern":"'(.+?)' is a materialized view, and drop column is not supported","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/DropColumnTask.java","lineNumber":65,"sourceCode":"    }\n\n    @Override\n    public ListenableFuture<?> execute(DropColumn statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector, String query)\n    {\n        QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getTable(), metadata);\n        Optional<TableHandle> tableHandleOptional = metadata.getMetadataResolver(session).getTableHandle(tableName);\n\n        if (!tableHandleOptional.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 drop column is not supported\", tableName);\n            }\n            return immediateFuture(null);\n        }\n\n        TableHandle tableHandle = tableHandleOptional.get();\n        Identifier columnIdentifier = statement.getColumn();\n        String column = metadata.normalizeIdentifier(session, tableName.getCatalogName(), columnIdentifier.getValue());\n\n        accessControl.checkCanDropColumn(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), tableName);\n\n        ColumnHandle columnHandle = metadata.getColumnHandles(session, tableHandle).get(column);\n        if (columnHandle == null) {\n            if (!statement.isColumnExists()) {\n                throw new SemanticException(MISSING_COLUMN, statement, \"Column '%s' does not exist\", column);\n            }\n            return immediateFuture(null);\n        }\n","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/DropColumnTask.java#L47-L83","documentation":"DropColumnTask.execute detects that the resolved object is a materialized view and refuses to drop columns from it, throwing SemanticException(NOT_SUPPORTED). Materialized views are derived definitions, so their columns cannot be altered with DROP COLUMN. Note the guard honors statement.isTableExists() (IF EXISTS), returning silently in that case.","triggerScenarios":"ALTER TABLE <mv_name> DROP COLUMN <col> where getMaterializedView(tableName) is present.","commonSituations":"Name shadowing between a table and a materialized view; scripts generated for tables reused against materialized views; assuming materialized views are mutable like tables in Iceberg/Delta connectors.","solutions":["Alter the columns of the base table the materialized view selects from, then refresh/recreate the view.","Drop and recreate the materialized view with the desired column set.","Verify the object type before altering (system.metadata.materialized_views or SHOW CREATE)."],"exampleFix":"// before\nALTER TABLE hive.default.sales_mv DROP COLUMN legacy_col; -- is a materialized view\n// after\nALTER TABLE hive.default.sales DROP COLUMN legacy_col;\n-- then recreate/refresh the materialized view","handlingStrategy":"validation","validationCode":"-- Detect materialized views before ALTER TABLE ... DROP COLUMN\nSELECT name FROM system.metadata.materialized_views\nWHERE catalog = 'hive' AND schema = 'default' AND name = 'sales_mv';","typeGuard":"function isTable(session, qname) {\n  const isMv = session.execute(\n    'SELECT count(*) FROM system.metadata.materialized_views WHERE catalog=? AND schema=? AND name=?',\n    [qname.catalog, qname.schema, qname.table]);\n  const isTbl = session.execute(\n    'SELECT count(*) FROM information_schema.tables WHERE table_catalog=? AND table_schema=? AND table_name=? AND table_type=\\'BASE TABLE\\'',\n    [qname.catalog, qname.schema, qname.table]);\n  return !isMv && isTbl;\n}","tryCatchPattern":"try {\n  session.execute(alterSql);\n} catch (e) {\n  if (/is a materialized view, and drop column is not supported/.test(e.message)) {\n    // recreate the materialized view with the desired columns instead\n  }\n  throw e;\n}","preventionTips":["Maintain a manifest of materialized views and exclude them from table-alteration scripts.","Use distinct naming conventions for materialized views.","Alter base tables and refresh materialized views rather than mutating them directly."],"tags":["presto","sql","materialized-view","not-supported","ddl"],"backgroundTag":"operation-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"}