This is an automated email from the ASF dual-hosted git repository.

lijibing 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 9229dcd62ab [fix](statistics)Escape fetch partition stats sql. (#36941)
9229dcd62ab is described below

commit 9229dcd62ab91bf9a8939c6f58d5851cdfde0ead
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Fri Jun 28 20:51:52 2024 +0800

    [fix](statistics)Escape fetch partition stats sql. (#36941)
    
    Sql to fetch partition stats need to be escaped.
---
 .../apache/doris/statistics/AnalysisManager.java   |  2 +-
 .../PartitionColumnStatisticCacheLoader.java       |  2 +-
 .../doris/statistics/StatisticsRepository.java     |  6 ++---
 .../suites/statistics/test_partition_stats.groovy  | 27 ++++++++++++++++++++++
 4 files changed, 32 insertions(+), 5 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
index 22bc11971c2..1e95adf1714 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
@@ -788,7 +788,7 @@ public class AnalysisManager implements Writable {
         StringBuilder partNamePredicate = new StringBuilder();
         while (iterator.hasNext()) {
             partNamePredicate.append("'");
-            partNamePredicate.append(iterator.next());
+            
partNamePredicate.append(StatisticsUtil.escapeSQL(iterator.next()));
             partNamePredicate.append("'");
             partNamePredicate.append(",");
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/PartitionColumnStatisticCacheLoader.java
 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/PartitionColumnStatisticCacheLoader.java
index ac807a0d5f7..c365f6b1a74 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/PartitionColumnStatisticCacheLoader.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/PartitionColumnStatisticCacheLoader.java
@@ -57,7 +57,7 @@ public class PartitionColumnStatisticCacheLoader extends
     private Optional<PartitionColumnStatistic> 
loadFromPartitionStatsTable(PartitionColumnStatisticCacheKey key) {
         List<ResultRow> partitionResults;
         try {
-            String partName = "'" + key.partId + "'";
+            String partName = "'" + StatisticsUtil.escapeSQL(key.partId) + "'";
             partitionResults = StatisticsRepository.loadPartitionColumnStats(
                 key.catalogId, key.dbId, key.tableId, key.idxId, partName, 
key.colName);
         } catch (InternalQueryExecutionException e) {
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 bbcc9de3a28..81192762f99 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
@@ -144,12 +144,12 @@ public class StatisticsRepository {
         params.put("tableId", String.valueOf(table.getId()));
         StringJoiner sj = new StringJoiner(",");
         for (String colName : columnNames) {
-            sj.add("'" + colName + "'");
+            sj.add("'" + StatisticsUtil.escapeSQL(colName) + "'");
         }
         params.put("columnInfo", sj.toString());
         sj = new StringJoiner(",");
         for (String part : partitionNames) {
-            sj.add("'" + part + "'");
+            sj.add("'" + StatisticsUtil.escapeSQL(part) + "'");
         }
         params.put("partitionInfo", sj.toString());
         return 
StatisticsUtil.executeQuery(FETCH_PARTITIONS_STATISTIC_TEMPLATE, params);
@@ -418,7 +418,7 @@ public class StatisticsRepository {
         params.put("tableId", String.valueOf(tableId));
         params.put("indexId", String.valueOf(idxId));
         params.put("partName", partName);
-        params.put("columnId", colName);
+        params.put("columnId", StatisticsUtil.escapeSQL(colName));
         return StatisticsUtil.execStatisticQuery(new StringSubstitutor(params)
             .replace(FETCH_PARTITION_STATISTIC_TEMPLATE));
     }
diff --git a/regression-test/suites/statistics/test_partition_stats.groovy 
b/regression-test/suites/statistics/test_partition_stats.groovy
index 7658d50c47e..05216477323 100644
--- a/regression-test/suites/statistics/test_partition_stats.groovy
+++ b/regression-test/suites/statistics/test_partition_stats.groovy
@@ -928,6 +928,33 @@ suite("test_partition_stats") {
     assertEquals("1", result[0][7])
     assertEquals("20004", result[0][8])
 
+    // Test escape special col name.
+    sql """
+        create table part9(
+            k int null,
+            v variant null
+        )
+        duplicate key (k)
+        PARTITION BY RANGE(`k`)
+        (
+            PARTITION p1 VALUES [("0"), ("2")),
+            PARTITION p2 VALUES [("2"), ("4")),
+            PARTITION p3 VALUES [("4"), ("6"))
+        )
+        distributed BY hash(k) buckets 3
+        properties("replication_num" = "1");
+    """
+    sql """insert into part9 select 1,'{"k1" : 1, "k2" : 1, "k3" : "a"}';"""
+    sql """insert into part9 select 2,'{"k1" : 2, "k2" : 2, "k3" : "b"}';"""
+    sql """insert into part9 select 3,'{"k1" : 3, "k2" : null, "k3" : "c"}';"""
+    sql """insert into part9 select 4,'{"k1" : 4, "k2" : null, "k4" : {"k44" : 
456}}';"""
+    createMV("create materialized view mv1 as select abs(cast(v['k4']['k44'] 
as int)), sum(abs(cast(v['k2'] as int)+2)+3) from part9 group by 
abs(cast(v['k4']['k44'] as int));")
+    sql """analyze table part9 with sync"""
+    result = sql """show column cached stats part9 partition(*)"""
+    assertEquals(9, result.size())
+    result = sql """show column stats part9 partition(*)"""
+    assertEquals(9, result.size())
+
     sql """drop database test_partition_stats"""
 }
 


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

Reply via email to