Fix bug that NullPredicate is not correctly handled by partition pruning (#1276)

This commit is contained in:
Mingyu Chen
2019-06-10 20:11:42 +08:00
committed by ZHAO Chun
parent 2efd5a4d86
commit 6a54464ee8
3 changed files with 48 additions and 15 deletions

View File

@ -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();

View File

@ -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;
}

View File

@ -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);