diff --git a/fe/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/src/main/java/org/apache/doris/analysis/Analyzer.java index 39bfd2fc29e359..f59f48dbc3aad4 100644 --- a/fe/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -1412,7 +1412,7 @@ public Type castAllToCompatibleType(List exprs) throws AnalysisException { // TODO(zc) compatibleType = Type.getCmpType(compatibleType, exprs.get(i).getType()); } - if (compatibleType == Type.VARCHAR) { + if (compatibleType.equals(Type.VARCHAR)) { if (exprs.get(0).getType().isDateType()) { compatibleType = Type.DATETIME; } diff --git a/fe/src/main/java/org/apache/doris/analysis/CastExpr.java b/fe/src/main/java/org/apache/doris/analysis/CastExpr.java index 2dafc9fc6bcdb2..e9f9cd80570a6b 100644 --- a/fe/src/main/java/org/apache/doris/analysis/CastExpr.java +++ b/fe/src/main/java/org/apache/doris/analysis/CastExpr.java @@ -105,8 +105,8 @@ public static void initBuiltins(FunctionSet functionSet) { } // Disable casting from boolean to decimal or datetime or date if (fromType.isBoolean() && - (toType == Type.DECIMAL || toType == Type.DECIMALV2 || - toType == Type.DATETIME || toType == Type.DATE)) { + (toType.equals(Type.DECIMAL) || toType.equals(Type.DECIMALV2) || + toType.equals(Type.DATETIME) || toType.equals(Type.DATE))) { continue; } // Disable no-op casts diff --git a/fe/src/main/java/org/apache/doris/analysis/ColumnDef.java b/fe/src/main/java/org/apache/doris/analysis/ColumnDef.java index 38c986c228e40f..5227b2e6e6bebf 100644 --- a/fe/src/main/java/org/apache/doris/analysis/ColumnDef.java +++ b/fe/src/main/java/org/apache/doris/analysis/ColumnDef.java @@ -205,7 +205,7 @@ public static void validateDefaultValue(Type type, String defaultValue) throws A break; case FLOAT: FloatLiteral floatLiteral = new FloatLiteral(defaultValue); - if (floatLiteral.getType() == Type.DOUBLE) { + if (floatLiteral.getType().equals(Type.DOUBLE)) { throw new AnalysisException("Default value will loose precision: " + defaultValue); } case DOUBLE: diff --git a/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java b/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java index db0631a9c9c16f..cb80a7910fe65c 100644 --- a/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java +++ b/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java @@ -17,15 +17,6 @@ package org.apache.doris.analysis; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Date; -import java.util.Objects; -import java.util.TimeZone; -import java.util.regex.Pattern; - import org.apache.doris.catalog.Catalog; import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.catalog.Type; @@ -35,6 +26,9 @@ import org.apache.doris.thrift.TDateLiteral; import org.apache.doris.thrift.TExprNode; import org.apache.doris.thrift.TExprNodeType; + +import com.google.common.base.Preconditions; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.joda.time.DateTime; @@ -43,7 +37,14 @@ import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatterBuilder; -import com.google.common.base.Preconditions; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Date; +import java.util.Objects; +import java.util.TimeZone; +import java.util.regex.Pattern; public class DateLiteral extends LiteralExpr { private static final Logger LOG = LogManager.getLogger(DateLiteral.class); @@ -101,7 +102,7 @@ private DateLiteral() { public DateLiteral(Type type, boolean isMax) throws AnalysisException { super(); this.type = type; - if (type == Type.DATE) { + if (type.equals(Type.DATE)) { if (isMax) { copy(MAX_DATE); } else { @@ -131,7 +132,7 @@ public DateLiteral(long unixTimestamp, TimeZone timeZone, Type type) { hour = dt.getHourOfDay(); minute = dt.getMinuteOfHour(); second = dt.getSecondOfMinute(); - if (type == Type.DATE) { + if (type.equals(Type.DATE)) { hour = 0; minute = 0; second = 0; @@ -191,7 +192,7 @@ private void init(String s, Type type) throws AnalysisException { try { Preconditions.checkArgument(type.isDateType()); LocalDateTime dateTime; - if (type == Type.DATE) { + if (type.equals(Type.DATE)) { if (s.split("-")[0].length() == 2) { dateTime = DATE_FORMATTER_TWO_DIGIT.parseLocalDateTime(s); } else { @@ -247,9 +248,9 @@ public boolean isMinValue() { @Override public Object getRealValue() { - if (type == Type.DATE) { + if (type.equals(Type.DATE)) { return year * 16 * 32L + month * 32 + day; - } else if (type == Type.DATETIME) { + } else if (type.equals(Type.DATETIME)) { return (year * 10000 + month * 100 + day) * 1000000L + hour * 10000 + minute * 100 + second; } else { Preconditions.checkState(false, "invalid date type: " + type); @@ -355,9 +356,9 @@ private long makePackedDatetime() { public void write(DataOutput out) throws IOException { super.write(out); //set flag bit in meta, 0 is DATETIME and 1 is DATE - if (this.type == Type.DATETIME) { + if (this.type.equals(Type.DATETIME)) { out.writeShort(DateLiteralType.DATETIME.value()); - } else if (this.type == Type.DATE) { + } else if (this.type.equals(Type.DATE)) { out.writeShort(DateLiteralType.DATE.value()); } else { throw new IOException("Error date literal type : " + type); @@ -439,7 +440,7 @@ public static DateLiteral dateParser(String date, String pattern) throws Analysi //Return the date stored in the dateliteral as pattern format. //eg : "%Y-%m-%d" or "%Y-%m-%d %H:%i:%s" public String dateFormat(String pattern) throws AnalysisException { - if (type == Type.DATE) { + if (type.equals(Type.DATE)) { return DATE_FORMATTER.parseLocalDateTime(getStringValue()) .toString(formatBuilder(pattern).toFormatter()); } else { @@ -559,9 +560,9 @@ private static DateTimeFormatterBuilder formatBuilder(String pattern) throws Ana } public LocalDateTime getTimeFormatter() throws AnalysisException { - if (type == Type.DATE) { + if (type.equals(Type.DATE)) { return DATE_FORMATTER.parseLocalDateTime(getStringValue()); - } else if (type == Type.DATETIME) { + } else if (type.equals(Type.DATETIME)) { return DATE_TIME_FORMATTER.parseLocalDateTime(getStringValue()); } else { throw new AnalysisException("Not support date literal type"); diff --git a/fe/src/main/java/org/apache/doris/analysis/Expr.java b/fe/src/main/java/org/apache/doris/analysis/Expr.java index 6a43c0bf2d9b71..76ceaf2efb0545 100644 --- a/fe/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/src/main/java/org/apache/doris/analysis/Expr.java @@ -1441,7 +1441,7 @@ public static Expr pushNegationToOperands(Expr root) { * Negates a boolean Expr. */ public Expr negate() { - Preconditions.checkState(type == Type.BOOLEAN); + Preconditions.checkState(type.equals(Type.BOOLEAN)); return new CompoundPredicate(CompoundPredicate.Operator.NOT, this, null); } diff --git a/fe/src/main/java/org/apache/doris/analysis/InPredicate.java b/fe/src/main/java/org/apache/doris/analysis/InPredicate.java index 1963aa75c947cd..73ff516890635f 100644 --- a/fe/src/main/java/org/apache/doris/analysis/InPredicate.java +++ b/fe/src/main/java/org/apache/doris/analysis/InPredicate.java @@ -147,7 +147,7 @@ public void vectorizedAnalyze(Analyzer analyzer) { // OpcodeRegistry.BuiltinFunction match = OpcodeRegistry.instance().getFunctionInfo( // FunctionOperator.FILTER_IN, true, true, type); // Preconditions.checkState(match != null); -// Preconditions.checkState(match.getReturnType() == Type.BOOLEAN); +// Preconditions.checkState(match.getReturnType().equals(Type.BOOLEAN)); // this.vectorOpcode = match.opcode; // LOG.info(debugString() + " opcode: " + vectorOpcode); } diff --git a/fe/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java b/fe/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java index f4cbe9cb60934a..2720a6ebba3022 100644 --- a/fe/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java +++ b/fe/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java @@ -17,15 +17,6 @@ package org.apache.doris.analysis; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.Objects; - import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; @@ -34,9 +25,19 @@ import org.apache.doris.thrift.TExprNode; import org.apache.doris.thrift.TExprNodeType; import org.apache.doris.thrift.TLargeIntLiteral; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Objects; + // large int for the num that native types can not public class LargeIntLiteral extends LiteralExpr { private final static Logger LOG = LogManager.getLogger(LargeIntLiteral.class); @@ -149,7 +150,7 @@ public int compareLiteral(LiteralExpr expr) { if (expr == MaxLiteral.MAX_VALUE) { return -1; } - if (expr.type == Type.LARGEINT) { + if (expr.type.equals(Type.LARGEINT)) { return value.compareTo(((LargeIntLiteral) expr).value); } else { BigInteger intValue = new BigInteger(((IntLiteral) expr).getStringValue()); diff --git a/fe/src/main/java/org/apache/doris/analysis/SlotRef.java b/fe/src/main/java/org/apache/doris/analysis/SlotRef.java index 1cfabbbcf59304..a845d7d39c4c87 100644 --- a/fe/src/main/java/org/apache/doris/analysis/SlotRef.java +++ b/fe/src/main/java/org/apache/doris/analysis/SlotRef.java @@ -72,7 +72,7 @@ public SlotRef(SlotDescriptor desc) { this.type = desc.getType(); // TODO(zc): label is meaningful this.label = null; - if (this.type == Type.CHAR) { + if (this.type.equals(Type.CHAR)) { this.type = Type.VARCHAR; } analysisDone(); @@ -124,7 +124,7 @@ public void computeOutputColumn(Analyzer analyzer) { public void analyzeImpl(Analyzer analyzer) throws AnalysisException { desc = analyzer.registerColumnRef(tblName, col); type = desc.getType(); - if (this.type == Type.CHAR) { + if (this.type.equals(Type.CHAR)) { this.type = Type.VARCHAR; } if (!type.isSupported()) { @@ -132,7 +132,7 @@ public void analyzeImpl(Analyzer analyzer) throws AnalysisException { "Unsupported type '" + type.toString() + "' in '" + toSql() + "'."); } numDistinctValues = desc.getStats().getNumDistinctValues(); - if (type == Type.BOOLEAN) { + if (type.equals(Type.BOOLEAN)) { selectivity = DEFAULT_SELECTIVITY; } } diff --git a/fe/src/main/java/org/apache/doris/catalog/FunctionSet.java b/fe/src/main/java/org/apache/doris/catalog/FunctionSet.java index 8f4b66b30315a9..26b744cab94c4b 100644 --- a/fe/src/main/java/org/apache/doris/catalog/FunctionSet.java +++ b/fe/src/main/java/org/apache/doris/catalog/FunctionSet.java @@ -860,7 +860,7 @@ private void initAggregateBuiltins() { null, false, true, true)); // count in multi distinct - if (t == Type.CHAR || t == Type.VARCHAR) { + if (t.equals(Type.CHAR) || t.equals(Type.VARCHAR)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t), Type.BIGINT, Type.VARCHAR, @@ -872,8 +872,8 @@ private void initAggregateBuiltins() { null, prefix + "30count_distinct_string_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE", false, true, true)); - } else if (t == Type.TINYINT || t == Type.SMALLINT || t == Type.INT - || t == Type.BIGINT || t == Type.LARGEINT || t == Type.DOUBLE) { + } else if (t.equals(Type.TINYINT) || t.equals(Type.SMALLINT) || t.equals(Type.INT) + || t.equals(Type.BIGINT) || t.equals(Type.LARGEINT) || t.equals(Type.DOUBLE)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t), Type.BIGINT, Type.VARCHAR, @@ -885,7 +885,7 @@ private void initAggregateBuiltins() { null, prefix + MULTI_DISTINCT_COUNT_FINALIZE_SYMBOL.get(t), false, true, true)); - } else if (t == Type.DATE || t == Type.DATETIME) { + } else if (t.equals(Type.DATE) || t.equals(Type.DATETIME)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t), Type.BIGINT, Type.VARCHAR, @@ -897,7 +897,7 @@ private void initAggregateBuiltins() { null, prefix + "28count_distinct_date_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE", false, true, true)); - } else if (t == Type.DECIMAL) { + } else if (t.equals(Type.DECIMAL)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t), Type.BIGINT, Type.VARCHAR, @@ -909,7 +909,7 @@ private void initAggregateBuiltins() { null, prefix + "31count_distinct_decimal_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE", false, true, true)); - } else if (t == Type.DECIMALV2) { + } else if (t.equals(Type.DECIMALV2)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t), Type.BIGINT, Type.VARCHAR, @@ -924,7 +924,7 @@ private void initAggregateBuiltins() { } // sum in multi distinct - if (t == Type.BIGINT || t == Type.LARGEINT || t == Type.DOUBLE) { + if (t.equals(Type.BIGINT) || t.equals(Type.LARGEINT) || t.equals(Type.DOUBLE)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t), t, Type.VARCHAR, @@ -936,7 +936,7 @@ private void initAggregateBuiltins() { null, prefix + MULTI_DISTINCT_SUM_FINALIZE_SYMBOL.get(t), false, true, true)); - } else if (t == Type.DECIMAL) { + } else if (t.equals(Type.DECIMAL)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t), MULTI_DISTINCT_SUM_RETURN_TYPE.get(t), Type.VARCHAR, @@ -948,7 +948,7 @@ private void initAggregateBuiltins() { null, prefix + "29sum_distinct_decimal_finalizeEPN9doris_udf15FunctionContextERKNS1_9StringValE", false, true, true)); - } else if (t == Type.DECIMALV2) { + } else if (t.equals(Type.DECIMALV2)) { addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t), MULTI_DISTINCT_SUM_RETURN_TYPE.get(t), Type.VARCHAR, @@ -1302,16 +1302,16 @@ private void initAggregateBuiltins() { t.isStringType() ? initNullString : initNull, prefix + FIRST_VALUE_UPDATE_SYMBOL.get(t), null, - t == Type.VARCHAR ? stringValGetValue : null, - t == Type.VARCHAR ? stringValSerializeOrFinalize : null)); + t.equals(Type.VARCHAR) ? stringValGetValue : null, + t.equals(Type.VARCHAR) ? stringValSerializeOrFinalize : null)); // Implements FIRST_VALUE for some windows that require rewrites during planning. addBuiltin(AggregateFunction.createAnalyticBuiltin( "first_value_rewrite", Lists.newArrayList(t, Type.BIGINT), t, t, t.isStringType() ? initNullString : initNull, prefix + FIRST_VALUE_REWRITE_UPDATE_SYMBOL.get(t), null, - t == Type.VARCHAR ? stringValGetValue : null, - t == Type.VARCHAR ? stringValSerializeOrFinalize : null, + t.equals(Type.VARCHAR) ? stringValGetValue : null, + t.equals(Type.VARCHAR) ? stringValSerializeOrFinalize : null, false)); addBuiltin(AggregateFunction.createAnalyticBuiltin( @@ -1319,8 +1319,8 @@ private void initAggregateBuiltins() { t.isStringType() ? initNullString : initNull, prefix + LAST_VALUE_UPDATE_SYMBOL.get(t), prefix + LAST_VALUE_REMOVE_SYMBOL.get(t), - t == Type.VARCHAR ? stringValGetValue : null, - t == Type.VARCHAR ? stringValSerializeOrFinalize : null)); + t.equals(Type.VARCHAR) ? stringValGetValue : null, + t.equals(Type.VARCHAR) ? stringValSerializeOrFinalize : null)); addBuiltin(AggregateFunction.createAnalyticBuiltin( "lag", Lists.newArrayList(t, Type.BIGINT, t), t, t, diff --git a/fe/src/main/java/org/apache/doris/mysql/MysqlChannel.java b/fe/src/main/java/org/apache/doris/mysql/MysqlChannel.java index 013d1759fc076b..081214971e95f5 100644 --- a/fe/src/main/java/org/apache/doris/mysql/MysqlChannel.java +++ b/fe/src/main/java/org/apache/doris/mysql/MysqlChannel.java @@ -82,7 +82,7 @@ public MysqlChannel(SocketChannel channel) { remoteIp = channel.getRemoteAddress().toString(); } } catch (Exception e) { - LOG.warn("get remote host string failed: " + e.toString()); + LOG.warn("get remote host string failed: ", e); } } } diff --git a/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java b/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java index a1ab57247fc9c7..25b63fd66fe39e 100644 --- a/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java +++ b/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java @@ -26,15 +26,19 @@ import org.apache.doris.catalog.Column; import org.apache.doris.catalog.MysqlTable; import org.apache.doris.common.UserException; +import org.apache.doris.thrift.TExplainLevel; import org.apache.doris.thrift.TMySQLScanNode; import org.apache.doris.thrift.TPlanNode; import org.apache.doris.thrift.TPlanNodeType; import org.apache.doris.thrift.TScanRangeLocations; + +import com.google.common.base.Joiner; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; import com.google.common.collect.Lists; -import org.apache.logging.log4j.Logger; + import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.List; @@ -47,15 +51,14 @@ public class MysqlScanNode extends ScanNode { private final List columns = new ArrayList(); private final List filters = new ArrayList(); - private String tabName; + private String tblName; /** * Constructs node to scan given data files of table 'tbl'. */ public MysqlScanNode(PlanNodeId id, TupleDescriptor desc, MysqlTable tbl) { super(id, desc, "SCAN MYSQL"); - // tabName = ((BaseTableRef)desc.getRef()).mysqlTableRefToSql(); - tabName = "`" + tbl.getMysqlTableName() + "`"; + tblName = "`" + tbl.getMysqlTableName() + "`"; } @Override @@ -71,6 +74,27 @@ public void finalize(Analyzer analyzer) throws UserException { createMySQLFilters(analyzer); } + @Override + protected String getNodeExplainString(String prefix, TExplainLevel detailLevel) { + StringBuilder output = new StringBuilder(); + output.append(prefix).append("TABLE: ").append(tblName).append("\n"); + output.append(prefix).append("Query: ").append(getMysqlQueryStr()).append("\n"); + return output.toString(); + } + + private String getMysqlQueryStr() { + StringBuilder sql = new StringBuilder("SELECT "); + sql.append(Joiner.on(", ").join(columns)); + sql.append(" FROM ").append(tblName); + + if (!filters.isEmpty()) { + sql.append(" WHERE ("); + sql.append(Joiner.on(") AND (").join(filters)); + sql.append(")"); + } + return sql.toString(); + } + private void createMySQLColumns(Analyzer analyzer) { for (SlotDescriptor slot : desc.getSlots()) { if (!slot.isMaterialized()) { @@ -79,7 +103,7 @@ private void createMySQLColumns(Analyzer analyzer) { Column col = slot.getColumn(); columns.add("`" + col.getName() + "`"); } - // this happend when count(*) + // this happens when count(*) if (0 == columns.size()) { columns.add("*"); } @@ -109,11 +133,11 @@ private void createMySQLFilters(Analyzer analyzer) { @Override protected void toThrift(TPlanNode msg) { msg.node_type = TPlanNodeType.MYSQL_SCAN_NODE; - msg.mysql_scan_node = new TMySQLScanNode(desc.getId().asInt(), tabName, columns, filters); + msg.mysql_scan_node = new TMySQLScanNode(desc.getId().asInt(), tblName, columns, filters); } /** - * We query MySQL Meta to get request's data localtion + * We query MySQL Meta to get request's data location * extra result info will pass to backend ScanNode */ @Override diff --git a/fe/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/src/main/java/org/apache/doris/planner/PlanNode.java index 9b3459e36b4c1b..ffd2e38741ebfd 100644 --- a/fe/src/main/java/org/apache/doris/planner/PlanNode.java +++ b/fe/src/main/java/org/apache/doris/planner/PlanNode.java @@ -300,8 +300,7 @@ public String getExplainString() { * The root node header line will be prefixed by rootPrefix and the remaining plan * output will be prefixed by prefix. */ - protected final String getExplainString(String rootPrefix, String prefix, - TExplainLevel detailLevel) { + protected final String getExplainString(String rootPrefix, String prefix, TExplainLevel detailLevel) { StringBuilder expBuilder = new StringBuilder(); String detailPrefix = prefix; boolean traverseChildren = children != null diff --git a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java index 316d9cee7f139c..003637631bf52f 100644 --- a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -21,11 +21,13 @@ import org.apache.doris.analysis.CreateTableStmt; import org.apache.doris.analysis.DropDbStmt; import org.apache.doris.analysis.Expr; +import org.apache.doris.analysis.LoadStmt; import org.apache.doris.analysis.SelectStmt; import org.apache.doris.analysis.ShowCreateDbStmt; import org.apache.doris.analysis.StatementBase; import org.apache.doris.catalog.Catalog; import org.apache.doris.catalog.Type; +import org.apache.doris.load.EtlJobType; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.QueryState.MysqlStateType; import org.apache.doris.utframe.UtFrameUtils; @@ -187,6 +189,33 @@ public static void beforeClass() throws Exception { "\"dynamic_partition.prefix\" = \"p\",\n" + "\"dynamic_partition.buckets\" = \"1\"\n" + ");"); + + createTable("CREATE TABLE test.`app_profile` (\n" + + " `event_date` date NOT NULL COMMENT \"\",\n" + + " `app_name` varchar(64) NOT NULL COMMENT \"\",\n" + + " `package_name` varchar(64) NOT NULL COMMENT \"\",\n" + + " `age` varchar(32) NOT NULL COMMENT \"\",\n" + + " `gender` varchar(32) NOT NULL COMMENT \"\",\n" + + " `level` varchar(64) NOT NULL COMMENT \"\",\n" + + " `city` varchar(64) NOT NULL COMMENT \"\",\n" + + " `model` varchar(64) NOT NULL COMMENT \"\",\n" + + " `brand` varchar(64) NOT NULL COMMENT \"\",\n" + + " `hours` varchar(16) NOT NULL COMMENT \"\",\n" + + " `use_num` int(11) SUM NOT NULL COMMENT \"\",\n" + + " `use_time` double SUM NOT NULL COMMENT \"\",\n" + + " `start_times` bigint(20) SUM NOT NULL COMMENT \"\"\n" + + ") ENGINE=OLAP\n" + + "AGGREGATE KEY(`event_date`, `app_name`, `package_name`, `age`, `gender`, `level`, `city`, `model`, `brand`, `hours`)\n" + + + "COMMENT \"OLAP\"\n" + + "PARTITION BY RANGE(`event_date`)\n" + + "(PARTITION p_20200301 VALUES [('2020-02-27'), ('2020-03-02')),\n" + + "PARTITION p_20200306 VALUES [('2020-03-02'), ('2020-03-07')))\n" + + "DISTRIBUTED BY HASH(`event_date`, `app_name`, `package_name`, `age`, `gender`, `level`, `city`, `model`, `brand`, `hours`) BUCKETS 1\n" + + + "PROPERTIES (\n" + + " \"replication_num\" = \"1\"\n" + + ");"); } @AfterClass @@ -459,4 +488,20 @@ public void testDateTypeCastSyntax() throws Exception { Assert.assertTrue(explainString.contains("2011-11-09")); Assert.assertFalse(explainString.contains("2011-11-09 00:00:00")); } + + @Test + public void testDateTypeEquality() throws Exception { + // related to Github issue #3309 + String loadStr = "load label test.app_profile_20200306\n" + + "(DATA INFILE('filexxx')INTO TABLE app_profile partition (p_20200306)\n" + + "COLUMNS TERMINATED BY '\\t'\n" + + "(app_name,package_name,age,gender,level,city,model,brand,hours,use_num,use_time,start_times)\n" + + "SET\n" + + "(event_date = default_value('2020-03-06'))) \n" + + "PROPERTIES ( 'max_filter_ratio'='0.0001' );\n" + + ""; + LoadStmt loadStmt = (LoadStmt) UtFrameUtils.parseAndAnalyzeStmt(loadStr, connectContext); + Catalog.getCurrentCatalog().getLoadManager().createLoadJobV1FromStmt(loadStmt, EtlJobType.HADOOP, + System.currentTimeMillis()); + } } diff --git a/fe/src/test/java/org/apache/doris/plugin/PluginMgrTest.java b/fe/src/test/java/org/apache/doris/plugin/PluginMgrTest.java index 6f046e754cf47f..2bbae1980d4101 100644 --- a/fe/src/test/java/org/apache/doris/plugin/PluginMgrTest.java +++ b/fe/src/test/java/org/apache/doris/plugin/PluginMgrTest.java @@ -70,6 +70,7 @@ public void setUp() throws IOException { @Test public void testInstallPluginZip() { try { + // path "target/audit_plugin_demo" is where we are going to install the plugin assertFalse(Files.exists(PluginTestUtil.getTestPath("target/audit_plugin_demo"))); assertFalse(Files.exists(PluginTestUtil.getTestPath("target/audit_plugin_demo/auditdemo.jar"))); @@ -112,20 +113,17 @@ public void testInstallPluginZip() { @Test public void testInstallPluginLocal() { try { + // path "target/audit_plugin_demo" is where we are going to install the plugin assertFalse(Files.exists(PluginTestUtil.getTestPath("target/audit_plugin_demo"))); assertFalse(Files.exists(PluginTestUtil.getTestPath("target/audit_plugin_demo/auditdemo.jar"))); - assertFalse(Files.exists(PluginTestUtil.getTestPath("test_plugin"))); - FileUtils.copyDirectory(PluginTestUtil.getTestPath("test_local_plugin").toFile(), - PluginTestUtil.getTestPath("test_plugin").toFile()); - - InstallPluginStmt stmt = new InstallPluginStmt(PluginTestUtil.getTestPathString("test_plugin")); + InstallPluginStmt stmt = new InstallPluginStmt(PluginTestUtil.getTestPathString("test_local_plugin")); Catalog.getCurrentCatalog().installPlugin(stmt); PluginMgr pluginMgr = Catalog.getCurrentPluginMgr(); - assertFalse(Files.exists(PluginTestUtil.getTestPath("test_plugin"))); - assertFalse(Files.exists(PluginTestUtil.getTestPath("test_plugin/auditdemo.jar"))); + assertTrue(Files.exists(PluginTestUtil.getTestPath("test_local_plugin"))); + assertTrue(Files.exists(PluginTestUtil.getTestPath("test_local_plugin/auditdemo.jar"))); Plugin p = pluginMgr.getActivePlugin("audit_plugin_demo", PluginInfo.PluginType.AUDIT); diff --git a/fe/src/test/java/org/apache/doris/qe/ConnectSchedulerTest.java b/fe/src/test/java/org/apache/doris/qe/ConnectSchedulerTest.java index 4c496b72be2b86..94af38b4991df1 100644 --- a/fe/src/test/java/org/apache/doris/qe/ConnectSchedulerTest.java +++ b/fe/src/test/java/org/apache/doris/qe/ConnectSchedulerTest.java @@ -17,9 +17,6 @@ package org.apache.doris.qe; -import mockit.Delegate; -import mockit.Expectations; -import mockit.Mocked; import org.apache.doris.analysis.AccessTestUtil; import org.apache.doris.mysql.MysqlChannel; import org.apache.doris.mysql.MysqlProto; @@ -33,6 +30,10 @@ import java.nio.channels.SocketChannel; import java.util.concurrent.atomic.AtomicLong; +import mockit.Delegate; +import mockit.Expectations; +import mockit.Mocked; + public class ConnectSchedulerTest { private static final Logger LOG = LoggerFactory.getLogger(ConnectScheduler.class); private static AtomicLong succSubmit; diff --git a/fe/src/test/java/org/apache/doris/utframe/MockedBackendFactory.java b/fe/src/test/java/org/apache/doris/utframe/MockedBackendFactory.java index 1253673416d0aa..ebe4d1a6301bd4 100644 --- a/fe/src/test/java/org/apache/doris/utframe/MockedBackendFactory.java +++ b/fe/src/test/java/org/apache/doris/utframe/MockedBackendFactory.java @@ -166,7 +166,7 @@ public void run() { try { TAgentTaskRequest request = taskQueue.take(); System.out.println("get agent task request. type: " + request.getTask_type() - + ", signature: " + request.getSignature()); + + ", signature: " + request.getSignature() + ", fe addr: " + backend.getFeAddress()); TFinishTaskRequest finishTaskRequest = new TFinishTaskRequest(tBackend, request.getTask_type(), request.getSignature(), new TStatus(TStatusCode.OK)); finishTaskRequest.setReport_version(++reportVersion);