{"record":{"id":"872a20f6f11b5e51","repo":"apache/cassandra","slug":"cannot-use-aliases-when-defining-a-materialized-vi","errorCode":null,"errorMessage":"Cannot use aliases when defining a materialized view (got %s)","messagePattern":"Cannot use aliases when defining a materialized view \\(got (.+?)\\)","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java","lineNumber":215,"sourceCode":"\n        if (table.params.pendingDrop)\n            throw ire(\"Cannot create materialized view '%s' for base table \" +\n                      \"'%s' as it is being dropped.\",\n                      viewName, tableName);\n\n        /*\n         * Process SELECT clause\n         */\n\n        Set<ColumnIdentifier> selectedColumns = new HashSet<>();\n\n        if (rawColumns.isEmpty()) // SELECT *\n            table.columns().forEach(c -> selectedColumns.add(c.name));\n\n        rawColumns.forEach(selector ->\n        {\n            if (null != selector.alias)\n                throw ire(\"Cannot use aliases when defining a materialized view (got %s)\", selector);\n\n            if (!(selector.selectable instanceof Selectable.RawIdentifier))\n                throw ire(\"Can only select columns by name when defining a materialized view (got %s)\", selector.selectable);\n\n            // will throw IRE if the column doesn't exist in the base table\n            Selectable.RawIdentifier rawIdentifier = (Selectable.RawIdentifier) selector.selectable;\n            ColumnMetadata column = rawIdentifier.columnMetadata(table);\n\n            selectedColumns.add(column.name);\n        });\n\n        selectedColumns.stream()\n                       .map(table::getColumn)\n                       .filter(ColumnMetadata::isStatic)\n                       .findAny()\n                       .ifPresent(c -> { throw ire(\"Cannot include static column '%s' in materialized view '%s'\", c, viewName); });\n\n        /*","sourceCodeStart":197,"sourceCodeEnd":233,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java#L197-L233","documentation":"Materialized view SELECT clauses may only project raw column names; column aliases (SELECT col AS something) are not supported because view columns must map 1:1 to base table columns. The statement throws when any selector has a non-null alias.","triggerScenarios":"CREATE MATERIALIZED VIEW ... AS SELECT pk AS new_name, ... FROM base ...;","commonSituations":"Users copy SQL view habits of renaming columns; code generators that alias every projection; pasting SELECT lists from analytics queries.","solutions":["Remove the AS alias so the selector is the bare column name","Keep base table column names in the view; rename only via a new base table maintained by the application"],"exampleFix":"// before\nCREATE MATERIALIZED VIEW mv AS SELECT id AS user_id, ts FROM base WHERE id IS NOT NULL;\n// after\nCREATE MATERIALIZED VIEW mv AS SELECT id, ts FROM base WHERE id IS NOT NULL;","handlingStrategy":"validation","validationCode":"for (String col : selectColumns) if (col.toLowerCase().contains(\" as \")) throw new IllegalArgumentException(\"Aliases not allowed in MV select: \" + col);","typeGuard":null,"tryCatchPattern":"try { session.execute(createMvStmt); } catch (InvalidQueryException e) { if (e.getMessage().contains(\"Cannot use aliases\")) { /* strip aliases and retry */ } }","preventionTips":["Author MV SELECT lists as bare column names only","Add lint to DDL scripts rejecting 'AS' inside CREATE MATERIALIZED VIEW"],"tags":["cql","materialized-view","alias"],"backgroundTag":"invalid-argument-value","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}