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 164ff0a27e [CALCITE-5967] UnsupportedOperationException while
implementing a call that requires a special collator
164ff0a27e is described below
commit 164ff0a27e243850d294908dc5cff90760d0a35a
Author: rubenada <[email protected]>
AuthorDate: Tue Aug 29 17:49:20 2023 +0100
[CALCITE-5967] UnsupportedOperationException while implementing a call that
requires a special collator
---
.../calcite/adapter/enumerable/RexImpTable.java | 6 ++++--
.../enumerable/EnumerableStringComparisonTest.java | 23 ++++++++++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
index 93203afe3c..91a7aed9b0 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
@@ -44,6 +44,7 @@ import org.apache.calcite.rex.RexInputRef;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.rex.RexPatternFieldRef;
+import org.apache.calcite.runtime.FlatLists;
import org.apache.calcite.runtime.SqlFunctions;
import org.apache.calcite.schema.FunctionContext;
import org.apache.calcite.schema.ImplementableAggFunction;
@@ -2865,7 +2866,7 @@ public class RexImpTable {
@Override Expression implementSafe(
final RexToLixTranslator translator,
final RexCall call,
- final List<Expression> argValueList) {
+ List<Expression> argValueList) {
// neither nullable:
// return x OP y
// x nullable
@@ -2892,7 +2893,8 @@ public class RexImpTable {
final Expression fieldComparator =
generateCollatorExpression(relDataType0.getCollation());
if (fieldComparator != null) {
- argValueList.add(fieldComparator);
+ // We need to add the comparator, the argValueList might be
non-mutable, so create a new one
+ argValueList = FlatLists.append(argValueList, fieldComparator);
}
final Primitive primitive = Primitive.ofBoxOr(type0);
diff --git
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
index fd12311b49..d7f40b4dc5 100644
---
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
+++
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java
@@ -137,6 +137,29 @@ class EnumerableStringComparisonTest {
"name=presales");
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5967">[CALCITE-5967]
+ * UnsupportedOperationException while implementing a call that requires a
special collator</a>.
+ */
+ @Test void testFilterStringSpecialCollation() {
+ tester()
+ .withRel(builder -> builder
+ .values(
+ createRecordVarcharSpecialCollation(builder),
+ "Legal", "presales", "hr", "Administration", "MARKETING")
+ // Filter on a field with special collation:
+ // a special comparator needs to be used inside the eq operation
+ .filter(
+ builder.equals(
+ builder.field(1, 0, "name"),
+ builder.literal("MARKETING")))
+ .build())
+ .explainHookMatches(""
+ + "EnumerableCalc(expr#0=[{inputs}], expr#1=['MARKETING'],
expr#2=[=($t0, $t1)], name=[$t0], $condition=[$t2])\n"
+ + " EnumerableValues(tuples=[[{ 'Legal' }, { 'presales' }, { 'hr'
}, { 'Administration' }, { 'MARKETING' }]])\n")
+ .returnsUnordered("name=MARKETING");
+ }
+
@Test void testMergeJoinOnStringSpecialCollation() {
tester()
.withHook(Hook.PLANNER, (Consumer<RelOptPlanner>) planner -> {