Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
cfc4c987
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,体验更适合开发者的 AI 搜索 >>
提交
cfc4c987
编写于
5月 12, 2017
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added optional length parameter to aggregate function groupArrayInsertAt [#CLICKHOUSE-3003].
上级
40595ce6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
38 addition
and
5 deletion
+38
-5
dbms/src/AggregateFunctions/AggregateFunctionGroupArrayInsertAt.h
.../AggregateFunctions/AggregateFunctionGroupArrayInsertAt.h
+26
-5
dbms/tests/queries/0_stateless/00459_group_array_insert_at.reference
...queries/0_stateless/00459_group_array_insert_at.reference
+11
-0
dbms/tests/queries/0_stateless/00459_group_array_insert_at.sql
...tests/queries/0_stateless/00459_group_array_insert_at.sql
+1
-0
未找到文件。
dbms/src/AggregateFunctions/AggregateFunctionGroupArrayInsertAt.h
浏览文件 @
cfc4c987
...
...
@@ -34,7 +34,11 @@ namespace ErrorCodes
* If more than one value was inserted to single position, the any value (first in case of single thread) is stored.
* If no values was inserted to some position, then default value will be substituted.
*
* Default value is optional parameter for aggregate function.
* Aggregate function also accept optional parameters:
* - default value to substitute;
* - length to resize result arrays (if you want to have results of same length for all aggregation keys);
*
* If you want to pass length, default value should be also given.
*/
...
...
@@ -51,6 +55,7 @@ class AggregateFunctionGroupArrayInsertAtGeneric final
private:
DataTypePtr
type
;
Field
default_value
;
size_t
length_to_resize
=
0
;
/// zero means - do not do resizing.
public:
String
getName
()
const
override
{
return
"groupArrayInsertAt"
;
}
...
...
@@ -85,16 +90,26 @@ public:
if
(
params
.
empty
())
return
;
if
(
params
.
size
()
!=
1
)
throw
Exception
(
"Aggregate function "
+
getName
()
+
" requires at most one parameter."
,
ErrorCodes
::
NUMBER_OF_ARGUMENTS_DOESNT_MATCH
);
if
(
params
.
size
()
>
2
)
throw
Exception
(
"Aggregate function "
+
getName
()
+
" requires at most two parameters."
,
ErrorCodes
::
NUMBER_OF_ARGUMENTS_DOESNT_MATCH
);
default_value
=
params
[
0
];
default_value
=
params
.
front
();
if
(
params
.
size
()
==
2
)
{
length_to_resize
=
applyVisitor
(
FieldVisitorConvertToNumber
<
size_t
>
(),
params
[
1
]);
}
}
void
addImpl
(
AggregateDataPtr
place
,
const
IColumn
&
column_value
,
const
IColumn
&
column_position
,
size_t
row_num
,
Arena
*
)
const
{
/// TODO Do positions need to be 1-based for this function?
size_t
position
=
column_position
.
get64
(
row_num
);
/// If position is larger than size to which array will be cutted - simply ignore value.
if
(
length_to_resize
&&
position
>=
length_to_resize
)
return
;
if
(
position
>=
AGGREGATE_FUNCTION_GROUP_ARRAY_INSERT_AT_MAX_SIZE
)
throw
Exception
(
"Too large array size: position argument ("
+
toString
(
position
)
+
")"
" is greater or equals to limit ("
+
toString
(
AGGREGATE_FUNCTION_GROUP_ARRAY_INSERT_AT_MAX_SIZE
)
+
")"
,
...
...
@@ -179,7 +194,13 @@ public:
to_data
.
insert
(
default_value
);
}
to_offsets
.
push_back
((
to_offsets
.
empty
()
?
0
:
to_offsets
.
back
())
+
arr
.
size
());
size_t
result_array_size
=
length_to_resize
?
length_to_resize
:
arr
.
size
();
/// Pad array if need.
for
(
size_t
i
=
arr
.
size
();
i
<
result_array_size
;
++
i
)
to_data
.
insert
(
default_value
);
to_offsets
.
push_back
((
to_offsets
.
empty
()
?
0
:
to_offsets
.
back
())
+
result_array_size
);
}
};
...
...
dbms/tests/queries/0_stateless/00459_group_array_insert_at.reference
浏览文件 @
cfc4c987
...
...
@@ -12,3 +12,14 @@
8 [0,0,0,0,0,0,0,0,8]
9 [0,0,0,0,0,0,0,0,0,9]
0 0
0 ['0','-','-','-','-','-','-','-','-','-']
1 ['-','1','-','-','-','-','-','-','-','-']
2 ['-','-','2','-','-','-','-','-','-','-']
3 ['-','-','-','3','-','-','-','-','-','-']
4 ['-','-','-','-','4','-','-','-','-','-']
5 ['-','-','-','-','-','5','-','-','-','-']
6 ['-','-','-','-','-','-','6','-','-','-']
7 ['-','-','-','-','-','-','-','7','-','-']
8 ['-','-','-','-','-','-','-','-','8','-']
9 ['-','-','-','-','-','-','-','-','-','9']
10 ['-','-','-','-','-','-','-','-','-','-']
dbms/tests/queries/0_stateless/00459_group_array_insert_at.sql
浏览文件 @
cfc4c987
...
...
@@ -3,3 +3,4 @@ SELECT groupArrayInsertAt('-')(toString(number), number * 2) FROM (SELECT * FROM
SELECT
groupArrayInsertAt
([
123
])(
range
(
number
),
number
*
2
)
FROM
(
SELECT
*
FROM
system
.
numbers
LIMIT
10
);
SELECT
number
,
groupArrayInsertAt
(
number
,
number
)
FROM
(
SELECT
*
FROM
system
.
numbers
LIMIT
10
)
GROUP
BY
number
ORDER
BY
number
;
SELECT
k
,
ignore
(
groupArrayInsertAt
(
x
,
x
))
FROM
(
SELECT
dummy
AS
k
,
randConstant
()
%
10
AS
x
FROM
remote
(
'127.0.0.{1,1}'
,
system
.
one
))
GROUP
BY
k
ORDER
BY
k
;
SELECT
k
,
groupArrayInsertAt
(
'-'
,
10
)(
toString
(
x
),
x
)
FROM
(
SELECT
number
AS
k
,
number
AS
x
FROM
system
.
numbers
LIMIT
11
)
GROUP
BY
k
ORDER
BY
k
;
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录