You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by to...@apache.org on 2016/08/13 02:08:49 UTC
[4/5] kudu git commit: KUDU-1553: Crash when specifying multiple
unbounded range predicates on a column
KUDU-1553: Crash when specifying multiple unbounded range predicates on a column
The Kudu client and tablet server will crash when a scan specifies multiple
predicates on a column, with at least one of the predicates being a one-sided
range predicate. For instance:
SELECT * WHERE a > 10 && a = 200;
SELECT * WHERE a <= 10 && a = 5;
will both trigger this crash.
Change-Id: I0f8b21087ba6046f673af9d79b3a60bf8e645cce
Reviewed-on: http://gerrit.cloudera.org:8080/3945
Tested-by: Kudu Jenkins
Reviewed-by: Todd Lipcon <to...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/kudu/repo
Commit: http://git-wip-us.apache.org/repos/asf/kudu/commit/609054cd
Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/609054cd
Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/609054cd
Branch: refs/heads/master
Commit: 609054cd8cff886bd9709b7fb652d0c102c7a2e9
Parents: 883785c
Author: bruceSz <zs...@gmail.com>
Authored: Thu Aug 11 20:45:14 2016 +0800
Committer: Todd Lipcon <to...@apache.org>
Committed: Fri Aug 12 20:07:20 2016 +0000
----------------------------------------------------------------------
src/kudu/common/column_predicate-test.cc | 153 ++++++++++++++++++++++++++
src/kudu/common/column_predicate.cc | 8 +-
2 files changed, 157 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/kudu/blob/609054cd/src/kudu/common/column_predicate-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/common/column_predicate-test.cc b/src/kudu/common/column_predicate-test.cc
index 55792d6..77450f0 100644
--- a/src/kudu/common/column_predicate-test.cc
+++ b/src/kudu/common/column_predicate-test.cc
@@ -112,6 +112,69 @@ class TestColumnPredicate : public KuduTest {
ColumnPredicate::None(column),
PredicateType::None);
+ // [---> AND
+ // [--->
+ // =
+ // [--->
+ TestMerge(ColumnPredicate::Range(column, &values[1], nullptr),
+ ColumnPredicate::Range(column, &values[1], nullptr),
+ ColumnPredicate::Range(column, &values[1], nullptr),
+ PredicateType::Range);
+
+ // [-----> AND
+ // [--->
+ // =
+ // [--->
+ TestMerge(ColumnPredicate::Range(column, &values[1], nullptr),
+ ColumnPredicate::Range(column, &values[2], nullptr),
+ ColumnPredicate::Range(column, &values[2], nullptr),
+ PredicateType::Range);
+
+ // <---) AND
+ // <---)
+ // =
+ // <---)
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[4]),
+ ColumnPredicate::Range(column, nullptr, &values[4]),
+ ColumnPredicate::Range(column, nullptr, &values[4]),
+ PredicateType::Range);
+
+ // <---) AND
+ // <---)
+ // =
+ // <---)
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[6]),
+ ColumnPredicate::Range(column, nullptr, &values[4]),
+ ColumnPredicate::Range(column, nullptr, &values[4]),
+ PredicateType::Range);
+
+ // <---) AND
+ // [--->
+ // =
+ // [---)
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[4]),
+ ColumnPredicate::Range(column, &values[1], nullptr),
+ ColumnPredicate::Range(column, &values[1], &values[4]),
+ PredicateType::Range);
+
+ // <---) AND
+ // [--->
+ // =
+ // None
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[4]),
+ ColumnPredicate::Range(column, &values[4], nullptr),
+ ColumnPredicate::None(column),
+ PredicateType::None);
+
+ // <---) AND
+ // [--->
+ // =
+ // None
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[2]),
+ ColumnPredicate::Range(column, &values[4], nullptr),
+ ColumnPredicate::None(column),
+ PredicateType::None);
+
// Range + Equality
// [---) AND
@@ -160,6 +223,60 @@ class TestColumnPredicate : public KuduTest {
ColumnPredicate::None(column),
PredicateType::None);
+ // [---> AND
+ // |
+ // =
+ // None
+ TestMerge(ColumnPredicate::Range(column, &values[3], nullptr),
+ ColumnPredicate::Equality(column, &values[1]),
+ ColumnPredicate::None(column),
+ PredicateType::None);
+
+ // [---> AND
+ // |
+ // =
+ // |
+ TestMerge(ColumnPredicate::Range(column, &values[1], nullptr),
+ ColumnPredicate::Equality(column, &values[1]),
+ ColumnPredicate::Equality(column, &values[1]),
+ PredicateType::Equality);
+
+ // [-----> AND
+ // |
+ // =
+ // |
+ TestMerge(ColumnPredicate::Range(column, &values[0], nullptr),
+ ColumnPredicate::Equality(column, &values[2]),
+ ColumnPredicate::Equality(column, &values[2]),
+ PredicateType::Equality);
+
+ // <---) AND
+ // |
+ // =
+ // |
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[3]),
+ ColumnPredicate::Equality(column, &values[1]),
+ ColumnPredicate::Equality(column, &values[1]),
+ PredicateType::Equality);
+
+ // <---) AND
+ // |
+ // =
+ // None
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[3]),
+ ColumnPredicate::Equality(column, &values[3]),
+ ColumnPredicate::None(column),
+ PredicateType::None);
+
+ // <---) AND
+ // |
+ // =
+ // None
+ TestMerge(ColumnPredicate::Range(column, nullptr, &values[1]),
+ ColumnPredicate::Equality(column, &values[3]),
+ ColumnPredicate::None(column),
+ PredicateType::None);
+
// None
// None AND
@@ -172,6 +289,24 @@ class TestColumnPredicate : public KuduTest {
PredicateType::None);
// None AND
+ // <----)
+ // =
+ // None
+ TestMerge(ColumnPredicate::None(column),
+ ColumnPredicate::Range(column, nullptr, &values[5]),
+ ColumnPredicate::None(column),
+ PredicateType::None);
+
+ // None AND
+ // [---->
+ // =
+ // None
+ TestMerge(ColumnPredicate::None(column),
+ ColumnPredicate::Range(column, &values[1], nullptr),
+ ColumnPredicate::None(column),
+ PredicateType::None);
+
+ // None AND
// |
// =
// None
@@ -226,6 +361,24 @@ class TestColumnPredicate : public KuduTest {
ColumnPredicate::Range(column, &values[0], &values[2]),
ColumnPredicate::Range(column, &values[0], &values[2]),
PredicateType::Range);
+
+ // IS NOT NULL AND
+ // <------)
+ // =
+ // <------)
+ TestMerge(ColumnPredicate::IsNotNull(column),
+ ColumnPredicate::Range(column, nullptr, &values[2]),
+ ColumnPredicate::Range(column, nullptr, &values[2]),
+ PredicateType::Range);
+
+ // IS NOT NULL AND
+ // [------>
+ // =
+ // [------>
+ TestMerge(ColumnPredicate::IsNotNull(column),
+ ColumnPredicate::Range(column, &values[2], nullptr),
+ ColumnPredicate::Range(column, &values[2], nullptr),
+ PredicateType::Range);
}
};
http://git-wip-us.apache.org/repos/asf/kudu/blob/609054cd/src/kudu/common/column_predicate.cc
----------------------------------------------------------------------
diff --git a/src/kudu/common/column_predicate.cc b/src/kudu/common/column_predicate.cc
index ea0fe5a..fe3aef4 100644
--- a/src/kudu/common/column_predicate.cc
+++ b/src/kudu/common/column_predicate.cc
@@ -199,8 +199,8 @@ void ColumnPredicate::MergeIntoRange(const ColumnPredicate& other) {
};
case PredicateType::Equality: {
- if (column_.type_info()->Compare(lower_, other.lower_) > 0 ||
- column_.type_info()->Compare(upper_, other.lower_) <= 0) {
+ if ((lower_ != nullptr && column_.type_info()->Compare(lower_, other.lower_) > 0) ||
+ (upper_ != nullptr && column_.type_info()->Compare(upper_, other.lower_) <= 0)) {
// The equality value does not fall in this range.
SetToNone();
} else {
@@ -224,8 +224,8 @@ void ColumnPredicate::MergeIntoEquality(const ColumnPredicate& other) {
return;
}
case PredicateType::Range: {
- if (column_.type_info()->Compare(lower_, other.lower_) < 0 ||
- column_.type_info()->Compare(lower_, other.upper_) >= 0) {
+ if ((other.lower_ != nullptr && column_.type_info()->Compare(lower_, other.lower_) < 0) ||
+ (other.upper_ != nullptr && column_.type_info()->Compare(lower_, other.upper_) >= 0)) {
// This equality value does not fall in the other range.
SetToNone();
}