You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ni...@apache.org on 2020/02/02 09:13:49 UTC
[kylin] 01/02: KYLIN-4365 fix RDBMS pushdown with clause bug
This is an automated email from the ASF dual-hosted git repository.
nic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 609ce65d5bfa18ee4021fde3d96c0b8b22c5382e
Author: woyumen4597 <wo...@gmail.com>
AuthorDate: Sat Feb 1 13:56:53 2020 +0800
KYLIN-4365 fix RDBMS pushdown with clause bug
---
.../org/apache/kylin/query/util/PushDownUtil.java | 27 ++++++++++++++++------
.../apache/kylin/query/util/PushDownUtilTest.java | 7 ++++++
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java b/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java
index 4d69272..2167fdd 100644
--- a/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java
+++ b/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java
@@ -24,7 +24,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-
import org.apache.calcite.sql.SqlBasicCall;
import org.apache.calcite.sql.SqlCall;
import org.apache.calcite.sql.SqlDataTypeSpec;
@@ -41,16 +40,14 @@ import org.apache.calcite.sql.SqlWith;
import org.apache.calcite.sql.SqlWithItem;
import org.apache.calcite.sql.parser.SqlParseException;
import org.apache.calcite.sql.util.SqlVisitor;
-
import org.apache.commons.lang.text.StrBuilder;
-
import org.apache.kylin.common.util.Pair;
import org.apache.kylin.metadata.model.tool.CalciteParser;
import org.apache.kylin.metadata.querymeta.SelectedColumnMeta;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.collect.Lists;
public class PushDownUtil {
private static final Logger logger = LoggerFactory.getLogger(PushDownUtil.class);
@@ -103,8 +100,7 @@ public class PushDownUtil {
StrBuilder afterConvert = new StrBuilder(inputSql);
for (Pair<Integer, Integer> pos : tablesPos) {
- String tableWithSchema = schema + "." + inputSql.substring(pos.getFirst(),
- pos.getSecond());
+ String tableWithSchema = schema + "." + inputSql.substring(pos.getFirst(), pos.getSecond());
afterConvert.replace(pos.getFirst(), pos.getSecond(), tableWithSchema);
}
return afterConvert.toString();
@@ -116,13 +112,26 @@ public class PushDownUtil {
*/
static class FromTablesVisitor implements SqlVisitor<SqlNode> {
private List<SqlNode> tables;
+ private List<SqlNode> withTables;
FromTablesVisitor() {
this.tables = new ArrayList<>();
+ this.withTables = new ArrayList<>();
}
List<SqlNode> getTablesWithoutSchema() {
- return tables;
+ List<SqlNode> sqlNodes = Lists.newArrayList();
+ List<String> withs = Lists.newArrayList();
+ for (SqlNode withTable : withTables) {
+ withs.add(((SqlIdentifier) withTable).names.get(0)); // with clause not allow database.table pattern
+ }
+ for (SqlNode table : tables) {
+ SqlIdentifier identifier = (SqlIdentifier) table;
+ if (!withs.contains(identifier.names.get(0))) {
+ sqlNodes.add(identifier);
+ }
+ }
+ return sqlNodes;
}
@Override
@@ -156,6 +165,10 @@ public class PushDownUtil {
}
if (call instanceof SqlWith) {
SqlWith sqlWith = (SqlWith) call;
+ List<SqlNode> list = sqlWith.withList.getList();
+ for (SqlNode sqlNode : list) {
+ withTables.add(((SqlWithItem) sqlNode).name);
+ }
sqlWith.body.accept(this);
sqlWith.withList.accept(this);
}
diff --git a/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java b/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java
index f23010e..81fb68b 100644
--- a/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java
+++ b/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java
@@ -124,4 +124,11 @@ public class PushDownUtilTest {
"ORDER BY c_customer_id limit 5"; //
Assert.assertEquals(expected, PushDownUtil.schemaCompletion(ori, "EDW"));
}
+
+ @Test
+ public void testWithSyntax2() throws SqlParseException {
+ String origin = "with tmp as (select id from a),tmp2 as (select * from b) select * from tmp,tmp2 where tmp.id = tmp2.id";
+ String expected = "with tmp as (select id from ssb.a),tmp2 as (select * from ssb.b) select * from tmp,tmp2 where tmp.id = tmp2.id";
+ Assert.assertEquals(expected, PushDownUtil.schemaCompletion(origin, "ssb"));
+ }
}