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