This is an automated email from the ASF dual-hosted git repository.

snuyanzin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 97da071c998 [FLINK-37845][table] Remove `FlinkRexBuilder#makeIn`
97da071c998 is described below

commit 97da071c9986d06d5b015e15ab7a1dbdf09e146c
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Mon May 26 22:25:28 2025 +0200

    [FLINK-37845][table] Remove `FlinkRexBuilder#makeIn`
---
 .../table/planner/calcite/FlinkRexBuilder.java     | 130 ---------------------
 .../rules/logical/ConvertToNotInOrInRuleTest.xml   |   2 +-
 2 files changed, 1 insertion(+), 131 deletions(-)

diff --git 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkRexBuilder.java
 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkRexBuilder.java
index cd0c571f21b..31b14c6e235 100644
--- 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkRexBuilder.java
+++ 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/calcite/FlinkRexBuilder.java
@@ -18,26 +18,12 @@
 
 package org.apache.flink.table.planner.calcite;
 
-import org.apache.flink.shaded.guava33.com.google.common.collect.ImmutableList;
-
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rex.RexBuilder;
-import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.runtime.FlatLists;
-import org.apache.calcite.sql.fun.SqlStdOperatorTable;
-import org.apache.calcite.sql.type.SqlTypeUtil;
-import org.apache.calcite.tools.RelBuilder;
-import org.apache.calcite.util.Sarg;
 import org.apache.calcite.util.TimestampString;
-import org.apache.calcite.util.Util;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
 
 /** A slim extension over a {@link RexBuilder}. See the overridden methods for 
more explanation. */
 public final class FlinkRexBuilder extends RexBuilder {
@@ -110,120 +96,4 @@ public final class FlinkRexBuilder extends RexBuilder {
                 return super.makeZeroLiteral(type);
         }
     }
