{"record":{"id":"993877fd0a887338","repo":"apache/cassandra","slug":"no-aggregation-functions-allowed-within-a-transact","errorCode":null,"errorMessage":"No aggregation functions allowed within a transaction; %s statement %s","messagePattern":"No aggregation functions allowed within a transaction; (.+?) statement (.+?)","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java","lineNumber":712,"sourceCode":"\n    private static void validate(SelectStatement.RawStatement select)\n    {\n        if (select.parameters.orderings != null && !select.parameters.orderings.isEmpty())\n            throw invalidRequest(NO_ORDER_BY_IN_TXNS_MESSAGE, \"SELECT\", select.source);\n        if (select.parameters.groups != null && !select.parameters.groups.isEmpty())\n            throw invalidRequest(NO_GROUP_BY_IN_TXNS_MESSAGE, \"SELECT\", select.source);\n    }\n\n    private static void validate(SelectStatement prepared)\n    {\n        if (!prepared.table.isAccordEnabled())\n            throw invalidRequest(TRANSACTIONS_DISABLED_ON_TABLE_MESSAGE, \"SELECT\", prepared.source);\n        if (prepared.table.params.pendingDrop)\n            throw invalidRequest(TRANSACTIONS_DISABLED_ON_TABLE_BEING_DROPPED_MESSAGE, \"SELECT\", prepared.source);\n        if (prepared.table.isCounter())\n            throw invalidRequest(NO_COUNTERS_IN_TXNS_MESSAGE, \"SELECT\", prepared.source);\n        if (prepared.hasAggregation())\n            throw invalidRequest(NO_AGGREGATION_IN_TXNS_MESSAGE, \"SELECT\", prepared.source);\n\n        // when \"LIMIT ?\" this check can't be performed, so need to do again once the options are known\n        if (prepared.getRestrictions().keyIsInRelation())\n            checkTrue(prepared.isLimitMarker() || prepared.getLimit(null) == DataLimits.NO_LIMIT, NO_PARTITION_IN_CLAUSE_WITH_LIMIT, \"SELECT\", prepared.source);\n    }\n\n    public static class Parsed extends QualifiedStatement.Composite\n    {\n        private final List<SelectStatement.RawStatement> assignments;\n        private final SelectStatement.RawStatement select;\n        private final List<RowDataReference.Raw> returning;\n        private final List<ModificationStatement.Parsed> updates;\n        private final List<ConditionStatement.Raw> conditions;\n        private final List<RowDataReference.Raw> dataReferences;\n\n        public Parsed(List<SelectStatement.RawStatement> assignments,\n                      SelectStatement.RawStatement select,\n                      List<RowDataReference.Raw> returning,","sourceCodeStart":694,"sourceCodeEnd":730,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java#L694-L730","documentation":"Aggregate functions (count, sum, avg, ...) are not permitted in SELECTs inside Accord transactions. TransactionStatement.validate(SelectStatement) calls prepared.hasAggregation() and rejects the statement.","triggerScenarios":"A SELECT in BEGIN TRANSACTION ... COMMIT uses an aggregate function like count(*), sum(col), or a user-defined aggregate.","commonSituations":"Porting reporting queries into a transaction expecting consistent aggregate reads.","solutions":["Remove aggregate functions from the in-transaction SELECT","Read raw rows in the transaction and compute aggregates in the application","Issue the aggregating query outside the transaction"],"exampleFix":"// before\nBEGIN TRANSACTION SELECT count(*) FROM t WHERE pk = 1; COMMIT;\n// after\nBEGIN TRANSACTION SELECT v FROM t WHERE pk = 1; COMMIT; // count client-side","handlingStrategy":"validation","validationCode":"java.util.regex.Pattern p = java.util.regex.Pattern.compile(\"\\\\b(count|sum|avg|min|max)\\\\s*\\\\(\", java.util.regex.Pattern.CASE_INSENSITIVE); if (p.matcher(query).find() && inTransaction) throw new IllegalArgumentException(\"aggregation not allowed in transaction\");","typeGuard":null,"tryCatchPattern":"try { session.execute(txnCql); } catch (InvalidRequestException e) { if (e.getMessage().contains(\"No aggregation functions allowed within a transaction\")) { /* compute aggregates client-side */ } else throw e; }","preventionTips":["Keep aggregations out of BEGIN TRANSACTION blocks","Compute aggregates in application code from raw row results","Add static CQL checks in CI"],"tags":["cql","accord","aggregation","validation"],"backgroundTag":"unsupported-operation","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"}