Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
49e84734
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,发现更多精彩内容 >>
提交
49e84734
编写于
6月 13, 2017
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixed error [#CLICKHOUSE-2].
上级
8ba0ed9a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
34 addition
and
32 deletion
+34
-32
dbms/src/Functions/FunctionsArray.cpp
dbms/src/Functions/FunctionsArray.cpp
+34
-32
未找到文件。
dbms/src/Functions/FunctionsArray.cpp
浏览文件 @
49e84734
...
...
@@ -15,7 +15,6 @@
#include <Interpreters/AggregationCommon.h>
#include <Columns/ColumnTuple.h>
#include <Columns/ColumnAggregateFunction.h>
#include <boost/iterator/counting_iterator.hpp>
#include <tuple>
#include <array>
...
...
@@ -907,7 +906,8 @@ bool FunctionArrayElement::executeConstConst(Block & block, const ColumnNumbers
Field
value
;
if
(
real_index
<
array_size
)
value
=
array
.
at
(
real_index
);
else
if
(
value
.
isNull
())
value
=
block
.
getByPosition
(
result
).
type
->
getDefault
();
block
.
getByPosition
(
result
).
column
=
block
.
getByPosition
(
result
).
type
->
createConstColumn
(
...
...
@@ -1162,14 +1162,14 @@ void FunctionArrayElement::perform(Block & block, const ColumnNumbers & argument
}
else
if
(
!
block
.
safeGetByPosition
(
arguments
[
1
]).
column
->
isConst
())
{
if
(
!
(
executeArgument
<
UInt8
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
UInt16
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
UInt32
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
UInt64
>
(
block
,
arguments
,
result
,
builder
)
if
(
!
(
executeArgument
<
UInt8
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
UInt16
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
UInt32
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
UInt64
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
Int8
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
Int16
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
Int32
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
Int64
>
(
block
,
arguments
,
result
,
builder
)))
||
executeArgument
<
Int16
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
Int32
>
(
block
,
arguments
,
result
,
builder
)
||
executeArgument
<
Int64
>
(
block
,
arguments
,
result
,
builder
)))
throw
Exception
(
"Second argument for function "
+
getName
()
+
" must must have UInt or Int type."
,
ErrorCodes
::
ILLEGAL_COLUMN
);
}
...
...
@@ -1183,19 +1183,19 @@ void FunctionArrayElement::perform(Block & block, const ColumnNumbers & argument
if
(
index
==
UInt64
(
0
))
throw
Exception
(
"Array indices is 1-based"
,
ErrorCodes
::
ZERO_ARRAY_OR_TUPLE_INDEX
);
if
(
!
(
executeNumberConst
<
UInt8
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
UInt16
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
UInt32
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
UInt64
>
(
block
,
arguments
,
result
,
index
,
builder
)
if
(
!
(
executeNumberConst
<
UInt8
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
UInt16
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
UInt32
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
UInt64
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Int8
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Int16
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Int32
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Int64
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Float32
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Float64
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeConstConst
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeStringConst
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeGenericConst
(
block
,
arguments
,
result
,
index
,
builder
)))
||
executeNumberConst
<
Int16
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Int32
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Int64
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Float32
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeNumberConst
<
Float64
>
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeConstConst
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeStringConst
(
block
,
arguments
,
result
,
index
,
builder
)
||
executeGenericConst
(
block
,
arguments
,
result
,
index
,
builder
)))
throw
Exception
(
"Illegal column "
+
block
.
safeGetByPosition
(
arguments
[
0
]).
column
->
getName
()
+
" of first argument of function "
+
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
...
...
@@ -2355,11 +2355,13 @@ bool FunctionRange::executeInternal(Block & block, const IColumn * const arg, co
auto
&
out_offsets
=
out
->
getOffsets
();
IColumn
::
Offset_t
offset
{};
for
(
const
auto
i
:
ext
::
range
(
0
,
in
->
size
())
)
for
(
size_t
row_idx
=
0
,
rows
=
in
->
size
();
row_idx
<
rows
;
++
row_idx
)
{
std
::
copy
(
boost
::
counting_iterator
<
T
>
(),
boost
::
counting_iterator
<
T
>
(
in_data
[
i
]),
&
out_data
[
offset
]);
offset
+=
in_data
[
i
];
out_offsets
[
i
]
=
offset
;
for
(
size_t
elem_idx
=
0
,
elems
=
in_data
[
row_idx
];
elem_idx
<
elems
;
++
elem_idx
)
out_data
[
offset
+
elem_idx
]
=
elem_idx
;
offset
+=
in_data
[
row_idx
];
out_offsets
[
row_idx
]
=
offset
;
}
return
true
;
...
...
@@ -2370,16 +2372,14 @@ bool FunctionRange::executeInternal(Block & block, const IColumn * const arg, co
if
((
in_data
!=
0
)
&&
(
in
->
size
()
>
(
std
::
numeric_limits
<
std
::
size_t
>::
max
()
/
in_data
)))
throw
Exception
{
"A call to function "
+
getName
()
+
" overflows, investigate the values of arguments you are passing"
,
ErrorCodes
::
ARGUMENT_OUT_OF_BOUND
};
ErrorCodes
::
ARGUMENT_OUT_OF_BOUND
};
const
std
::
size_t
total_values
=
in
->
size
()
*
in_data
;
if
(
total_values
>
max_elements
)
throw
Exception
{
"A call to function "
+
getName
()
+
" would produce "
+
std
::
to_string
(
total_values
)
+
" array elements, which is greater than the allowed maximum of "
+
std
::
to_string
(
max_elements
),
ErrorCodes
::
ARGUMENT_OUT_OF_BOUND
};
ErrorCodes
::
ARGUMENT_OUT_OF_BOUND
};
const
auto
data_col
=
std
::
make_shared
<
ColumnVector
<
T
>>
(
total_values
);
const
auto
out
=
std
::
make_shared
<
ColumnArray
>
(
...
...
@@ -2391,11 +2391,13 @@ bool FunctionRange::executeInternal(Block & block, const IColumn * const arg, co
auto
&
out_offsets
=
out
->
getOffsets
();
IColumn
::
Offset_t
offset
{};
for
(
const
auto
i
:
ext
::
range
(
0
,
in
->
size
())
)
for
(
size_t
row_idx
=
0
,
rows
=
in
->
size
();
row_idx
<
rows
;
++
row_idx
)
{
std
::
copy
(
boost
::
counting_iterator
<
T
>
(),
boost
::
counting_iterator
<
T
>
(
in_data
),
&
out_data
[
offset
]);
for
(
size_t
elem_idx
=
0
,
elems
=
in_data
;
elem_idx
<
elems
;
++
elem_idx
)
out_data
[
offset
+
elem_idx
]
=
elem_idx
;
offset
+=
in_data
;
out_offsets
[
i
]
=
offset
;
out_offsets
[
row_idx
]
=
offset
;
}
return
true
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录