Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
9b0da245
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9b0da245
编写于
10月 22, 2015
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dbms: allowed to GROUP BY constants with no aggregates [#METR-18298].
上级
7fcae3dd
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
73 addition
and
6 deletion
+73
-6
dbms/src/Interpreters/ExpressionAnalyzer.cpp
dbms/src/Interpreters/ExpressionAnalyzer.cpp
+29
-6
dbms/tests/queries/0_stateless/00257_no_aggregates_and_constant_keys.reference
...stateless/00257_no_aggregates_and_constant_keys.reference
+29
-0
dbms/tests/queries/0_stateless/00257_no_aggregates_and_constant_keys.sql
...ies/0_stateless/00257_no_aggregates_and_constant_keys.sql
+15
-0
未找到文件。
dbms/src/Interpreters/ExpressionAnalyzer.cpp
浏览文件 @
9b0da245
...
...
@@ -211,13 +211,17 @@ void ExpressionAnalyzer::analyzeAggregation()
/// constant expressions have non-null column pointer at this stage
if
(
const
auto
is_constexpr
=
col
.
column
)
{
if
(
i
<
group_asts
.
size
()
-
1
)
group_asts
[
i
]
=
std
::
move
(
group_asts
.
back
());
/// but don't remove last key column if no aggregate functions, otherwise aggregation will not work
if
(
!
aggregate_descriptions
.
empty
()
||
group_asts
.
size
()
>
1
)
{
if
(
i
<
group_asts
.
size
()
-
1
)
group_asts
[
i
]
=
std
::
move
(
group_asts
.
back
());
group_asts
.
pop_back
();
i
-=
1
;
group_asts
.
pop_back
();
i
-=
1
;
continue
;
continue
;
}
}
NameAndTypePair
key
{
column_name
,
col
.
type
};
...
...
@@ -781,7 +785,26 @@ void ExpressionAnalyzer::optimizeGroupBy()
}
if
(
group_exprs
.
empty
())
select_query
->
group_expression_list
=
nullptr
;
{
/** Нельзя полностью убирать GROUP BY. Потому что если при этом даже агрегатных функций не было, то получится, что не будет агрегации.
* Вместо этого оставим GROUP BY const.
* Далее см. удаление констант в методе analyzeAggregation.
*/
/// Нужно вставить константу, которая не является именем столбца таблицы. Такой случай редкий, но бывает.
UInt64
unused_column
=
0
;
String
unused_column_name
=
toString
(
unused_column
);
while
(
columns
.
end
()
!=
std
::
find_if
(
columns
.
begin
(),
columns
.
end
(),
[
&
unused_column_name
](
const
NameAndTypePair
&
name_type
)
{
return
name_type
.
name
==
unused_column_name
;
}))
{
++
unused_column
;
unused_column_name
=
toString
(
unused_column
);
}
select_query
->
group_expression_list
=
new
ASTExpressionList
;
select_query
->
group_expression_list
->
children
.
push_back
(
new
ASTLiteral
(
StringRange
(),
UInt64
(
unused_column
)));
}
}
...
...
dbms/tests/queries/0_stateless/00257_no_aggregates_and_constant_keys.reference
0 → 100644
浏览文件 @
9b0da245
40
41
2 42
43
11
40
40
41
41
2 42
2 42
43
43
11
11
11
11
1
1
2
2
dbms/tests/queries/0_stateless/00257_no_aggregates_and_constant_keys.sql
0 → 100644
浏览文件 @
9b0da245
select
40
as
z
from
(
select
*
from
system
.
numbers
limit
3
)
group
by
z
;
select
41
as
z
from
remote
(
'127.0.0.{1,2}'
,
system
.
one
)
group
by
z
;
select
count
(),
42
AS
z
from
remote
(
'127.0.0.{1,2}'
,
system
.
one
)
group
by
z
;
select
43
AS
z
from
remote
(
'127.0.0.{1,2}'
,
system
.
one
)
group
by
42
,
43
,
44
;
select
11
AS
z
from
(
SELECT
2
UNION
ALL
SELECT
3
)
group
by
42
,
43
,
44
;
select
40
as
z
from
(
select
*
from
system
.
numbers
limit
3
)
group
by
z
WITH
TOTALS
;
select
41
as
z
from
remote
(
'127.0.0.{1,2}'
,
system
.
one
)
group
by
z
WITH
TOTALS
;
select
count
(),
42
AS
z
from
remote
(
'127.0.0.{1,2}'
,
system
.
one
)
group
by
z
WITH
TOTALS
;
select
43
AS
z
from
remote
(
'127.0.0.{1,2}'
,
system
.
one
)
group
by
42
,
43
,
44
WITH
TOTALS
;
select
11
AS
z
from
(
SELECT
1
UNION
ALL
SELECT
2
)
group
by
42
,
43
,
44
WITH
TOTALS
;
select
11
AS
z
from
(
SELECT
2
UNION
ALL
SELECT
3
)
group
by
42
,
43
,
44
WITH
TOTALS
;
SELECT
count
()
WITH
TOTALS
;
SELECT
count
()
FROM
remote
(
'127.0.0.{1,2}'
,
system
.
one
)
WITH
TOTALS
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录