diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticCalculator.java b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticCalculator.java index 130831fecaef7..4860a7ec9f14f 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticCalculator.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticCalculator.java @@ -613,6 +613,12 @@ private ColumnStatistic binaryExpressionCalculate(CallOperator callOperator, Col averageRowSize = Math.max(1, left.getAverageRowSize() - right.getAverageRowSize()); distinctValues = left.getDistinctValuesCount() * averageRowSize / left.getAverageRowSize(); break; + case FunctionSet.LIKE: + case FunctionSet.ILIKE: + minValue = 0; + maxValue = 1; + distinctValues = 2; + break; default: return ColumnStatistic.unknown(); } diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticsCalculatorTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticsCalculatorTest.java index 347ec9e7ef083..135c0b50b0125 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticsCalculatorTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/optimizer/statistics/ExpressionStatisticsCalculatorTest.java @@ -506,6 +506,18 @@ public void testBinaryFunctionCall() { columnStatistic = ExpressionStatisticCalculator.calculate(callOperator, builder.build()); Assert.assertEquals(-1, columnStatistic.getMinValue(), 0.001); Assert.assertEquals(1, columnStatistic.getMaxValue(), 0.001); + + callOperator = new CallOperator(FunctionSet.LIKE, Type.BOOLEAN, Lists.newArrayList(left, right)); + columnStatistic = ExpressionStatisticCalculator.calculate(callOperator, builder.build()); + Assert.assertEquals(0, columnStatistic.getMinValue(), 0.001); + Assert.assertEquals(1, columnStatistic.getMaxValue(), 0.001); + Assert.assertEquals(2, columnStatistic.getDistinctValuesCount(), 0.001); + + callOperator = new CallOperator(FunctionSet.ILIKE, Type.BOOLEAN, Lists.newArrayList(left, right)); + columnStatistic = ExpressionStatisticCalculator.calculate(callOperator, builder.build()); + Assert.assertEquals(0, columnStatistic.getMinValue(), 0.001); + Assert.assertEquals(1, columnStatistic.getMaxValue(), 0.001); + Assert.assertEquals(2, columnStatistic.getDistinctValuesCount(), 0.001); // test multiply/divide column rang is negative builder = Statistics.builder(); leftStatistic = new ColumnStatistic(-100, -10, 0, 0, 20);