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