-
-    /**
-     * Convert the conditions into the {@code IN} and fix [CALCITE-4888]: 
Unexpected {@link RexNode}
-     * when call {@link RelBuilder#in} to create an {@code IN} predicate with 
a list of varchar
-     * literals which have different length in {@link RexBuilder#makeIn}.
-     *
-     * <p>The bug is because the origin implementation doesn't take {@link
-     * FlinkTypeSystem#shouldConvertRaggedUnionTypesToVarying} into 
consideration. When this is
-     * true, the behaviour should not padding char. Please see
-     * https://issues.apache.org/jira/browse/CALCITE-4590 and
-     * https://issues.apache.org/jira/browse/CALCITE-2321. Please refer to 
{@code
-     * org.apache.calcite.rex.RexSimplify.RexSargBuilder#getType} for the 
correct behaviour.
-     *
-     * <p>Once CALCITE-4888 is fixed, this method (and related methods) should 
be removed.
-     */
-    @Override
-    @SuppressWarnings("unchecked")
-    public RexNode makeIn(RexNode arg, List<? extends RexNode> ranges) {
-        if (areAssignable(arg, ranges)) {
-            // Fix calcite doesn't check literal whether is NULL here
-            List<RexNode> rangeWithoutNull = new ArrayList<>();
-            boolean containsNull = false;
-            for (RexNode node : ranges) {
-                if (isNull(node)) {
-                    containsNull = true;
-                } else {
-                    rangeWithoutNull.add(node);
-                }
-            }
-            final Sarg sarg = toSarg(Comparable.class, rangeWithoutNull, 
containsNull);
-            if (sarg != null) {
-                List<RelDataType> distinctTypes =
-                        Util.distinctList(
-                                
ranges.stream().map(RexNode::getType).collect(Collectors.toList()));
-                RelDataType commonType = 
getTypeFactory().leastRestrictive(distinctTypes);
-                return makeCall(
-                        SqlStdOperatorTable.SEARCH,
-                        arg,
-                        makeSearchArgumentLiteral(sarg, commonType));
-            }
-        }
-        return RexUtil.composeDisjunction(
-                this,
-                ranges.stream()
-                        .map(r -> makeCall(SqlStdOperatorTable.EQUALS, arg, r))
-                        .collect(Util.toImmutableList()));
-    }
-
-    private boolean isNull(RexNode node) {
-        if (node instanceof RexLiteral) {
-            return ((RexLiteral) node).isNull();
-        }
-        return false;
-    }
-
-    /** Copied from the {@link RexBuilder} to fix the {@link 
RexBuilder#makeIn}. */
-    private boolean areAssignable(RexNode arg, List<? extends RexNode> bounds) 
{
-        for (RexNode bound : bounds) {
-            if (!SqlTypeUtil.inSameFamily(arg.getType(), bound.getType())
-                    && !(arg.getType().isStruct() && 
bound.getType().isStruct())) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Converts a list of expressions to a search argument, or returns null if 
not possible.
-     *
-     * <p>Copied from the {@link RexBuilder} to fix the {@link 
RexBuilder#makeIn}.
-     */
-    @SuppressWarnings("UnstableApiUsage")
-    private static <C extends Comparable<C>> Sarg<C> toSarg(
-            Class<C> clazz, List<? extends RexNode> ranges, boolean 
containsNull) {
-        if (ranges.isEmpty()) {
-            // Cannot convert an empty list to a Sarg (by this interface, at 
least)
-            // because we use the type of the first element.
-            return null;
-        }
-        final com.google.common.collect.RangeSet<C> rangeSet =
-                com.google.common.collect.TreeRangeSet.create();
-        for (RexNode range : ranges) {
-            final C value = toComparable(clazz, range);
-            if (value == null) {
-                return null;
-            }
-            rangeSet.add(com.google.common.collect.Range.singleton(value));
-        }
-        return Sarg.of(containsNull, rangeSet);
-    }
-
-    /** Copied from the {@link RexBuilder} to fix the {@link 
RexBuilder#makeIn}. */
-    @SuppressWarnings("rawtypes")
-    private static <C extends Comparable<C>> C toComparable(Class<C> clazz, 
RexNode point) {
-        switch (point.getKind()) {
-            case LITERAL:
-                final RexLiteral literal = (RexLiteral) point;
-                return literal.getValueAs(clazz);
-
-            case ROW:
-                final RexCall call = (RexCall) point;
-                final ImmutableList.Builder<Comparable> b = 
ImmutableList.builder();
-                for (RexNode operand : call.operands) {
-                    //noinspection unchecked
-                    final Comparable value = toComparable(Comparable.class, 
operand);
-                    if (value == null) {
-                        return null; // not a constant value
-                    }
-                    b.add(value);
-                }
-                return clazz.cast(FlatLists.ofComparable(b.build()));
-
-            default:
-                return null; // not a constant value
-        }
-    }
 }
diff --git 
a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/logical/ConvertToNotInOrInRuleTest.xml
 
b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/logical/ConvertToNotInOrInRuleTest.xml
index ead65f5a84e..39db39232df 100644
--- 
a/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/logical/ConvertToNotInOrInRuleTest.xml
+++ 
b/flink-table/flink-table-planner/src/test/resources/org/apache/flink/table/planner/plan/rules/logical/ConvertToNotInOrInRuleTest.xml
@@ -497,7 +497,7 @@ LogicalProject(a=[$0], b=[$1], c=[$2], d=[$3], e=[$4])
     <Resource name="optimized rel plan">
       <![CDATA[
 LogicalProject(a=[$0], b=[$1], c=[$2], d=[$3], e=[$4])
-+- LogicalFilter(condition=[SEARCH($4, Sarg[_UTF-16LE'HELLO 
WORLD!':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 
_UTF-16LE'a':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 
_UTF-16LE'b':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 
_UTF-16LE'c':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 
_UTF-16LE'd':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 
_UTF-16LE'e':VARCHAR(2147483647) CHARACTER SET "UTF-16LE", 
_UTF-16LE'f':VARCHAR(2147483647) CHARACTER SET "UTF-16LE"; NULL AS 
TRUE]:VARCHAR(21 [...]
++- LogicalFilter(condition=[OR(=($4, _UTF-16LE'a'), =($4, _UTF-16LE'b'), =($4, 
_UTF-16LE'c'), =($4, _UTF-16LE'd'), =($4, _UTF-16LE'e'), =($4, _UTF-16LE'f'), 
=($4, null), =($4, _UTF-16LE'HELLO WORLD!'))])
    +- LogicalTableScan(table=[[default_catalog, default_database, MyTable]])
 ]]>
     </Resource>

Reply via email to