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));
+    }
 }