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 <59271430+songzhxlh-...@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)); + } }