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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]