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 <morningman....@gmail.com> 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: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org