From bfc4b0bb3656f6fe428f8681e8f245781aa10f72 Mon Sep 17 00:00:00 2001 From: Dmitry Konstantinov Date: Sun, 3 May 2026 18:23:02 +0100 Subject: [PATCH] Avoid allocation by getFunctions in SelectStatement.authorize Memorize the result of getFunctions in SelectStatement constructor patch by Dmitry Konstantinov; reviewed by Francisco Guerrero for CASSANDRA-21347 --- CHANGES.txt | 1 + .../cassandra/cql3/statements/SelectStatement.java | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index e98ef5851c..a61a5824ce 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 6.0-alpha2 + * Avoid allocation by getFunctions in SelectStatement.authorize (CASSANDRA-21347) * Avoid unit conversion in DatabaseDescriptor.getMaxValueSize() for every deserializing Cell (CASSANDRA-21295) * Fix single token batch atomicity with Accord/non-Accord batches by using the batch log (CASSANDRA-20588) * Avoid CompactionOptions parsing for every read by WithoutPurgeableTombstones (CASSANDRA-21294) diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 91361ae91c..9ef8a8ae4c 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -194,6 +194,8 @@ public class SelectStatement implements CQLStatement.SingleKeyspaceCqlStatement, */ private final ColumnComparator> orderingComparator; + private final List functions; + public final StatementSource source; // Used by forSelection below @@ -228,6 +230,7 @@ public class SelectStatement implements CQLStatement.SingleKeyspaceCqlStatement, this.perPartitionLimit = perPartitionLimit; this.source = source; this.selectOptions = selectOptions; + this.functions = findAllFunctions(); } @Override @@ -244,9 +247,19 @@ public class SelectStatement implements CQLStatement.SingleKeyspaceCqlStatement, @Override public Iterable getFunctions() + { + return functions; + } + + private List findAllFunctions() { List functions = new ArrayList<>(); addFunctionsTo(functions); + if (functions.isEmpty()) + { + functions = Collections.emptyList(); // to avoid a new Iterator object creation during each authorization + } + return functions; }