Repository: tajo Updated Branches: refs/heads/master d3697d763 -> 35c24927b
TAJO-1011: EvalTreeUtil::isJoinQual need to handle other join conditions. (jaehwa) Project: http://git-wip-us.apache.org/repos/asf/tajo/repo Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/35c24927 Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/35c24927 Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/35c24927 Branch: refs/heads/master Commit: 35c24927b9edc19c91ceb3a0264188435195cde7 Parents: d3697d7 Author: Jaehwa Jung <[email protected]> Authored: Tue Aug 19 22:36:29 2014 +0900 Committer: Jaehwa Jung <[email protected]> Committed: Tue Aug 19 22:36:29 2014 +0900 ---------------------------------------------------------------------- CHANGES | 2 ++ .../apache/tajo/engine/eval/EvalTreeUtil.java | 34 ++++++++++++++++---- 2 files changed, 30 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tajo/blob/35c24927/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index f77b19b..841eb49 100644 --- a/CHANGES +++ b/CHANGES @@ -115,6 +115,8 @@ Release 0.9.0 - unreleased BUG FIXES + TAJO-1011: EvalTreeUtil::isJoinQual need to handle other join conditions. (jaehwa) + TAJO-1009: A binary eval for column references of the same tables should not be recognized as a join condition. (hyunsik) http://git-wip-us.apache.org/repos/asf/tajo/blob/35c24927/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java index e6c27e1..607383f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/eval/EvalTreeUtil.java @@ -262,14 +262,36 @@ public class EvalTreeUtil { BinaryEval binaryEval = (BinaryEval) expr; boolean isBothTermFields = isSingleColumn(binaryEval.getLeftExpr()) && isSingleColumn(binaryEval.getRightExpr()); + // If there is a filter using constants, we can't find unique column name as follows: + // ex) select * from lineitem where l_orderkey = 2; + // In this case, we may find NoSuchElementException because iterator has not any elements. + // Thus, we should find whether iterator has one more elements. + String leftQualifier = "", rightQualifier = ""; + if (EvalTreeUtil.findUniqueColumns(binaryEval.getLeftExpr()).iterator().hasNext()) { + Column leftColumn = EvalTreeUtil.findUniqueColumns(binaryEval.getLeftExpr()).iterator().next(); + leftQualifier = leftColumn.getQualifiedName(); + } - String leftQualifier = - EvalTreeUtil.findUniqueColumns(binaryEval.getLeftExpr()).iterator().next().getQualifiedName(); - String rightQualifier = - EvalTreeUtil.findUniqueColumns(binaryEval.getRightExpr()).iterator().next().getQualifiedName(); + if (EvalTreeUtil.findUniqueColumns(binaryEval.getRightExpr()).iterator().hasNext()) { + Column rightColumn = EvalTreeUtil.findUniqueColumns(binaryEval.getRightExpr()).iterator().next(); + rightQualifier = rightColumn.getQualifiedName(); + } - boolean isDifferentTables = - !(CatalogUtil.extractQualifier(leftQualifier).equals(CatalogUtil.extractQualifier(rightQualifier))); + String extractLeftQualifier = CatalogUtil.extractQualifier(leftQualifier); + String extractRightQualifier = CatalogUtil.extractQualifier(rightQualifier); + boolean isDifferentTables = false; + + // If there are column alias and some functions, extracted qualifier will be empty data as follows: + // ex) select n1.n_nationkey, substr(n1.n_name, 1, 4) name1, substr(n2.n_name, 1, 4) name2 + // from nation n1 join nation n2 on substr(n1.n_name, 1, 4) = substr(n2.n_name, 1, 4) + // order by n1.n_nationkey; + // Thus, we can't check whether join tables used different tables. + if (extractLeftQualifier.equals("") && extractRightQualifier.equals("")) { + isDifferentTables = true; + } else { + isDifferentTables = !(CatalogUtil.extractQualifier(leftQualifier). + equals(CatalogUtil.extractQualifier(rightQualifier))); + } return joinComparator && isBothTermFields && isDifferentTables; } else {
