From 80d2e6f4c1815017e467ceb61344be9d3e581350 Mon Sep 17 00:00:00 2001 From: minghong Date: Fri, 24 Mar 2023 21:37:06 +0800 Subject: [PATCH] [fix](nereids) should not assign stats after cast on the original slot (#18061) select * from T where A = 10.0 suppose A is int column after stats derive on `cast(A as double) = 10.0`, we set column stats for `cast(A as double)` on `A` --- .../doris/nereids/stats/FilterEstimation.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java index e58f06105e..f2904d38af 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java @@ -20,6 +20,7 @@ package org.apache.doris.nereids.stats; import org.apache.doris.nereids.stats.FilterEstimation.EstimationContext; import org.apache.doris.nereids.trees.TreeNode; import org.apache.doris.nereids.trees.expressions.And; +import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.ComparisonPredicate; import org.apache.doris.nereids.trees.expressions.CompoundPredicate; import org.apache.doris.nereids.trees.expressions.EqualTo; @@ -210,25 +211,14 @@ public class FilterEstimation extends ExpressionVisitor leftSlots = cp.left().getInputSlots(); - Preconditions.checkArgument(leftSlots.size() <= 1, - "stats derive: equal condition only support at one column, but we meet " - + leftSlots.size() - ); Statistics equalStats = context.statistics.withSel(selectivity); - /* - leftSlots could be empty, for example: - select * from (select 'jj' as kk1, sum(k2) from ${tableName2} where k10 = '2015-04-02' group by kk1)tt - where kk1 in ('jj') - kk1 in ('jj') => kk1 = 'jj' => 'jj'='jj - TODO const fold could eliminate this equalTo. - */ - if (!leftSlots.isEmpty()) { - Slot leftSlot = leftSlots.iterator().next(); + Expression left = cp.left(); + if (left instanceof Cast) { + left = ((Cast) left).child(); + } + if (left instanceof SlotReference) { + Slot leftSlot = (SlotReference) left; //update min/max of cp.left ColumnStatistic columnStats = equalStats.findColumnStatistics(leftSlot); ColumnStatisticBuilder colStatsBuilder = new ColumnStatisticBuilder(columnStats);