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 <[email protected]>
AuthorDate: Thu Oct 26 13:41:13 2023 +0100
[CALCITE-5949] RexExecutable should return unchanged original expressions
when it fails
Co-authored-by: arkanovicz <[email protected]>
---
.../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));
+ });
+ }
}