From d6446a9f1b14daee3139979dfeaf3dcb946e575e Mon Sep 17 00:00:00 2001 From: "Mark S. Lewis" Date: Thu, 9 Jul 2026 14:23:19 +0100 Subject: [PATCH] fix: declare constants as final Some public static constants were not declared final, allowing them to be incorrectly modified runtime. This change adds the final modifier to these constants. Signed-off-by: Mark S. Lewis --- .../io/substrait/isthmus/AggregateFunctions.java | 10 +++++----- .../java/io/substrait/isthmus/TypeConverter.java | 2 +- .../isthmus/calcite/SubstraitOperatorTable.java | 2 +- .../substrait/isthmus/expression/CallConverters.java | 12 ++++++------ .../substrait/isthmus/sql/SubstraitSqlDialect.java | 4 ++-- .../substrait/isthmus/RelCopyOnWriteVisitorTest.java | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/isthmus/src/main/java/io/substrait/isthmus/AggregateFunctions.java b/isthmus/src/main/java/io/substrait/isthmus/AggregateFunctions.java index 0d5d5bf0e..8c2bcbc64 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/AggregateFunctions.java +++ b/isthmus/src/main/java/io/substrait/isthmus/AggregateFunctions.java @@ -21,19 +21,19 @@ public class AggregateFunctions { /** Substrait-specific MIN aggregate function (nullable return type). */ - public static SqlAggFunction MIN = new SubstraitSqlMinMaxAggFunction(SqlKind.MIN); + public static final SqlAggFunction MIN = new SubstraitSqlMinMaxAggFunction(SqlKind.MIN); /** Substrait-specific MAX aggregate function (nullable return type). */ - public static SqlAggFunction MAX = new SubstraitSqlMinMaxAggFunction(SqlKind.MAX); + public static final SqlAggFunction MAX = new SubstraitSqlMinMaxAggFunction(SqlKind.MAX); /** Substrait-specific AVG aggregate function (nullable return type). */ - public static SqlAggFunction AVG = new SubstraitAvgAggFunction(SqlKind.AVG); + public static final SqlAggFunction AVG = new SubstraitAvgAggFunction(SqlKind.AVG); /** Substrait-specific SUM aggregate function (nullable return type). */ - public static SqlAggFunction SUM = new SubstraitSumAggFunction(); + public static final SqlAggFunction SUM = new SubstraitSumAggFunction(); /** Substrait-specific SUM0 aggregate function (non-null BIGINT return type). */ - public static SqlAggFunction SUM0 = new SubstraitSumEmptyIsZeroAggFunction(); + public static final SqlAggFunction SUM0 = new SubstraitSumEmptyIsZeroAggFunction(); /** * Converts default Calcite aggregate functions to Substrait-specific variants when needed. diff --git a/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java b/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java index add54572d..3ba3e71a1 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java +++ b/isthmus/src/main/java/io/substrait/isthmus/TypeConverter.java @@ -40,7 +40,7 @@ public class TypeConverter { *

Both {@link UserTypeMapper#toSubstrait(RelDataType)} and {@link * UserTypeMapper#toCalcite(Type.UserDefined)} return {@code null} in this default configuration. */ - public static TypeConverter DEFAULT = + public static final TypeConverter DEFAULT = new TypeConverter( new UserTypeMapper() { @Nullable diff --git a/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java b/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java index c73baed7e..51d68197d 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java +++ b/isthmus/src/main/java/io/substrait/isthmus/calcite/SubstraitOperatorTable.java @@ -32,7 +32,7 @@ public class SubstraitOperatorTable implements SqlOperatorTable { /** Singleton instance of the Substrait operator table. */ - public static SubstraitOperatorTable INSTANCE = new SubstraitOperatorTable(); + public static final SubstraitOperatorTable INSTANCE = new SubstraitOperatorTable(); private static final SqlOperatorTable SUBSTRAIT_OPERATOR_TABLE = SqlOperatorTables.of( diff --git a/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java b/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java index a34b8f87e..4b00c15da 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java +++ b/isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java @@ -40,7 +40,7 @@ public class CallConverters { * * @see ExpressionCreator#cast(Type, Expression, Expression.FailureBehavior) */ - public static Function CAST = + public static final Function CAST = typeConverter -> (call, visitor) -> { Expression.FailureBehavior failureBehavior; @@ -78,7 +78,7 @@ public class CallConverters { *

When converting from Calcite to Substrait, this call converter extracts the stored {@link * Expression.UserDefinedLiteral}. */ - public static Function REINTERPRET = + public static final Function REINTERPRET = typeConverter -> (call, visitor) -> { if (call.getKind() != SqlKind.REINTERPRET) { @@ -136,7 +136,7 @@ else if (operand instanceof Expression.StructLiteral * *

Each literal's nullability is set to match its field type's nullability. */ - public static SimpleCallConverter ROW = + public static final SimpleCallConverter ROW = (call, visitor) -> { if (call.getKind() != SqlKind.ROW) { return null; @@ -189,7 +189,7 @@ else if (operand instanceof Expression.StructLiteral *

This converter assumes that operand expressions have already been converted by the provided * top-level visitor. */ - public static SimpleCallConverter CASE = + public static final SimpleCallConverter CASE = (call, visitor) -> { if (call.getKind() != SqlKind.CASE) { return null; @@ -225,7 +225,7 @@ else if (operand instanceof Expression.StructLiteral *

Returns a {@link SimpleCallConverter} that expands SEARCH calls using the provided {@link * RexBuilder} */ - public static Function CREATE_SEARCH_CONV = + public static final Function CREATE_SEARCH_CONV = (RexBuilder rexBuilder) -> (RexCall call, Function visitor) -> { if (call.getKind() != SqlKind.SEARCH) { @@ -247,7 +247,7 @@ else if (operand instanceof Expression.StructLiteral *

Matching is done on operator identity (these are niladic {@link SqlKind#OTHER_FUNCTION} * functions with no dedicated {@link SqlKind}). */ - public static SimpleCallConverter EXECUTION_CONTEXT_VARIABLE = + public static final SimpleCallConverter EXECUTION_CONTEXT_VARIABLE = (call, visitor) -> { if (call.getOperator() == SqlStdOperatorTable.CURRENT_TIMESTAMP) { return ExpressionCreator.currentTimestamp(call.getType().getPrecision()); diff --git a/isthmus/src/main/java/io/substrait/isthmus/sql/SubstraitSqlDialect.java b/isthmus/src/main/java/io/substrait/isthmus/sql/SubstraitSqlDialect.java index 23c8deedf..e4b19b4d0 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/sql/SubstraitSqlDialect.java +++ b/isthmus/src/main/java/io/substrait/isthmus/sql/SubstraitSqlDialect.java @@ -15,10 +15,10 @@ public class SubstraitSqlDialect extends SqlDialect { /** Default context for the Substrait SQL dialect. */ - public static SqlDialect.Context DEFAULT_CONTEXT = SqlDialect.EMPTY_CONTEXT; + public static final SqlDialect.Context DEFAULT_CONTEXT = SqlDialect.EMPTY_CONTEXT; /** Default instance of Substrait SQL dialect. */ - public static SqlDialect DEFAULT = new SubstraitSqlDialect(DEFAULT_CONTEXT); + public static final SqlDialect DEFAULT = new SubstraitSqlDialect(DEFAULT_CONTEXT); /** * Converts a Calcite {@link RelNode} to its SQL representation using the default dialect. diff --git a/isthmus/src/test/java/io/substrait/isthmus/RelCopyOnWriteVisitorTest.java b/isthmus/src/test/java/io/substrait/isthmus/RelCopyOnWriteVisitorTest.java index 5f3fc09db..d73b1299c 100644 --- a/isthmus/src/test/java/io/substrait/isthmus/RelCopyOnWriteVisitorTest.java +++ b/isthmus/src/test/java/io/substrait/isthmus/RelCopyOnWriteVisitorTest.java @@ -27,10 +27,10 @@ class RelCopyOnWriteVisitorTest extends PlanTestBase { - public static SimpleExtension.FunctionAnchor APPROX_COUNT_DISTINCT = + public static final SimpleExtension.FunctionAnchor APPROX_COUNT_DISTINCT = SimpleExtension.FunctionAnchor.of( "extension:io.substrait:functions_aggregate_approx", "approx_count_distinct:any"); - public static SimpleExtension.FunctionAnchor COUNT = + public static final SimpleExtension.FunctionAnchor COUNT = SimpleExtension.FunctionAnchor.of( "extension:io.substrait:functions_aggregate_generic", "count:any");