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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]