Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
001ffdfa
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,发现更多精彩内容 >>
提交
001ffdfa
编写于
6月 19, 2015
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dbms: fixed error with higher order functions [#METR-16894].
上级
0180cda4
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
38 addition
and
44 deletion
+38
-44
dbms/include/DB/Columns/ColumnReplicated.h
dbms/include/DB/Columns/ColumnReplicated.h
+0
-25
dbms/include/DB/Columns/IColumnDummy.h
dbms/include/DB/Columns/IColumnDummy.h
+1
-6
dbms/include/DB/Functions/FunctionsHigherOrder.h
dbms/include/DB/Functions/FunctionsHigherOrder.h
+1
-2
dbms/include/DB/Functions/FunctionsMiscellaneous.h
dbms/include/DB/Functions/FunctionsMiscellaneous.h
+8
-11
dbms/src/Functions/FunctionsMiscellaneous.cpp
dbms/src/Functions/FunctionsMiscellaneous.cpp
+1
-0
dbms/tests/queries/0_stateless/00178_function_replicate.reference
...ts/queries/0_stateless/00178_function_replicate.reference
+10
-0
dbms/tests/queries/0_stateless/00178_function_replicate.sql
dbms/tests/queries/0_stateless/00178_function_replicate.sql
+9
-0
dbms/tests/queries/0_stateless/00179_lambdas_with_common_expressions_and_filter.reference
...0179_lambdas_with_common_expressions_and_filter.reference
+5
-0
dbms/tests/queries/0_stateless/00179_lambdas_with_common_expressions_and_filter.sql
...less/00179_lambdas_with_common_expressions_and_filter.sql
+3
-0
未找到文件。
dbms/include/DB/Columns/ColumnReplicated.h
已删除
100644 → 0
浏览文件 @
0180cda4
#pragma once
#include <DB/Columns/IColumnDummy.h>
namespace
DB
{
/** Содержит промежуточные данные для вычисления выражений в функциях высшего порядка.
* Это - вложенный столбец произвольного размера.
* Сам ColumnReplicated притворяется, как столбец указанного в конструкторе размера.
*/
class
ColumnReplicated
final
:
public
IColumnDummy
{
public:
ColumnReplicated
(
size_t
s_
,
ColumnPtr
nested_
)
:
IColumnDummy
(
s_
),
nested
(
nested_
)
{}
std
::
string
getName
()
const
override
{
return
"ColumnReplicated"
;
}
ColumnPtr
cloneDummy
(
size_t
s_
)
const
override
{
return
new
ColumnReplicated
(
s_
,
nested
);
}
ColumnPtr
&
getData
()
{
return
nested
;
}
private:
ColumnPtr
nested
;
};
}
dbms/include/DB/Columns/IColumnDummy.h
浏览文件 @
001ffdfa
...
...
@@ -41,12 +41,7 @@ public:
ColumnPtr
filter
(
const
Filter
&
filt
)
const
override
{
size_t
new_size
=
0
;
for
(
Filter
::
const_iterator
it
=
filt
.
begin
();
it
!=
filt
.
end
();
++
it
)
if
(
*
it
)
++
new_size
;
return
cloneDummy
(
new_size
);
return
cloneDummy
(
countBytesInFilter
(
filt
));
}
ColumnPtr
permute
(
const
Permutation
&
perm
,
size_t
limit
)
const
override
...
...
dbms/include/DB/Functions/FunctionsHigherOrder.h
浏览文件 @
001ffdfa
...
...
@@ -5,7 +5,6 @@
#include <DB/DataTypes/DataTypesNumberFixed.h>
#include <DB/Columns/ColumnArray.h>
#include <DB/Columns/ColumnReplicated.h>
#include <DB/Columns/ColumnExpression.h>
#include <DB/Functions/IFunction.h>
...
...
@@ -580,7 +579,7 @@ public:
ColumnWithNameAndType
replicated_column
=
block
.
getByPosition
(
prerequisites
[
prerequisite_index
]);
replicated_column
.
name
=
name
;
replicated_column
.
column
=
typeid_cast
<
Column
Replicated
&>
(
*
replicated_column
.
column
).
getData
();
replicated_column
.
column
=
typeid_cast
<
Column
Array
&>
(
*
replicated_column
.
column
).
getDataPtr
();
temp_block
.
insert
(
replicated_column
);
++
prerequisite_index
;
...
...
dbms/include/DB/Functions/FunctionsMiscellaneous.h
浏览文件 @
001ffdfa
...
...
@@ -20,7 +20,6 @@
#include <DB/Columns/ColumnSet.h>
#include <DB/Columns/ColumnTuple.h>
#include <DB/Columns/ColumnArray.h>
#include <DB/Columns/ColumnReplicated.h>
#include <DB/Columns/ColumnAggregateFunction.h>
#include <DB/Common/UnicodeBar.h>
#include <DB/Functions/IFunction.h>
...
...
@@ -51,9 +50,8 @@ namespace DB
* arrayJoin(arr) - особая функция - выполнить её напрямую нельзя;
* используется только чтобы получить тип результата соответствующего выражения.
*
* replicate(x, arr) - копирует x столько раз, сколько элементов в массиве arr;
* например: replicate(1, ['a', 'b', 'c']) = 1, 1, 1.
* не предназначена для пользователя, а используется только как prerequisites для функций высшего порядка.
* replicate(x, arr) - создаёт массив такого же размера как arr, все элементы которого равны x;
* например: replicate(1, ['a', 'b', 'c']) = [1, 1, 1].
*
* sleep(n) - спит n секунд каждый блок.
*
...
...
@@ -570,18 +568,15 @@ public:
};
/** Размножает столбец (первый аргумент) по количеству элементов в массиве (втором аргументе).
* Не предназначена для внешнего использования.
* Так как возвращаемый столбец будет иметь несовпадающий размер с исходными,
* то результат не может быть потом использован в том же блоке, что и аргументы.
/** Создаёт массив, размножая столбец (первый аргумент) по количеству элементов в массиве (втором аргументе).
* Используется только в качестве prerequisites для функций высшего порядка.
*/
class
FunctionReplicate
:
public
IFunction
{
public:
static
constexpr
auto
name
=
"replicate"
;
static
IFunction
*
create
(
const
Context
&
context
)
{
return
new
FunctionReplicate
;
}
/// Получить имя функции.
String
getName
()
const
{
...
...
@@ -600,7 +595,7 @@ class FunctionReplicate : public IFunction
if
(
!
array_type
)
throw
Exception
(
"Second argument for function "
+
getName
()
+
" must be array."
,
ErrorCodes
::
ILLEGAL_TYPE_OF_ARGUMENT
);
return
arguments
[
0
]
->
clone
(
);
return
new
DataTypeArray
(
arguments
[
0
]
->
clone
()
);
}
/// Выполнить функцию над блоком.
...
...
@@ -620,7 +615,9 @@ class FunctionReplicate : public IFunction
array_column
=
typeid_cast
<
ColumnArray
*>
(
&*
temp_column
);
}
block
.
getByPosition
(
result
).
column
=
new
ColumnReplicated
(
first_column
->
size
(),
first_column
->
replicate
(
array_column
->
getOffsets
()));
block
.
getByPosition
(
result
).
column
=
new
ColumnArray
(
first_column
->
replicate
(
array_column
->
getOffsets
()),
array_column
->
getOffsetsColumn
());
}
};
...
...
dbms/src/Functions/FunctionsMiscellaneous.cpp
浏览文件 @
001ffdfa
...
...
@@ -326,6 +326,7 @@ void registerFunctionsMiscellaneous(FunctionFactory & factory)
factory
.
registerFunction
<
FunctionMaterialize
>
();
factory
.
registerFunction
<
FunctionIgnore
>
();
factory
.
registerFunction
<
FunctionArrayJoin
>
();
factory
.
registerFunction
<
FunctionReplicate
>
();
factory
.
registerFunction
<
FunctionBar
>
();
factory
.
registerFunction
<
FunctionTuple
>
();
...
...
dbms/tests/queries/0_stateless/00178_function_replicate.reference
0 → 100644
浏览文件 @
001ffdfa
0 [] [] [] [] []
1 [0] [1] ['1'] [[0]] [['0']]
2 [0,1] [2,2] ['2','2'] [[0,1],[0,1]] [['0','1'],['0','1']]
3 [0,1,2] [3,3,3] ['3','3','3'] [[0,1,2],[0,1,2],[0,1,2]] [['0','1','2'],['0','1','2'],['0','1','2']]
4 [0,1,2,3] [4,4,4,4] ['4','4','4','4'] [[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3]] [['0','1','2','3'],['0','1','2','3'],['0','1','2','3'],['0','1','2','3']]
5 [0,1,2,3,4] [5,5,5,5,5] ['5','5','5','5','5'] [[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4]] [['0','1','2','3','4'],['0','1','2','3','4'],['0','1','2','3','4'],['0','1','2','3','4'],['0','1','2','3','4']]
6 [0,1,2,3,4,5] [6,6,6,6,6,6] ['6','6','6','6','6','6'] [[0,1,2,3,4,5],[0,1,2,3,4,5],[0,1,2,3,4,5],[0,1,2,3,4,5],[0,1,2,3,4,5],[0,1,2,3,4,5]] [['0','1','2','3','4','5'],['0','1','2','3','4','5'],['0','1','2','3','4','5'],['0','1','2','3','4','5'],['0','1','2','3','4','5'],['0','1','2','3','4','5']]
7 [0,1,2,3,4,5,6] [7,7,7,7,7,7,7] ['7','7','7','7','7','7','7'] [[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6]] [['0','1','2','3','4','5','6'],['0','1','2','3','4','5','6'],['0','1','2','3','4','5','6'],['0','1','2','3','4','5','6'],['0','1','2','3','4','5','6'],['0','1','2','3','4','5','6'],['0','1','2','3','4','5','6']]
8 [0,1,2,3,4,5,6,7] [8,8,8,8,8,8,8,8] ['8','8','8','8','8','8','8','8'] [[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7],[0,1,2,3,4,5,6,7]] [['0','1','2','3','4','5','6','7'],['0','1','2','3','4','5','6','7'],['0','1','2','3','4','5','6','7'],['0','1','2','3','4','5','6','7'],['0','1','2','3','4','5','6','7'],['0','1','2','3','4','5','6','7'],['0','1','2','3','4','5','6','7'],['0','1','2','3','4','5','6','7']]
9 [0,1,2,3,4,5,6,7,8] [9,9,9,9,9,9,9,9,9] ['9','9','9','9','9','9','9','9','9'] [[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8],[0,1,2,3,4,5,6,7,8]] [['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8'],['0','1','2','3','4','5','6','7','8']]
dbms/tests/queries/0_stateless/00178_function_replicate.sql
0 → 100644
浏览文件 @
001ffdfa
SELECT
number
,
range
(
number
)
AS
arr
,
replicate
(
number
,
arr
),
replicate
(
toString
(
number
),
arr
),
replicate
(
range
(
number
),
arr
),
replicate
(
arrayMap
(
x
->
toString
(
x
),
range
(
number
)),
arr
)
FROM
system
.
numbers
LIMIT
10
;
dbms/tests/queries/0_stateless/00179_lambdas_with_common_expressions_and_filter.reference
0 → 100644
浏览文件 @
001ffdfa
[0]
[0,1,2]
[0,1,2,3,4]
[0,1,2,3,4,5,6]
[0,1,2,3,4,5,6,7,8]
dbms/tests/queries/0_stateless/00179_lambdas_with_common_expressions_and_filter.sql
0 → 100644
浏览文件 @
001ffdfa
SELECT
arrayMap
(
x
->
number
!=
-
1
?
x
:
0
,
arr
)
FROM
(
SELECT
number
,
range
(
number
)
AS
arr
FROM
system
.
numbers
LIMIT
10
)
WHERE
number
%
2
=
1
AND
arrayExists
(
x
->
number
!=
-
1
,
arr
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录