This is an automated email from the ASF dual-hosted git repository.
lihaopeng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new e933607 Revert "[improvement](planner) make BinaryPredicate do not
cast date to datetime/varchar (#7045)" (#7517)
e933607 is described below
commit e93360791f5bc9c06f609d0ddededa86ecc26d86
Author: Mingyu Chen <[email protected]>
AuthorDate: Tue Dec 28 23:05:27 2021 +0800
Revert "[improvement](planner) make BinaryPredicate do not cast date to
datetime/varchar (#7045)" (#7517)
---
be/src/exprs/bloomfilter_predicate.h | 7 ++-
.../org/apache/doris/analysis/BinaryPredicate.java | 63 ++++++++++++----------
.../main/java/org/apache/doris/catalog/Type.java | 33 +++++-------
.../org/apache/doris/planner/QueryPlanTest.java | 5 --
4 files changed, 52 insertions(+), 56 deletions(-)
diff --git a/be/src/exprs/bloomfilter_predicate.h
b/be/src/exprs/bloomfilter_predicate.h
index e807b52..e90f02d 100644
--- a/be/src/exprs/bloomfilter_predicate.h
+++ b/be/src/exprs/bloomfilter_predicate.h
@@ -223,10 +223,11 @@ struct DateTimeFindOp : public
CommonFindOp<DateTimeValue, BloomFilterAdaptor> {
}
};
+// avoid violating C/C++ aliasing rules.
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101684
+
template <class BloomFilterAdaptor>
struct DateFindOp : public CommonFindOp<DateTimeValue, BloomFilterAdaptor> {
- // avoid violating C/C++ aliasing rules.
- // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101684
bool find_olap_engine(const BloomFilterAdaptor& bloom_filter, const void*
data) const {
uint24_t date = *static_cast<const uint24_t*>(data);
uint64_t value = uint32_t(date);
@@ -243,8 +244,6 @@ struct DateFindOp : public CommonFindOp<DateTimeValue,
BloomFilterAdaptor> {
template <class BloomFilterAdaptor>
struct DecimalV2FindOp : public CommonFindOp<DecimalV2Value,
BloomFilterAdaptor> {
- // avoid violating C/C++ aliasing rules.
- // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101684
bool find_olap_engine(const BloomFilterAdaptor& bloom_filter, const void*
data) const {
auto packed_decimal = *static_cast<const decimal12_t*>(data);
DecimalV2Value value;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
index 517694d..f1c02e7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
@@ -265,7 +265,26 @@ public class BinaryPredicate extends Predicate implements
Writable {
LOG.debug(debugString() + " opcode: " + vectorOpcode);
}
+ private boolean canCompareDate(PrimitiveType t1, PrimitiveType t2) {
+ if (t1.isDateType()) {
+ if (t2.isDateType() || t2.isStringType() || t2.isIntegerType()) {
+ return true;
+ }
+ return false;
+ } else if (t2.isDateType()) {
+ if (t1.isStringType() || t1.isIntegerType()) {
+ return true;
+ }
+ return false;
+ } else {
+ return false;
+ }
+ }
+
private Type getCmpType() throws AnalysisException {
+ PrimitiveType t1 =
getChild(0).getType().getResultType().getPrimitiveType();
+ PrimitiveType t2 =
getChild(1).getType().getResultType().getPrimitiveType();
+
for (Expr e : getChildren()) {
if (e.getType().getPrimitiveType() == PrimitiveType.HLL) {
throw new AnalysisException("Hll type dose not support
operand: " + toSql());
@@ -275,39 +294,29 @@ public class BinaryPredicate extends Predicate implements
Writable {
}
}
- Type t1 = getChild(0).getType();
- Type t2 = getChild(1).getType();
-
- if (Type.canCompareDate(t1.getPrimitiveType(), t2.getPrimitiveType()))
{
- return Type.DATE;
- }
-
- if (Type.canCompareDatetime(t1.getPrimitiveType(),
t2.getPrimitiveType())) {
+ if (canCompareDate(getChild(0).getType().getPrimitiveType(),
getChild(1).getType().getPrimitiveType())) {
return Type.DATETIME;
}
- PrimitiveType t1ResultType = t1.getResultType().getPrimitiveType();
- PrimitiveType t2ResultType = t2.getResultType().getPrimitiveType();
-
// Following logical is compatible with MySQL:
- // Cast to DOUBLE by default, because DOUBLE has the largest range of
values.
- if (t1ResultType == PrimitiveType.VARCHAR && t2ResultType ==
PrimitiveType.VARCHAR) {
+ // Cast to DOUBLE by default, because DOUBLE has the largest range
of values.
+ if (t1 == PrimitiveType.VARCHAR && t2 == PrimitiveType.VARCHAR) {
return Type.VARCHAR;
}
- if (t1ResultType == PrimitiveType.STRING && t2ResultType ==
PrimitiveType.STRING
- || t1ResultType == PrimitiveType.STRING && t2ResultType ==
PrimitiveType.VARCHAR
- || t1ResultType == PrimitiveType.VARCHAR && t2ResultType ==
PrimitiveType.STRING) {
+ if (t1 == PrimitiveType.STRING && t2 == PrimitiveType.STRING
+ || t1 == PrimitiveType.STRING && t2 == PrimitiveType.VARCHAR
+ || t1 == PrimitiveType.VARCHAR && t2 == PrimitiveType.STRING) {
return Type.STRING;
}
- if (t1ResultType == PrimitiveType.BIGINT && t2ResultType ==
PrimitiveType.BIGINT) {
- return Type.getAssignmentCompatibleType(t1, t2, false);
+ if (t1 == PrimitiveType.BIGINT && t2 == PrimitiveType.BIGINT) {
+ return Type.getAssignmentCompatibleType(getChild(0).getType(),
getChild(1).getType(), false);
}
- if ((t1ResultType == PrimitiveType.BIGINT || t1ResultType ==
PrimitiveType.DECIMALV2)
- && (t2ResultType == PrimitiveType.BIGINT || t2ResultType ==
PrimitiveType.DECIMALV2)) {
+ if ((t1 == PrimitiveType.BIGINT || t1 == PrimitiveType.DECIMALV2)
+ && (t2 == PrimitiveType.BIGINT || t2 ==
PrimitiveType.DECIMALV2)) {
return Type.DECIMALV2;
}
- if ((t1ResultType == PrimitiveType.BIGINT || t1ResultType ==
PrimitiveType.LARGEINT)
- && (t2ResultType == PrimitiveType.BIGINT || t2ResultType ==
PrimitiveType.LARGEINT)) {
+ if ((t1 == PrimitiveType.BIGINT || t1 == PrimitiveType.LARGEINT)
+ && (t2 == PrimitiveType.BIGINT || t2 ==
PrimitiveType.LARGEINT)) {
return Type.LARGEINT;
}
@@ -318,19 +327,17 @@ public class BinaryPredicate extends Predicate implements
Writable {
// When int column compares with string, Mysql will convert string to
int.
// So it is also compatible with Mysql.
- if (t1ResultType == PrimitiveType.BIGINT
- && (t2ResultType == PrimitiveType.VARCHAR || t2ResultType ==
PrimitiveType.STRING)) {
+ if (t1 == PrimitiveType.BIGINT && (t2 == PrimitiveType.VARCHAR || t2
==PrimitiveType.STRING)) {
Expr rightChild = getChild(1);
Long parsedLong = Type.tryParseToLong(rightChild);
- if (parsedLong != null) {
+ if(parsedLong != null) {
return Type.BIGINT;
}
}
- if ((t1ResultType == PrimitiveType.VARCHAR || t1ResultType ==
PrimitiveType.STRING)
- && t2ResultType == PrimitiveType.BIGINT) {
+ if ((t1 == PrimitiveType.VARCHAR || t1 ==PrimitiveType.STRING) && t2
== PrimitiveType.BIGINT) {
Expr leftChild = getChild(0);
Long parsedLong = Type.tryParseToLong(leftChild);
- if (parsedLong != null) {
+ if(parsedLong != null) {
return Type.BIGINT;
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
index 3b3905f..7e2d2ab 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
@@ -1005,20 +1005,15 @@ public abstract class Type {
return t1;
}
+ PrimitiveType t1ResultType = t1.getResultType().getPrimitiveType();
+ PrimitiveType t2ResultType = t2.getResultType().getPrimitiveType();
if (canCompareDate(t1.getPrimitiveType(), t2.getPrimitiveType())) {
- return Type.DATE;
- }
-
- if (canCompareDatetime(t1.getPrimitiveType(), t2.getPrimitiveType())) {
return Type.DATETIME;
}
- PrimitiveType t1ResultType = t1.getResultType().getPrimitiveType();
- PrimitiveType t2ResultType = t2.getResultType().getPrimitiveType();
-
// Following logical is compatible with MySQL.
if (t1ResultType == PrimitiveType.VARCHAR && t2ResultType ==
PrimitiveType.VARCHAR) {
- return Type.VARCHAR;
+ return Type.VARCHAR;
}
if ((t1ResultType == PrimitiveType.STRING && t2ResultType ==
PrimitiveType.STRING)
|| (t1ResultType == PrimitiveType.STRING && t2ResultType ==
PrimitiveType.VARCHAR)
@@ -1027,30 +1022,30 @@ public abstract class Type {
}
// int family type and char family type should cast to char family type
- if ((t1ResultType.isFixedPointType() && t2ResultType.isCharFamily())
- || (t2ResultType.isFixedPointType() &&
t1ResultType.isCharFamily())) {
- return t1.isStringType() ? t1 : t2;
+ if ((t1ResultType.isFixedPointType() && t2ResultType.isCharFamily()) ||
+ (t2ResultType.isFixedPointType() &&
t1ResultType.isCharFamily())) {
+ return t1.isStringType() ? t1 : t2;
}
if (t1ResultType == PrimitiveType.BIGINT && t2ResultType ==
PrimitiveType.BIGINT) {
return getAssignmentCompatibleType(t1, t2, false);
}
- if ((t1ResultType == PrimitiveType.BIGINT || t1ResultType ==
PrimitiveType.DECIMALV2)
- && (t2ResultType == PrimitiveType.BIGINT || t2ResultType ==
PrimitiveType.DECIMALV2)) {
+ if ((t1ResultType == PrimitiveType.BIGINT
+ || t1ResultType == PrimitiveType.DECIMALV2)
+ && (t2ResultType == PrimitiveType.BIGINT
+ || t2ResultType == PrimitiveType.DECIMALV2)) {
return Type.DECIMALV2;
}
- if ((t1ResultType == PrimitiveType.BIGINT || t1ResultType ==
PrimitiveType.LARGEINT)
- && (t2ResultType == PrimitiveType.BIGINT || t2ResultType ==
PrimitiveType.LARGEINT)) {
+ if ((t1ResultType == PrimitiveType.BIGINT
+ || t1ResultType == PrimitiveType.LARGEINT)
+ && (t2ResultType == PrimitiveType.BIGINT
+ || t2ResultType == PrimitiveType.LARGEINT)) {
return Type.LARGEINT;
}
return Type.DOUBLE;
}
public static boolean canCompareDate(PrimitiveType t1, PrimitiveType t2) {
- return (t1 == PrimitiveType.DATE && t2 == PrimitiveType.DATE);
- }
-
- public static boolean canCompareDatetime(PrimitiveType t1, PrimitiveType
t2) {
if (t1.isDateType()) {
if (t2.isDateType() || t2.isStringType() || t2.isIntegerType()) {
return true;
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 8e31fbf..519c7b6 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -1605,11 +1605,6 @@ public class QueryPlanTest {
String sql = "select day from tbl_int_date where day = '2020-10-30'";
String explainString =
UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `day` =
'2020-10-30 00:00:00'"));
-
- sql = "select day from tbl_int_date where day = cast('2020-10-30' as
date)";
- explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext,
"EXPLAIN " + sql);
- Assert.assertTrue(explainString.contains("PREDICATES: `day` =
'2020-10-30'"));
-
sql = "select day from tbl_int_date where day =
from_unixtime(1196440219)";
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext,
"EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `day` =
'2007-12-01 00:30:19'"));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]