{"record":{"id":"c2913fddd38aeb0e","repo":"apache/cassandra","slug":"can-only-select-columns-by-name-when-defining-a-ma","errorCode":null,"errorMessage":"Can only select columns by name when defining a materialized view (got %s)","messagePattern":"Can only select columns by name 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":218,"sourceCode":"                      \"'%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        /*\n         * Process PRIMARY KEY columns and CLUSTERING ORDER BY clause\n         */\n","sourceCodeStart":200,"sourceCodeEnd":236,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java#L200-L236","documentation":"Each selected column in a materialized view must be a plain column identifier. Any computed selector (functions, casts, literals, writetime, ttl, etc.) is rejected because views can only mirror base columns.","triggerScenarios":"CREATE MATERIALIZED VIEW ... AS SELECT count(*), system.currentTimeUUID(), col+1, ... FROM base ...;","commonSituations":"Trying to build an 'aggregate view' (aggregations are not supported in MVs); generated SELECT lists containing expressions; porting SQL views with computed columns.","solutions":["Project only bare base-table column names in the view SELECT","Compute expressions in the application when reading from the view, or store precomputed values in a denormalized base table","For aggregation, use a separate analytics path (e.g. Spark) instead of MVs"],"exampleFix":"// before\nCREATE MATERIALIZED VIEW mv AS SELECT bucket, count(*) FROM base WHERE bucket IS NOT NULL ...;\n// after\nCREATE MATERIALIZED VIEW mv AS SELECT bucket, col1, col2 FROM base WHERE bucket IS NOT NULL AND col1 IS NOT NULL ...;","handlingStrategy":"validation","validationCode":"for (String col : selectColumns) if (!baseTableColumns.contains(col)) throw new IllegalArgumentException(\"MV selector must be a plain column: \" + col);","typeGuard":null,"tryCatchPattern":"try { session.execute(createMvStmt); } catch (InvalidQueryException e) { if (e.getMessage().contains(\"Can only select columns by name\")) { /* rewrite selectors as plain columns */ } }","preventionTips":["Never project functions, casts, or expressions in MV definitions","Treat MVs as row mirrors of the base table only; compute values elsewhere"],"tags":["cql","materialized-view","selector"],"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"}