You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/12/11 12:25:29 UTC

(doris) branch master updated: [fix](statistics)Escape load stats sql (#28117)

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/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new cd3d31ba133 [fix](statistics)Escape load stats sql (#28117)
cd3d31ba133 is described below

commit cd3d31ba1339567670dfb1d7fab7e79fdd40ea65
Author: Jibing-Li <64...@users.noreply.github.com>
AuthorDate: Mon Dec 11 20:25:18 2023 +0800

    [fix](statistics)Escape load stats sql (#28117)
    
    Escape load stats sql, because column name may contain special characters.
---
 .../apache/doris/statistics/OlapAnalysisTask.java  |  4 ++--
 .../doris/statistics/StatisticsRepository.java     |  4 ++--
 .../java/org/apache/doris/statistics/StatsId.java  |  4 ++--
 .../suites/statistics/analyze_stats.groovy         | 28 ++++++++++++++++++++++
 4 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
index 4d414563ebd..50042e4610f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
@@ -112,7 +112,7 @@ public class OlapAnalysisTask extends BaseAnalysisTask {
             params.put("dbId", String.valueOf(db.getId()));
             params.put("tblId", String.valueOf(tbl.getId()));
             params.put("idxId", String.valueOf(info.indexId));
-            params.put("colId", String.valueOf(info.colName));
+            params.put("colId", StatisticsUtil.escapeSQL(String.valueOf(info.colName)));
             params.put("dataSizeFunction", getDataSizeFunction(col, false));
             params.put("dbName", db.getFullName());
             params.put("colName", info.colName);
@@ -184,7 +184,7 @@ public class OlapAnalysisTask extends BaseAnalysisTask {
         params.put("dbId", String.valueOf(db.getId()));
         params.put("tblId", String.valueOf(tbl.getId()));
         params.put("idxId", String.valueOf(info.indexId));
-        params.put("colId", String.valueOf(info.colName));
+        params.put("colId", StatisticsUtil.escapeSQL(String.valueOf(info.colName)));
         params.put("dataSizeFunction", getDataSizeFunction(col, false));
         params.put("catalogName", catalog.getName());
         params.put("dbName", db.getFullName());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java
index 4512bf1feff..6e429f033f8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java
@@ -142,7 +142,7 @@ public class StatisticsRepository {
     private static ResultRow queryColumnStatisticById(long tblId, String colName, boolean isHistogram) {
         Map<String, String> map = new HashMap<>();
         String id = constructId(tblId, -1, colName);
-        map.put("id", id);
+        map.put("id", StatisticsUtil.escapeSQL(id));
         List<ResultRow> rows = isHistogram ? StatisticsUtil.executeQuery(FETCH_COLUMN_HISTOGRAM_TEMPLATE, map) :
                 StatisticsUtil.executeQuery(FETCH_COLUMN_STATISTIC_TEMPLATE, map);
         int size = rows.size();
@@ -336,7 +336,7 @@ public class StatisticsRepository {
         Map<String, String> params = new HashMap<>();
         params.put("tblId", String.valueOf(tableId));
         params.put("idxId", String.valueOf(idxId));
-        params.put("colId", colName);
+        params.put("colId", StatisticsUtil.escapeSQL(colName));
 
         return StatisticsUtil.execStatisticQuery(new StringSubstitutor(params)
                 .replace(QUERY_COLUMN_STATISTICS));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsId.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsId.java
index a636054cc07..21395638cd6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsId.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatsId.java
@@ -69,12 +69,12 @@ public class StatsId {
 
     public String toSQL() {
         StringJoiner sj = new StringJoiner(",");
-        sj.add(StatisticsUtil.quote(id));
+        sj.add(StatisticsUtil.quote(StatisticsUtil.escapeSQL(id)));
         sj.add(String.valueOf(catalogId));
         sj.add(String.valueOf(dbId));
         sj.add(String.valueOf(tblId));
         sj.add(String.valueOf(idxId));
-        sj.add(StatisticsUtil.quote(colId));
+        sj.add(StatisticsUtil.quote(StatisticsUtil.escapeSQL(colId)));
         sj.add(partId);
         return sj.toString();
     }
diff --git a/regression-test/suites/statistics/analyze_stats.groovy b/regression-test/suites/statistics/analyze_stats.groovy
index f9a5ede91be..e09cfd8118a 100644
--- a/regression-test/suites/statistics/analyze_stats.groovy
+++ b/regression-test/suites/statistics/analyze_stats.groovy
@@ -1434,4 +1434,32 @@ PARTITION `p599` VALUES IN (599)
     assertEquals("0.0", result[0][5])
     assertEquals("N/A", result[0][6])
     assertEquals("N/A", result[0][7])
+
+    // Test analyze column with special character in name.
+    sql """
+      CREATE TABLE region  (
+       `r_regionkey`      int NOT NULL,
+       `r'name`     VARCHAR(25) NOT NULL,
+       `r_comment`    VARCHAR(152)
+      )ENGINE=OLAP
+      DUPLICATE KEY(`r_regionkey`)
+      COMMENT "OLAP"
+      DISTRIBUTED BY HASH(`r_regionkey`) BUCKETS 1
+      PROPERTIES (
+       "replication_num" = "1"
+      );
+   """
+   sql """insert into region values(1,'name1', 'comment1') """
+   sql """insert into region values(2,'name2', 'comment2') """
+   sql """insert into region values(3,'name3', 'comment3') """
+   sql """ANALYZE TABLE region WITH SYNC"""
+   result = sql """show column stats region (`r'name`);"""
+   assertEquals(1, result.size())
+   assertEquals("r'name", result[0][0])
+   assertEquals("3.0", result[0][1])
+   assertEquals("3.0", result[0][2])
+   assertEquals("0.0", result[0][3])
+   assertEquals("\'name1\'", result[0][6])
+   assertEquals("\'name3\'", result[0][7])
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org