Fix bug that NullPredicate is not correctly handled by partition pruning (#1276)
This commit is contained in:
@ -22,11 +22,12 @@ import org.apache.doris.thrift.TScalarType;
|
||||
import org.apache.doris.thrift.TTypeDesc;
|
||||
import org.apache.doris.thrift.TTypeNode;
|
||||
import org.apache.doris.thrift.TTypeNodeType;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.base.Strings;
|
||||
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
/**
|
||||
* Describes a scalar type. For most types this class just wraps a PrimitiveType enum,
|
||||
@ -329,7 +330,7 @@ public class ScalarType extends Type {
|
||||
stringBuilder.append(type.toString().toLowerCase());
|
||||
break;
|
||||
default:
|
||||
stringBuilder.append("unknown");
|
||||
stringBuilder.append("unknown type: " + type.toString());
|
||||
break;
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
|
||||
@ -113,20 +113,20 @@ public class PartitionColumnFilter {
|
||||
public String toString() {
|
||||
String str = "";
|
||||
if (null == lowerBound) {
|
||||
str += "lowerBound is NULL";
|
||||
str += "lowerBound is UNSET";
|
||||
} else {
|
||||
str += "lowerBound is " + lowerBound.getStringValue() + " and lowerBoundInclusive is " +
|
||||
lowerBoundInclusive;
|
||||
}
|
||||
if (null == upperBound) {
|
||||
str += "\nupperBound is NULL";
|
||||
str += "\nupperBound is UNSET";
|
||||
} else {
|
||||
str +=
|
||||
"\nupperBound is " + upperBound.getStringValue() + " and upperBoundInclusive is " +
|
||||
upperBoundInclusive;
|
||||
}
|
||||
if (null == inPredicate) {
|
||||
str += "\ninPredicate is NULL";
|
||||
str += "\ninPredicate is UNSET";
|
||||
} else {
|
||||
str += "\ninPredicate is " + inPredicate;
|
||||
}
|
||||
|
||||
@ -17,17 +17,48 @@
|
||||
|
||||
package org.apache.doris.planner;
|
||||
|
||||
import org.apache.doris.analysis.AggregateInfo;
|
||||
import org.apache.doris.analysis.AnalyticInfo;
|
||||
import org.apache.doris.analysis.Analyzer;
|
||||
import org.apache.doris.analysis.BaseTableRef;
|
||||
import org.apache.doris.analysis.BinaryPredicate;
|
||||
import org.apache.doris.analysis.CaseExpr;
|
||||
import org.apache.doris.analysis.CastExpr;
|
||||
import org.apache.doris.analysis.DescriptorTable;
|
||||
import org.apache.doris.analysis.Expr;
|
||||
import org.apache.doris.analysis.ExprSubstitutionMap;
|
||||
import org.apache.doris.analysis.FunctionCallExpr;
|
||||
import org.apache.doris.analysis.InPredicate;
|
||||
import org.apache.doris.analysis.InlineViewRef;
|
||||
import org.apache.doris.analysis.IsNullPredicate;
|
||||
import org.apache.doris.analysis.JoinOperator;
|
||||
import org.apache.doris.analysis.LiteralExpr;
|
||||
import org.apache.doris.analysis.NullLiteral;
|
||||
import org.apache.doris.analysis.QueryStmt;
|
||||
import org.apache.doris.analysis.SelectStmt;
|
||||
import org.apache.doris.analysis.SlotDescriptor;
|
||||
import org.apache.doris.analysis.SlotId;
|
||||
import org.apache.doris.analysis.SlotRef;
|
||||
import org.apache.doris.analysis.TableRef;
|
||||
import org.apache.doris.analysis.TupleDescriptor;
|
||||
import org.apache.doris.analysis.TupleId;
|
||||
import org.apache.doris.analysis.TupleIsNullPredicate;
|
||||
import org.apache.doris.analysis.UnionStmt;
|
||||
import org.apache.doris.catalog.AggregateType;
|
||||
import org.apache.doris.catalog.Column;
|
||||
import org.apache.doris.catalog.MysqlTable;
|
||||
import org.apache.doris.catalog.Table;
|
||||
import org.apache.doris.common.AnalysisException;
|
||||
import org.apache.doris.common.Pair;
|
||||
import org.apache.doris.common.Reference;
|
||||
import org.apache.doris.common.UserException;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import org.apache.doris.analysis.*;
|
||||
import org.apache.doris.catalog.AggregateType;
|
||||
import org.apache.doris.catalog.Column;
|
||||
import org.apache.doris.catalog.MysqlTable;
|
||||
import org.apache.doris.catalog.Table;
|
||||
import org.apache.doris.common.*;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
@ -809,13 +840,14 @@ public class SingleNodePlanner {
|
||||
if (!isNullPredicate.isSlotRefChildren() || isNullPredicate.isNotNull()) {
|
||||
continue;
|
||||
}
|
||||
if (null == partitionColumnFilter) {
|
||||
partitionColumnFilter = new PartitionColumnFilter();
|
||||
}
|
||||
// like EQ
|
||||
|
||||
// If we meet a IsNull predicate on partition column, then other predicates are useless
|
||||
// eg: (xxxx) and (col is null), only the IsNull predicate has an effect on partition pruning.
|
||||
partitionColumnFilter = new PartitionColumnFilter();
|
||||
NullLiteral nullLiteral = new NullLiteral();
|
||||
partitionColumnFilter.setLowerBound(nullLiteral, true);
|
||||
partitionColumnFilter.setUpperBound(nullLiteral, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
LOG.debug("partitionColumnFilter: {}", partitionColumnFilter);
|
||||
|
||||
Reference in New Issue
Block a user