[fix] (nereids) fix Match Expreesion in filter estimation (#39050) (#39215)

## Proposed changes

pick from master #39050
This commit is contained in:
Sun Chenyang
2024-08-13 10:57:53 +08:00
committed by GitHub
parent 60eeec3754
commit 228f78b80d
3 changed files with 83 additions and 1 deletions

View File

@ -34,6 +34,7 @@ import org.apache.doris.nereids.trees.expressions.IsNull;
import org.apache.doris.nereids.trees.expressions.LessThan;
import org.apache.doris.nereids.trees.expressions.LessThanEqual;
import org.apache.doris.nereids.trees.expressions.Like;
import org.apache.doris.nereids.trees.expressions.Match;
import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
import org.apache.doris.nereids.trees.expressions.Or;
@ -54,6 +55,8 @@ import org.apache.doris.statistics.StatisticsBuilder;
import com.google.common.base.Preconditions;
import com.google.common.collect.Sets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.List;
@ -74,6 +77,7 @@ public class FilterEstimation extends ExpressionVisitor<Statistics, EstimationCo
public static final double DEFAULT_LIKE_COMPARISON_SELECTIVITY = 0.2;
public static final double DEFAULT_ISNULL_SELECTIVITY = 0.005;
private static final Logger LOG = LoggerFactory.getLogger(FilterEstimation.class);
private Set<Slot> aggSlots;
private boolean isOnBaseTable = false;
@ -486,7 +490,8 @@ public class FilterEstimation extends ExpressionVisitor<Statistics, EstimationCo
child instanceof EqualPredicate
|| child instanceof InPredicate
|| child instanceof IsNull
|| child instanceof Like,
|| child instanceof Like
|| child instanceof Match,
"Not-predicate meet unexpected child: %s", child.toSql());
if (child instanceof Like) {
rowCount = context.statistics.getRowCount() - childStats.getRowCount();
@ -509,6 +514,9 @@ public class FilterEstimation extends ExpressionVisitor<Statistics, EstimationCo
.setMinExpr(originColStats.minExpr)
.setMaxValue(originColStats.maxValue)
.setMaxExpr(originColStats.maxExpr);
} else if (child instanceof Match) {
rowCount = context.statistics.getRowCount() - childStats.getRowCount();
colBuilder.setNdv(Math.max(1.0, originColStats.ndv - childColStats.ndv));
}
if (not.child().getInputSlots().size() == 1 && !(child instanceof IsNull)) {
// only consider the single column numNull, otherwise, ignore