This is an automated email from the ASF dual-hosted git repository.
englefly pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 574a278e3ed [fix](Nereids) adjust min/max stats for cast function if
types are comparable (#28166) (#38458)
574a278e3ed is described below
commit 574a278e3eda222f16e4b78415b351e055ff6c30
Author: minghong <[email protected]>
AuthorDate: Tue Jul 30 07:18:39 2024 +0800
[fix](Nereids) adjust min/max stats for cast function if types are
comparable (#28166) (#38458)
pick from #28166
estimate column stats for "cast(col, XXXType)"
-----cast-est------
query4 41169 40335 40267 40267
query58 463 361 401 361
Total cold run time: 41632 ms
Total hot run time: 40628 ms
----master------
query4 40624 40180 40299 40180
query58 487 389 420 389
Total cold run time: 41111 ms
Total hot run time: 40569 ms
## Proposed changes
Issue Number: close #xxx
<!--Describe your changes.-->
---
.../org/apache/doris/analysis/DecimalLiteral.java | 2 +-
.../org/apache/doris/analysis/FloatLiteral.java | 2 +-
.../java/org/apache/doris/analysis/IntLiteral.java | 2 +-
.../org/apache/doris/analysis/LargeIntLiteral.java | 2 +-
.../NumericLiteralExpr.java} | 29 +++++++---------------
.../doris/nereids/stats/ExpressionEstimation.java | 13 ++--------
.../trees/expressions/literal/DecimalLiteral.java | 2 +-
.../expressions/literal/DecimalV3Literal.java | 2 +-
.../trees/expressions/literal/DoubleLiteral.java | 2 +-
.../trees/expressions/literal/FloatLiteral.java | 2 +-
...egerLikeLiteral.java => FractionalLiteral.java} | 20 +++++----------
.../expressions/literal/IntegerLikeLiteral.java | 2 +-
...IntegerLikeLiteral.java => NumericLiteral.java} | 20 +++++----------
.../doris/nereids/stats/FilterEstimationTest.java | 4 ++-
14 files changed, 35 insertions(+), 69 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
index afbe6c0c6cd..2d70117a1a4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
@@ -41,7 +41,7 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Objects;
-public class DecimalLiteral extends LiteralExpr {
+public class DecimalLiteral extends NumericLiteralExpr {
private static final Logger LOG =
LogManager.getLogger(DecimalLiteral.class);
private BigDecimal value;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
index 2eabd21c01f..a64e5d9050b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
@@ -35,7 +35,7 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.text.NumberFormat;
-public class FloatLiteral extends LiteralExpr {
+public class FloatLiteral extends NumericLiteralExpr {
private double value;
public FloatLiteral() {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
index 25f8ab753b2..476d63c982f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
@@ -38,7 +38,7 @@ import java.math.BigDecimal;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-public class IntLiteral extends LiteralExpr {
+public class IntLiteral extends NumericLiteralExpr {
private static final Logger LOG = LogManager.getLogger(IntLiteral.class);
public static final long TINY_INT_MIN = Byte.MIN_VALUE; // -2^7 ~ 2^7 - 1
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
index c72889b94b2..ff46e2d7952 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
@@ -38,7 +38,7 @@ import java.nio.ByteOrder;
import java.util.Objects;
// large int for the num that native types can not
-public class LargeIntLiteral extends LiteralExpr {
+public class LargeIntLiteral extends NumericLiteralExpr {
private static final Logger LOG =
LogManager.getLogger(LargeIntLiteral.class);
// -2^127
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/NumericLiteralExpr.java
similarity index 59%
copy from
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
copy to
fe/fe-core/src/main/java/org/apache/doris/analysis/NumericLiteralExpr.java
index 9f8a08a00f5..31cde22078f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/NumericLiteralExpr.java
@@ -14,29 +14,18 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
+// This file is copied from
+//
https://github.com/apache/impala/blob/branch-2.9.0/fe/src/main/java/org/apache/impala/LiteralExpr.java
+// and modified by Doris
-package org.apache.doris.nereids.trees.expressions.literal;
+package org.apache.doris.analysis;
-import org.apache.doris.nereids.types.DataType;
-
-/** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
- /**
- * Constructor for Literal.
- *
- * @param dataType logical data type in Nereids
- */
- public IntegerLikeLiteral(DataType dataType) {
- super(dataType);
- }
-
- public int getIntValue() {
- return getNumber().intValue();
+public abstract class NumericLiteralExpr extends LiteralExpr {
+ public NumericLiteralExpr() {
+ super();
}
- public long getLongValue() {
- return getNumber().longValue();
+ public NumericLiteralExpr(NumericLiteralExpr other) {
+ super(other);
}
-
- public abstract Number getNumber();
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
index 8972a26b032..8d137ca8210 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
@@ -18,11 +18,7 @@
package org.apache.doris.nereids.stats;
import org.apache.doris.analysis.ArithmeticExpr.Operator;
-import org.apache.doris.analysis.DecimalLiteral;
-import org.apache.doris.analysis.FloatLiteral;
-import org.apache.doris.analysis.IntLiteral;
-import org.apache.doris.analysis.LargeIntLiteral;
-import org.apache.doris.analysis.LiteralExpr;
+import org.apache.doris.analysis.NumericLiteralExpr;
import org.apache.doris.analysis.StringLiteral;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.Add;
@@ -224,7 +220,7 @@ public class ExpressionEstimation extends
ExpressionVisitor<ColumnStatistic, Sta
}
}
// cast numeric to numeric
- if (isNumericLiteralExpr(colStats.minExpr) &&
isNumericLiteralExpr(colStats.maxExpr)) {
+ if (colStats.minExpr instanceof NumericLiteralExpr && colStats.maxExpr
instanceof NumericLiteralExpr) {
if (targetType.isNumericType()) {
return colStats;
}
@@ -237,11 +233,6 @@ public class ExpressionEstimation extends
ExpressionVisitor<ColumnStatistic, Sta
return builder.build();
}
- private boolean isNumericLiteralExpr(LiteralExpr literal) {
- return literal instanceof DecimalLiteral || literal instanceof
FloatLiteral
- || literal instanceof IntLiteral || literal instanceof
LargeIntLiteral;
- }
-
@Override
public ColumnStatistic visitLiteral(Literal literal, Statistics context) {
if
(ColumnStatistic.UNSUPPORTED_TYPE.contains(literal.getDataType().toCatalogDataType()))
{
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
index 1d0281796ba..ea198d947ae 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
@@ -31,7 +31,7 @@ import java.util.Objects;
/**
* decimal type literal
*/
-public class DecimalLiteral extends Literal {
+public class DecimalLiteral extends FractionalLiteral {
private final BigDecimal value;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
index a7c9813fe5d..ce805273405 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
@@ -31,7 +31,7 @@ import java.util.Objects;
/**
* Literal for DecimalV3 Type
*/
-public class DecimalV3Literal extends Literal {
+public class DecimalV3Literal extends FractionalLiteral {
private final BigDecimal value;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
index 92c0172ec49..33e9397f287 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DoubleLiteral.java
@@ -28,7 +28,7 @@ import java.text.NumberFormat;
/**
* Double literal
*/
-public class DoubleLiteral extends Literal {
+public class DoubleLiteral extends FractionalLiteral {
private final double value;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
index f593743676d..c8150e56a02 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FloatLiteral.java
@@ -27,7 +27,7 @@ import java.text.NumberFormat;
/**
* float type literal
*/
-public class FloatLiteral extends Literal {
+public class FloatLiteral extends FractionalLiteral {
private final float value;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FractionalLiteral.java
similarity index 73%
copy from
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
copy to
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FractionalLiteral.java
index 9f8a08a00f5..ac63225dc3b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/FractionalLiteral.java
@@ -19,24 +19,16 @@ package org.apache.doris.nereids.trees.expressions.literal;
import org.apache.doris.nereids.types.DataType;
-/** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
+/**
+ * float/double/decimal
+ */
+public abstract class FractionalLiteral extends NumericLiteral {
/**
- * Constructor for Literal.
+ * Constructor for FractionalLiteral.
*
* @param dataType logical data type in Nereids
*/
- public IntegerLikeLiteral(DataType dataType) {
+ public FractionalLiteral(DataType dataType) {
super(dataType);
}
-
- public int getIntValue() {
- return getNumber().intValue();
- }
-
- public long getLongValue() {
- return getNumber().longValue();
- }
-
- public abstract Number getNumber();
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
index 9f8a08a00f5..54456bd9493 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
@@ -20,7 +20,7 @@ package org.apache.doris.nereids.trees.expressions.literal;
import org.apache.doris.nereids.types.DataType;
/** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
+public abstract class IntegerLikeLiteral extends NumericLiteral {
/**
* Constructor for Literal.
*
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java
similarity index 73%
copy from
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
copy to
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java
index 9f8a08a00f5..93b03e4fafa 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/IntegerLikeLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/NumericLiteral.java
@@ -19,24 +19,16 @@ package org.apache.doris.nereids.trees.expressions.literal;
import org.apache.doris.nereids.types.DataType;
-/** IntegralLiteral */
-public abstract class IntegerLikeLiteral extends Literal {
+/**
+ * numeric literal
+ */
+public abstract class NumericLiteral extends Literal {
/**
- * Constructor for Literal.
+ * Constructor for NumericLiteral.
*
* @param dataType logical data type in Nereids
*/
- public IntegerLikeLiteral(DataType dataType) {
+ public NumericLiteral(DataType dataType) {
super(dataType);
}
-
- public int getIntValue() {
- return getNumber().intValue();
- }
-
- public long getLongValue() {
- return getNumber().longValue();
- }
-
- public abstract Number getNumber();
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
index de5e4bba877..d0f6b3da077 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java
@@ -842,7 +842,9 @@ class FilterEstimationTest {
.setNdv(100)
.setAvgSizeByte(4)
.setNumNulls(0)
+ .setMaxExpr(new IntLiteral(100))
.setMaxValue(100)
+ .setMinExpr(new IntLiteral(0))
.setMinValue(0)
.setMaxExpr(new IntLiteral(100))
.setMinExpr(new IntLiteral(0))
@@ -856,7 +858,7 @@ class FilterEstimationTest {
stats.addColumnStats(a, builder.build());
FilterEstimation filterEstimation = new FilterEstimation();
Statistics result = filterEstimation.estimate(and, stats);
- Assertions.assertEquals(result.getRowCount(), 10, 0.01);
+ Assertions.assertEquals(10, result.getRowCount(), 0.01);
ColumnStatistic colStats = result.findColumnStatistics(a);
Assertions.assertTrue(colStats != null);
Assertions.assertEquals(10, colStats.ndv, 0.1);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]