You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2023/01/12 09:28:02 UTC
[kylin] 06/17: KYLIN-5393 fix bug when double quote in pushdown sql
This is an automated email from the ASF dual-hosted git repository.
xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git
commit bbcf3df8d7e1eafa0ccc2914e76ff8ac122d0215
Author: songzhxlh-max <59...@users.noreply.github.com>
AuthorDate: Thu Nov 17 14:17:23 2022 +0800
KYLIN-5393 fix bug when double quote in pushdown sql
---
.../org/apache/kylin/query/util/QueryUtil.java | 29 ++++++++++++++++++++++
.../org/apache/kylin/query/util/QueryUtilTest.java | 18 ++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/src/query-common/src/main/java/org/apache/kylin/query/util/QueryUtil.java b/src/query-common/src/main/java/org/apache/kylin/query/util/QueryUtil.java
index ed30dc216c..0429f8a8fa 100644
--- a/src/query-common/src/main/java/org/apache/kylin/query/util/QueryUtil.java
+++ b/src/query-common/src/main/java/org/apache/kylin/query/util/QueryUtil.java
@@ -510,9 +510,38 @@ public class QueryUtil {
"Current step: Massage push-down sql. ");
sql = converter.convert(sql, queryParams.getProject(), queryParams.getDefaultSchema());
}
+
+ sql = replaceDoubleQuoteToSingle(sql);
return sql;
}
+ // To keep the results of cube and pushDown are same, we need to replace here
+ public static String replaceDoubleQuoteToSingle(String originSql) {
+ boolean inStrVal = false;
+ boolean needTransfer = false;
+ char[] res = originSql.toCharArray();
+ for (int i = 0; i < res.length; i++) {
+ if (res[i] == '\'') {
+ if (inStrVal) {
+ if (needTransfer) {
+ res[i - 1] = '\\';
+ needTransfer = false;
+ } else {
+ needTransfer = true;
+ }
+ } else {
+ inStrVal = true;
+ }
+ } else {
+ if (needTransfer) {
+ inStrVal = false;
+ needTransfer = false;
+ }
+ }
+ }
+ return new String(res);
+ }
+
static void initPushDownConvertersIfNeeded(KylinConfig kylinConfig) {
String[] currentConverters = pushDownConverters.stream().map(Object::getClass).map(Class::getCanonicalName)
.toArray(String[]::new);
diff --git a/src/query/src/test/java/org/apache/kylin/query/util/QueryUtilTest.java b/src/query/src/test/java/org/apache/kylin/query/util/QueryUtilTest.java
index 1496a92d72..e5084d71ac 100644
--- a/src/query/src/test/java/org/apache/kylin/query/util/QueryUtilTest.java
+++ b/src/query/src/test/java/org/apache/kylin/query/util/QueryUtilTest.java
@@ -196,6 +196,17 @@ public class QueryUtilTest extends NLocalFileMetadataTestCase {
}
}
+ @Test
+ public void testMassagePushDownSqlWithDoubleQuote() {
+ KylinConfig config = KylinConfig.createKylinConfig(new Properties());
+ String sql = "select '''',trans_id from test_kylin_fact where LSTG_FORMAT_NAME like '%''%' group by trans_id limit 2;";
+ QueryParams queryParams = new QueryParams("", sql, "default", false);
+ queryParams.setKylinConfig(config);
+ String massagedSql = QueryUtil.massagePushDownSql(queryParams);
+ String expectedSql = "select '\\'', `TRANS_ID` from `TEST_KYLIN_FACT` where `LSTG_FORMAT_NAME` like '%\\'%' group by `TRANS_ID` limit 2";
+ Assert.assertEquals(expectedSql, massagedSql);
+ }
+
@Test
public void testInit() {
KylinConfig config = KylinConfig.createKylinConfig(new Properties());
@@ -580,4 +591,11 @@ public class QueryUtilTest extends NLocalFileMetadataTestCase {
"select TRANS_ID as test_limit, ORDER_ID as test_offset from TEST_KYLIN_FACT group by TRANS_ID, ORDER_ID",
targetSQL);
}
+
+ @Test
+ public void testReplaceDoubleQuoteToSingle() {
+ String sql = "select ab from table where aa = '' and bb = '''as''n'''";
+ String resSql = "select ab from table where aa = '' and bb = '\\'as\\'n\\''";
+ Assert.assertEquals(resSql, QueryUtil.replaceDoubleQuoteToSingle(sql));
+ }
}