This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git

commit 992e824a098babca8d838a6ad858b552491152ad
Author: shee <13843187+qz...@users.noreply.github.com>
AuthorDate: Wed Apr 20 21:44:20 2022 -0700

    [Fix bug] fix non-equal out join is not supported (#8857)
---
 .../java/org/apache/doris/analysis/TableRef.java   | 15 ++++++++-
 .../org/apache/doris/planner/QueryPlanTest.java    | 37 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java
index 7e9a509002..4aa0a1dbc0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java
@@ -215,6 +215,14 @@ public class TableRef implements ParseNode, Writable {
         return null;
     }
 
+    public boolean isOuterJoin() {
+        if (joinOp != null) {
+            return joinOp == JoinOperator.LEFT_OUTER_JOIN || joinOp == 
JoinOperator.RIGHT_OUTER_JOIN
+                    || joinOp == JoinOperator.FULL_OUTER_JOIN;
+        }
+        return false;
+    }
+
     public JoinOperator getJoinOp() {
         // if it's not explicitly set, we're doing an inner join
         return (joinOp == null ? JoinOperator.INNER_JOIN : joinOp);
@@ -572,7 +580,12 @@ public class TableRef implements ParseNode, Writable {
     public void rewriteExprs(ExprRewriter rewriter, Analyzer analyzer)
             throws AnalysisException {
         Preconditions.checkState(isAnalyzed);
-        if (onClause != null) onClause = rewriter.rewrite(onClause, analyzer, 
ExprRewriter.ClauseType.ON_CLAUSE);
+        if (onClause != null) {
+            if (isOuterJoin()) {
+                return;
+            }
+            onClause = rewriter.rewrite(onClause, analyzer, 
ExprRewriter.ClauseType.ON_CLAUSE);
+        }
     }
 
     private String joinOpToSql() {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 20a5c7c704..e535e6c0ec 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -2119,4 +2119,41 @@ public class QueryPlanTest {
         String explainString = 
UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, sql);
         Assert.assertTrue(explainString.contains("1 | 10 | 1 | 1 | 1"));
     }
+
+    /**
+     * for issue #8856
+    */
+    @Test
+    public void testOutJoinWithOnFalse() throws Exception {
+        connectContext.setDatabase("default_cluster:test");
+        createTable("create table out_join_1\n" +
+                "(\n" +
+                "    k1 int,\n" +
+                "    v int\n" +
+                ")\n" +
+                "DISTRIBUTED BY HASH(k1) BUCKETS 10\n" +
+                "PROPERTIES(\"replication_num\" = \"1\");");
+
+        createTable("create table out_join_2\n" +
+                "(\n" +
+                "    k1 int,\n" +
+                "    v int\n" +
+                ")\n" +
+                "DISTRIBUTED BY HASH(k1) BUCKETS 10\n" +
+                "PROPERTIES(\"replication_num\" = \"1\");");
+
+        String sql = "explain select * from out_join_1 left join out_join_2 on 
out_join_1.k1 = out_join_2.k1 and 1=2;";
+        String explainString = 
UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, sql);
+        Assert.assertFalse(explainString.contains("non-equal LEFT OUTER JOIN 
is not supported"));
+
+        sql = "explain select * from out_join_1 right join out_join_2 on 
out_join_1.k1 = out_join_2.k1 and 1=2;";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, sql);
+        Assert.assertFalse(explainString.contains("non-equal RIGHT OUTER JOIN 
is not supported"));
+
+        sql = "explain select * from out_join_1 full join out_join_2 on 
out_join_1.k1 = out_join_2.k1 and 1=2;";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, sql);
+        Assert.assertFalse(explainString.contains("non-equal FULL OUTER JOIN 
is not supported"));
+
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to