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

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


The following commit(s) were added to refs/heads/master by this push:
     new 531cf11  [BUG] Some function in odbc external table different in Doris 
(#4625) (#4626)
531cf11 is described below

commit 531cf11e6e0b61f4ca1eb362966752051b9d153e
Author: HappenLee <happen...@hotmail.com>
AuthorDate: Sun Sep 20 20:56:36 2020 +0800

    [BUG] Some function in odbc external table different in Doris (#4625) 
(#4626)
    
    Now Doris do not push down filter contains function in OdbcScanNode
    Except Mysql external table.
---
 .../org/apache/doris/planner/OdbcScanNode.java     | 22 ++++++++++++--
 .../org/apache/doris/planner/QueryPlanTest.java    | 34 +++++++++++++++++++++-
 2 files changed, 52 insertions(+), 4 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java
index 6337465..66928d2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OdbcScanNode.java
@@ -20,6 +20,7 @@ package org.apache.doris.planner;
 import org.apache.doris.analysis.Analyzer;
 import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.ExprSubstitutionMap;
+import org.apache.doris.analysis.FunctionCallExpr;
 import org.apache.doris.analysis.SlotDescriptor;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.analysis.TupleDescriptor;
@@ -58,10 +59,22 @@ public class OdbcScanNode extends ScanNode {
             case MYSQL:
                 return mysqlProperName(name);
         }
-
         return name;
     }
 
+    // Now some database have different function call like doris, now doris do 
not
+    // push down the function call except MYSQL
+    private static boolean needPushDown(TOdbcTableType tableType, Expr expr) {
+        if (!tableType.equals(TOdbcTableType.MYSQL)) {
+            List<FunctionCallExpr> fnExprList = Lists.newArrayList();
+            expr.collect(FunctionCallExpr.class, fnExprList);
+            if (!fnExprList.isEmpty()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     private final List<String> columns = new ArrayList<String>();
     private final List<String> filters = new ArrayList<String>();
     private String tblName;
@@ -144,8 +157,11 @@ public class OdbcScanNode extends ScanNode {
         }
         ArrayList<Expr> odbcConjuncts = Expr.cloneList(conjuncts, sMap);
         for (Expr p : odbcConjuncts) {
-            String filter = p.toMySql();
-            filters.add(filter);
+            if (needPushDown(odbcType, p)) {
+                String filter = p.toMySql();
+                filters.add(filter);
+                conjuncts.remove(p);
+            }
         }
     }
 
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 45058cf..b66823e 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
@@ -335,7 +335,7 @@ public class QueryPlanTest {
                 ");");
 
         Config.enable_odbc_table = true;
-        createTable("create external table test.odbc_mysql\n" +
+        createTable("create external table test.odbc_oracle\n" +
                 "(k1 int, k2 int)\n" +
                 "ENGINE=ODBC\n" +
                 "PROPERTIES (\n" +
@@ -348,6 +348,20 @@ public class QueryPlanTest {
                 "\"driver\" = \"Oracle Driver\",\n" +
                 "\"type\" = \"oracle\"\n" +
                 ");");
+
+        createTable("create external table test.odbc_mysql\n" +
+                "(k1 int, k2 int)\n" +
+                "ENGINE=ODBC\n" +
+                "PROPERTIES (\n" +
+                "\"host\" = \"127.0.0.1\",\n" +
+                "\"port\" = \"3306\",\n" +
+                "\"user\" = \"root\",\n" +
+                "\"password\" = \"123\",\n" +
+                "\"database\" = \"db1\",\n" +
+                "\"table\" = \"tbl1\",\n" +
+                "\"driver\" = \"Oracle Driver\",\n" +
+                "\"type\" = \"mysql\"\n" +
+                ");");
     }
 
     @AfterClass
@@ -1081,6 +1095,24 @@ public class QueryPlanTest {
     }
 
     @Test
+    public void testPushDownOfOdbcTable() throws Exception {
+        connectContext.setDatabase("default_cluster:test");
+
+        // MySQL ODBC table can push down all filter
+        String queryStr = "explain select * from odbc_mysql where k1 > 10 and 
abs(k1) > 10";
+        String explainString = 
UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);
+        Assert.assertTrue(explainString.contains("`k1` > 10"));
+        Assert.assertTrue(explainString.contains("abs(`k1`) > 10"));
+
+        // now we do not support odbc scan node push down function call, 
except MySQL ODBC table
+        // this table is Oracle ODBC table, so abs(k1) should not be pushed 
down
+        queryStr = "explain select * from odbc_oracle where k1 > 10 and 
abs(k1) > 10";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
queryStr);
+        Assert.assertTrue(explainString.contains("k1 > 10"));
+        Assert.assertTrue(!explainString.contains("abs(k1) > 10"));
+    }
+
+    @Test
     public void testPreferBroadcastJoin() throws Exception {
         connectContext.setDatabase("default_cluster:test");
         String queryStr = "explain select * from (select k1 from jointest 
group by k1)t2, jointest t1 where t1.k1 = t2.k1";


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

Reply via email to