From f412ae4539d42c3e456f9849d0d5b313059f96af Mon Sep 17 00:00:00 2001 From: Hwwwww <47653238+HwwwwwLemon@users.noreply.github.com> Date: Mon, 10 Feb 2025 18:55:32 +0800 Subject: [PATCH] [fix][headless] Fix having and alias column not enclosed in backticks. (#2042) --- .../common/jsqlparser/SqlReplaceHelper.java | 12 ++++++++++++ .../common/jsqlparser/SqlReplaceHelperTest.java | 9 +++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelper.java b/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelper.java index 33f8947fa..ace2293e8 100644 --- a/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelper.java +++ b/common/src/main/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelper.java @@ -516,6 +516,18 @@ public class SqlReplaceHelper { if (Objects.nonNull(groupByElement)) { groupByElement.accept(new GroupByReplaceVisitor(aliasReplacedMap, true)); } + // Alias columns + for (SelectItem selectItem : plainSelect.getSelectItems()) { + if (selectItem.getExpression() instanceof Column){ + replaceColumn((Column) selectItem.getExpression(), aliasReplacedMap, true); + } + } + // Having + Expression having = plainSelect.getHaving(); + if (Objects.nonNull(having)) { + ExpressionReplaceVisitor expressionReplaceVisitor = new ExpressionReplaceVisitor(aliasReplacedMap); + having.accept(expressionReplaceVisitor); + } return selectStatement.toString(); } diff --git a/common/src/test/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelperTest.java b/common/src/test/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelperTest.java index 86e462024..00ef3265d 100644 --- a/common/src/test/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelperTest.java +++ b/common/src/test/java/com/tencent/supersonic/common/jsqlparser/SqlReplaceHelperTest.java @@ -321,14 +321,15 @@ class SqlReplaceHelperTest { + "'2023-09-05') <= 3) AND 数据日期 = '2023-10-10' GROUP BY 部门 ORDER BY `访问次数` DESC LIMIT 10", replaceSql); - sql = "select 部门, sum(访问次数) as 访问次数, count(部门) as 部门数, count(部门) as 部门数2 from 超音数 where " + sql = "select 部门, sum(访问次数) as 访问次数, count(部门) as 部门数, count(部门) as 部门数2, 访问次数 from 超音数 where " + "(datediff('day', 数据日期, '2023-09-05') <= 3) and 数据日期 = '2023-10-10' " - + "group by 部门, 部门数, 部门数2 order by 访问次数 desc limit 10"; + + "group by 部门, 部门数, 部门数2 having 访问次数 > 1 AND 部门数2 > 2 AND 部门数 > 1 AND 访问次数 > 1 order by 访问次数 desc limit 10"; replaceSql = SqlReplaceHelper.replaceAliasWithBackticks(sql); System.out.println(replaceSql); - Assert.assertEquals("SELECT 部门, sum(访问次数) AS `访问次数`, count(部门) AS `部门数`, count(部门) AS `部门数2` FROM 超音数 WHERE (datediff('day', 数据日期, " - + "'2023-09-05') <= 3) AND 数据日期 = '2023-10-10' GROUP BY 部门, `部门数`, `部门数2` ORDER BY `访问次数` DESC LIMIT 10", + Assert.assertEquals("SELECT 部门, sum(访问次数) AS `访问次数`, count(部门) AS `部门数`, count(部门) AS `部门数2`, `访问次数` FROM 超音数 WHERE (datediff('day', 数据日期, " + + "'2023-09-05') <= 3) AND 数据日期 = '2023-10-10' GROUP BY 部门, `部门数`, `部门数2` HAVING `访问次数` > 1 AND `部门数2` > 2 AND `部门数` > 1 AND `访问次数` > 1 ORDER BY `访问次数` DESC LIMIT 10", replaceSql); + } @Test