This is an automated email from the ASF dual-hosted git repository. rubenql pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push: new 417a1b53ec [CALCITE-5949] RexExecutable should return unchanged original expressions when it fails 417a1b53ec is described below commit 417a1b53ec9fd6bd449601036535bdb323229059 Author: rubenada <rube...@gmail.com> AuthorDate: Thu Oct 26 13:41:13 2023 +0100 [CALCITE-5949] RexExecutable should return unchanged original expressions when it fails Co-authored-by: arkanovicz <cla...@renegat.net> --- .../java/org/apache/calcite/rex/RexExecutable.java | 6 +++++- .../org/apache/calcite/rex/RexExecutorTest.java | 24 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/rex/RexExecutable.java b/core/src/main/java/org/apache/calcite/rex/RexExecutable.java index cc8d787686..8828654c24 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexExecutable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexExecutable.java @@ -32,6 +32,7 @@ import java.io.Serializable; import java.io.StringReader; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -87,11 +88,14 @@ public class RexExecutable { values = new Object[constExps.size()]; } else { assert values.length == constExps.size(); + final List<RexNode> successfullyReduced = new ArrayList<>(constExps.size()); final List<@Nullable Object> valueList = Arrays.asList(values); for (Pair<RexNode, @Nullable Object> value : Pair.zip(constExps, valueList)) { - reducedValues.add( + successfullyReduced.add( rexBuilder.makeLiteral(value.right, value.left.getType(), true)); } + assert successfullyReduced.size() == constExps.size(); + reducedValues.addAll(successfullyReduced); } } catch (RuntimeException e) { // One or more of the expressions failed. diff --git a/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java b/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java index b1cb804175..74c51229f2 100644 --- a/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java +++ b/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java @@ -378,4 +378,28 @@ class RexExecutorTest { interface Action { void check(RexBuilder rexBuilder, RexExecutorImpl executor); } + + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-5949">[CALCITE-5949] + * RexExecutable should return unchanged original expressions when it fails</a>. + */ + @Test void testInvalidExpressionInList() { + check((rexBuilder, executor) -> { + final List<RexNode> reducedValues = new ArrayList<>(); + final RelDataTypeFactory typeFactory = rexBuilder.getTypeFactory(); + final RelDataType integer = + typeFactory.createSqlType(SqlTypeName.INTEGER); + final RexCall first = + (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.LN, + rexBuilder.makeLiteral(3, integer, true)); + final RexCall second = + (RexCall) rexBuilder.makeCall(SqlStdOperatorTable.LN, + rexBuilder.makeLiteral(-2, integer, true)); + executor.reduce(rexBuilder, ImmutableList.of(first, second), + reducedValues); + assertThat(reducedValues, hasSize(2)); + assertThat(reducedValues.get(0), instanceOf(RexCall.class)); + assertThat(reducedValues.get(1), instanceOf(RexCall.class)); + }); + } }