{"record":{"id":"9814b23f2e2f760c","repo":"apache/cassandra","slug":"modification-is-not-supported-by-table-metadat","errorCode":null,"errorMessage":"Modification is not supported by table \" + metadata","messagePattern":"Modification is not supported by table \" \\+ metadata","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/virtual/AbstractVirtualTable.java","lineNumber":130,"sourceCode":"\n            @Override\n            public boolean hasNext()\n            {\n                return iterator.hasNext();\n            }\n\n            @Override\n            public TableMetadata metadata()\n            {\n                return metadata;\n            }\n        };\n    }\n\n    @Override\n    public void apply(PartitionUpdate update)\n    {\n        throw new InvalidRequestException(\"Modification is not supported by table \" + metadata);\n    }\n\n    @Override\n    public void truncate()\n    {\n        throw new InvalidRequestException(\"Truncation is not supported by table \" + metadata);\n    }\n\n    @Override\n    public String toString()\n    {\n        return metadata().toString();\n    }\n\n    public interface DataSet\n    {\n        boolean isEmpty();\n        Partition getPartition(DecoratedKey partitionKey);","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/virtual/AbstractVirtualTable.java#L112-L148","documentation":"AbstractVirtualTable's default apply() implementation rejects all partition mutations. Virtual tables are read-only system views backed by in-memory data, so any INSERT/UPDATE/DELETE against them is invalid and rejected with InvalidRequestException at query preparation/execution time.","triggerScenarios":"Executing an INSERT, UPDATE, DELETE, or BATCH containing a modification against a virtual table (e.g. system_views.*, system.local virtual tables) whose table class does not override apply().","commonSituations":"Scripts or application code that assume virtual tables behave like normal tables; migration tooling trying to 'fix' rows in system_views or system_virtual_schema; automation that generates DML for any table returned by system_schema.","solutions":["Do not issue modifications against virtual tables; query them with SELECT only.","If the intent is to change configuration, find the corresponding nodetool command or JMX operation that mutates the underlying setting.","If implementing a custom virtual table that must accept writes, override apply(PartitionUpdate) in your AbstractVirtualTable subclass.","Filter virtual tables out of tooling by checking TableMetadata.VIRTUAL flag before generating DML."],"exampleFix":"// before\nsession.execute(\"UPDATE system_views.sessions SET timeout = 600 WHERE key = 'x'\");\n// after\n// virtual tables are read-only; mutate via nodetool/JMX instead\nsession.execute(\"SELECT * FROM system_views.sessions WHERE key = 'x'\");","handlingStrategy":"validation","validationCode":"boolean isVirtual = session.execute(\"SELECT * FROM system_schema.tables WHERE keyspace_name = ? AND table_name = ?\", ks, table).all().stream().noneMatch(r -> r.getBool(\"flags\").toString().contains(\"virtual\")) && ks.startsWith(\"system\");","typeGuard":"boolean isModifiable(TableMetadata m) { return !m.virtual; }","tryCatchPattern":"try { session.execute(update); } catch (com.datastax.driver.core.exceptions.InvalidQueryException e) { if (e.getMessage().contains(\"Modification is not supported\")) { /* reroute to admin operation */ } else throw e; }","preventionTips":["Treat all virtual/system views as read-only in application code","Check TableMetadata.VIRTUAL before generating DML in tooling","Use nodetool/JMX for configuration changes instead of DML on system tables"],"tags":["virtual-table","read-only","invalid-request","cassandra"],"backgroundTag":"unsupported-operation","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}