Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
ad2392ee
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,发现更多精彩内容 >>
提交
ad2392ee
编写于
2月 13, 2015
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dbms: fixed error with StorageBuffer [#METR-15105].
上级
b5105ecd
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
181 addition
and
21 deletion
+181
-21
dbms/include/DB/Columns/IColumn.h
dbms/include/DB/Columns/IColumn.h
+3
-0
dbms/include/DB/Core/Block.h
dbms/include/DB/Core/Block.h
+3
-0
dbms/src/Core/Block.cpp
dbms/src/Core/Block.cpp
+12
-0
dbms/src/Storages/StorageBuffer.cpp
dbms/src/Storages/StorageBuffer.cpp
+10
-8
dbms/src/Storages/StorageSet.cpp
dbms/src/Storages/StorageSet.cpp
+1
-13
dbms/tests/queries/0_stateless/00126_buffer.reference
dbms/tests/queries/0_stateless/00126_buffer.reference
+90
-0
dbms/tests/queries/0_stateless/00126_buffer.sql
dbms/tests/queries/0_stateless/00126_buffer.sql
+62
-0
未找到文件。
dbms/include/DB/Columns/IColumn.h
浏览文件 @
ad2392ee
...
...
@@ -48,6 +48,9 @@ public:
*/
virtual
size_t
sizeOfField
()
const
{
throw
Exception
(
"Cannot get sizeOfField() for column "
+
getName
(),
ErrorCodes
::
CANNOT_GET_SIZE_OF_FIELD
);
}
/** Создать столбец с такими же данными. */
virtual
SharedPtr
<
IColumn
>
clone
()
const
{
return
cut
(
0
,
size
());
}
/** Создать пустой столбец такого же типа */
virtual
SharedPtr
<
IColumn
>
cloneEmpty
()
const
{
return
cloneResized
(
0
);
}
...
...
dbms/include/DB/Core/Block.h
浏览文件 @
ad2392ee
...
...
@@ -111,6 +111,9 @@ public:
/** Получить такой же блок, но пустой. */
Block
cloneEmpty
()
const
;
/** Получить блок со столбцами, переставленными в порядке их имён. */
Block
sortColumns
()
const
;
/** Заменяет столбцы смещений внутри вложенных таблиц на один общий для таблицы.
* Кидает исключение, если эти смещения вдруг оказались неодинаковы.
*/
...
...
dbms/src/Core/Block.cpp
浏览文件 @
ad2392ee
...
...
@@ -81,6 +81,7 @@ void Block::insert(const ColumnWithNameAndType & elem)
index_by_position
.
push_back
(
it
);
}
void
Block
::
insertDefault
(
const
String
&
name
,
const
DataTypePtr
&
type
)
{
insert
({
...
...
@@ -279,6 +280,17 @@ Block Block::cloneEmpty() const
}
Block
Block
::
sortColumns
()
const
{
Block
sorted_block
;
for
(
const
auto
&
name
:
index_by_name
)
sorted_block
.
insert
(
*
name
.
second
);
return
sorted_block
;
}
ColumnsWithNameAndType
Block
::
getColumns
()
const
{
return
ColumnsWithNameAndType
(
data
.
begin
(),
data
.
end
());
...
...
dbms/src/Storages/StorageBuffer.cpp
浏览文件 @
ad2392ee
...
...
@@ -71,11 +71,10 @@ protected:
if
(
!
buffer
.
data
)
return
res
;
for
(
size_t
i
=
0
,
size
=
buffer
.
data
.
columns
();
i
<
size
;
++
i
)
for
(
const
auto
&
name
:
column_names
)
{
auto
&
col
=
buffer
.
data
.
unsafeGetByPosition
(
i
);
if
(
column_names
.
count
(
col
.
name
))
res
.
insert
(
col
);
auto
&
col
=
buffer
.
data
.
getByName
(
name
);
res
.
insert
(
ColumnWithNameAndType
(
col
.
column
->
clone
(),
col
.
type
,
name
));
}
return
res
;
...
...
@@ -213,14 +212,17 @@ private:
void
insertIntoBuffer
(
const
Block
&
block
,
StorageBuffer
::
Buffer
&
buffer
,
std
::
unique_lock
<
std
::
mutex
>
&&
lock
)
{
/// Сортируем столбцы в блоке. Это нужно, чтобы было проще потом конкатенировать блоки.
Block
sorted_block
=
block
.
sortColumns
();
if
(
!
buffer
.
data
)
{
buffer
.
first_write_time
=
time
(
0
);
buffer
.
data
=
block
.
cloneEmpty
();
buffer
.
data
=
sorted_
block
.
cloneEmpty
();
}
/// Если после вставки в буфер, ограничения будут превышены, то будем сбрасывать буфер.
if
(
storage
.
checkThresholds
(
buffer
,
time
(
0
),
block
.
rowsInFirstColumn
(),
block
.
bytes
()))
if
(
storage
.
checkThresholds
(
buffer
,
time
(
0
),
sorted_block
.
rowsInFirstColumn
(),
sorted_
block
.
bytes
()))
{
/// Вытащим из буфера блок, заменим буфер на пустой. После этого можно разблокировать mutex.
Block
block_to_write
;
...
...
@@ -230,13 +232,13 @@ private:
if
(
!
storage
.
no_destination
)
{
appendBlock
(
block
,
block_to_write
);
appendBlock
(
sorted_
block
,
block_to_write
);
storage
.
writeBlockToDestination
(
block_to_write
,
storage
.
context
.
tryGetTable
(
storage
.
destination_database
,
storage
.
destination_table
));
}
}
else
appendBlock
(
block
,
buffer
.
data
);
appendBlock
(
sorted_
block
,
buffer
.
data
);
}
};
...
...
dbms/src/Storages/StorageSet.cpp
浏览文件 @
ad2392ee
...
...
@@ -23,19 +23,7 @@ SetOrJoinBlockOutputStream::SetOrJoinBlockOutputStream(StorageSetOrJoinBase & ta
void
SetOrJoinBlockOutputStream
::
write
(
const
Block
&
block
)
{
/// Сортируем столбцы в блоке. Это нужно, так как Set и Join рассчитывают на одинаковый порядок столбцов в разных блоках.
size_t
columns
=
block
.
columns
();
std
::
vector
<
std
::
string
>
names
(
columns
);
for
(
size_t
i
=
0
;
i
<
columns
;
++
i
)
names
[
i
]
=
block
.
unsafeGetByPosition
(
i
).
name
;
std
::
sort
(
names
.
begin
(),
names
.
end
());
Block
sorted_block
;
for
(
const
auto
&
name
:
names
)
sorted_block
.
insert
(
block
.
getByName
(
name
));
/// NOTE Можно чуть-чуть оптимальнее.
Block
sorted_block
=
block
.
sortColumns
();
table
.
insertBlock
(
sorted_block
);
backup_stream
.
write
(
sorted_block
);
...
...
dbms/tests/queries/0_stateless/00126_buffer.reference
0 → 100644
浏览文件 @
ad2392ee
1 2 [3]
2 [3] 1
[3] 1 2
1 [3] 2
2 1 [3]
[3] 2 1
1 2
2 [3]
[3] 1
1 [3]
2 1
[3] 2
1
2
[3]
1 2 [3]
9 8 [7]
2 [3] 1
8 [7] 9
[3] 1 2
[7] 9 8
1 [3] 2
9 [7] 8
2 1 [3]
8 9 [7]
[3] 2 1
[7] 8 9
1 2
9 8
2 [3]
8 [7]
[3] 1
[7] 9
1 [3]
9 [7]
2 1
8 9
[3] 2
[7] 8
1
9
2
8
[3]
[7]
1 2 [3]
9 8 [7]
11 [33]
2 [3] 1
8 [7] 9
[33] 11
[3] 1 2
[7] 9 8
[33] 11
1 [3] 2
9 [7] 8
11 [33]
2 1 [3]
8 9 [7]
11 [33]
[3] 2 1
[7] 8 9
[33] 11
1 2
9 8
11
2 [3]
8 [7]
[33]
[3] 1
[7] 9
[33] 11
1 [3]
9 [7]
11 [33]
2 1
8 9
11
[3] 2
[7] 8
[33]
1
9
11
2
8
[3]
[7]
[33]
dbms/tests/queries/0_stateless/00126_buffer.sql
0 → 100644
浏览文件 @
ad2392ee
DROP
TABLE
IF
EXISTS
test
.
buffer
;
DROP
TABLE
IF
EXISTS
test
.
null
;
CREATE
TABLE
test
.
null
(
a
UInt8
,
b
String
,
c
Array
(
UInt32
))
ENGINE
=
Null
;
CREATE
TABLE
test
.
buffer
(
a
UInt8
,
b
String
,
c
Array
(
UInt32
))
ENGINE
=
Buffer
(
test
,
null
,
1
,
1000
,
1000
,
1000
,
1000
,
1000000
,
1000000
);
INSERT
INTO
test
.
buffer
VALUES
(
1
,
'2'
,
[
3
]);
SELECT
a
,
b
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
c
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
a
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
c
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
a
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
b
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
INSERT
INTO
test
.
buffer
(
c
,
b
,
a
)
VALUES
([
7
],
'8'
,
9
);
SELECT
a
,
b
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
c
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
a
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
c
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
a
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
b
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
INSERT
INTO
test
.
buffer
(
a
,
c
)
VALUES
(
11
,
[
33
]);
SELECT
a
,
b
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
c
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
a
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
c
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
a
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
b
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
,
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
,
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
,
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
a
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
b
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
SELECT
c
FROM
test
.
buffer
ORDER
BY
a
,
b
,
c
;
DROP
TABLE
test
.
buffer
;
DROP
TABLE
test
.
null
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录