Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
443c64ab
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,发现更多精彩内容 >>
未验证
提交
443c64ab
编写于
5月 04, 2020
作者:
A
alexey-milovidov
提交者:
GitHub
5月 04, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10638 from ClickHouse/fix-ubsan-hashtable
Fix UBSan report in HashTable
上级
884c2aa6
80d5db2b
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
60 addition
and
18 deletion
+60
-18
contrib/zstd-cmake/CMakeLists.txt
contrib/zstd-cmake/CMakeLists.txt
+1
-0
src/AggregateFunctions/AggregateFunctionGroupUniqArray.h
src/AggregateFunctions/AggregateFunctionGroupUniqArray.h
+5
-5
src/Columns/ColumnArray.cpp
src/Columns/ColumnArray.cpp
+9
-5
src/Common/HashTable/FixedHashTable.h
src/Common/HashTable/FixedHashTable.h
+23
-3
src/Common/HashTable/HashTable.h
src/Common/HashTable/HashTable.h
+21
-3
src/Common/HashTable/HashTableKeyHolder.h
src/Common/HashTable/HashTableKeyHolder.h
+1
-2
未找到文件。
contrib/zstd-cmake/CMakeLists.txt
浏览文件 @
443c64ab
...
...
@@ -128,3 +128,4 @@ ENDIF (ZSTD_LEGACY_SUPPORT)
ADD_LIBRARY
(
zstd
${
Sources
}
${
Headers
}
)
target_include_directories
(
zstd PUBLIC
${
LIBRARY_DIR
}
)
target_compile_options
(
zstd PRIVATE -fno-sanitize=undefined
)
src/AggregateFunctions/AggregateFunctionGroupUniqArray.h
浏览文件 @
443c64ab
#pragma once
#include <cassert>
#include <IO/WriteHelpers.h>
#include <IO/ReadHelpers.h>
...
...
@@ -139,7 +141,8 @@ static void deserializeAndInsertImpl(StringRef str, IColumn & data_to);
*/
template
<
bool
is_plain_column
=
false
,
typename
Tlimit_num_elem
=
std
::
false_type
>
class
AggregateFunctionGroupUniqArrayGeneric
:
public
IAggregateFunctionDataHelper
<
AggregateFunctionGroupUniqArrayGenericData
,
AggregateFunctionGroupUniqArrayGeneric
<
is_plain_column
,
Tlimit_num_elem
>>
:
public
IAggregateFunctionDataHelper
<
AggregateFunctionGroupUniqArrayGenericData
,
AggregateFunctionGroupUniqArrayGeneric
<
is_plain_column
,
Tlimit_num_elem
>>
{
DataTypePtr
&
input_data_type
;
...
...
@@ -158,6 +161,7 @@ class AggregateFunctionGroupUniqArrayGeneric
{
const
char
*
begin
=
nullptr
;
StringRef
serialized
=
column
.
serializeValueIntoArena
(
row_num
,
arena
,
begin
);
assert
(
serialized
.
data
!=
nullptr
);
return
SerializedKeyHolder
{
serialized
,
arena
};
}
}
...
...
@@ -204,9 +208,7 @@ public:
//TODO: set.reserve(size);
for
(
size_t
i
=
0
;
i
<
size
;
++
i
)
{
set
.
insert
(
readStringBinaryInto
(
*
arena
,
buf
));
}
}
void
add
(
AggregateDataPtr
place
,
const
IColumn
**
columns
,
size_t
row_num
,
Arena
*
arena
)
const
override
...
...
@@ -249,9 +251,7 @@ public:
offsets_to
.
push_back
(
offsets_to
.
back
()
+
set
.
size
());
for
(
auto
&
elem
:
set
)
{
deserializeAndInsert
(
elem
.
getValue
(),
data_to
);
}
}
};
...
...
src/Columns/ColumnArray.cpp
浏览文件 @
443c64ab
...
...
@@ -159,13 +159,17 @@ void ColumnArray::insertData(const char * pos, size_t length)
size_t
field_size
=
data
->
sizeOfValueIfFixed
();
const
char
*
end
=
pos
+
length
;
size_t
elems
=
0
;
for
(;
pos
+
field_size
<=
end
;
pos
+=
field_size
,
++
elems
)
data
->
insertData
(
pos
,
field_size
);
if
(
pos
!=
end
)
throw
Exception
(
"Incorrect length argument for method ColumnArray::insertData"
,
ErrorCodes
::
BAD_ARGUMENTS
);
if
(
length
)
{
const
char
*
end
=
pos
+
length
;
for
(;
pos
+
field_size
<=
end
;
pos
+=
field_size
,
++
elems
)
data
->
insertData
(
pos
,
field_size
);
if
(
pos
!=
end
)
throw
Exception
(
"Incorrect length argument for method ColumnArray::insertData"
,
ErrorCodes
::
BAD_ARGUMENTS
);
}
getOffsets
().
push_back
(
getOffsets
().
back
()
+
elems
);
}
...
...
src/Common/HashTable/FixedHashTable.h
浏览文件 @
443c64ab
...
...
@@ -274,9 +274,21 @@ public:
return
iterator
(
this
,
ptr
);
}
const_iterator
end
()
const
{
return
const_iterator
(
this
,
buf
+
NUM_CELLS
);
}
const_iterator
cend
()
const
{
return
end
();
}
iterator
end
()
{
return
iterator
(
this
,
buf
+
NUM_CELLS
);
}
const_iterator
end
()
const
{
/// Avoid UBSan warning about adding zero to nullptr. It is valid in C++20 (and earlier) but not valid in C.
return
const_iterator
(
this
,
buf
?
buf
+
NUM_CELLS
:
buf
);
}
const_iterator
cend
()
const
{
return
end
();
}
iterator
end
()
{
return
iterator
(
this
,
buf
?
buf
+
NUM_CELLS
:
buf
);
}
public:
...
...
@@ -325,12 +337,17 @@ public:
Cell
::
State
::
write
(
wb
);
DB
::
writeVarUInt
(
m_size
,
wb
);
if
(
!
buf
)
return
;
for
(
auto
ptr
=
buf
,
buf_end
=
buf
+
NUM_CELLS
;
ptr
<
buf_end
;
++
ptr
)
{
if
(
!
ptr
->
isZero
(
*
this
))
{
DB
::
writeVarUInt
(
ptr
-
buf
);
ptr
->
write
(
wb
);
}
}
}
void
writeText
(
DB
::
WriteBuffer
&
wb
)
const
...
...
@@ -338,6 +355,9 @@ public:
Cell
::
State
::
writeText
(
wb
);
DB
::
writeText
(
m_size
,
wb
);
if
(
!
buf
)
return
;
for
(
auto
ptr
=
buf
,
buf_end
=
buf
+
NUM_CELLS
;
ptr
<
buf_end
;
++
ptr
)
{
if
(
!
ptr
->
isZero
(
*
this
))
...
...
src/Common/HashTable/HashTable.h
浏览文件 @
443c64ab
...
...
@@ -710,9 +710,21 @@ public:
return
iterator
(
this
,
ptr
);
}
const_iterator
end
()
const
{
return
const_iterator
(
this
,
buf
+
grower
.
bufSize
());
}
const_iterator
cend
()
const
{
return
end
();
}
iterator
end
()
{
return
iterator
(
this
,
buf
+
grower
.
bufSize
());
}
const_iterator
end
()
const
{
/// Avoid UBSan warning about adding zero to nullptr. It is valid in C++20 (and earlier) but not valid in C.
return
const_iterator
(
this
,
buf
?
buf
+
grower
.
bufSize
()
:
buf
);
}
const_iterator
cend
()
const
{
return
end
();
}
iterator
end
()
{
return
iterator
(
this
,
buf
?
buf
+
grower
.
bufSize
()
:
buf
);
}
protected:
...
...
@@ -935,6 +947,9 @@ public:
if
(
this
->
hasZero
())
this
->
zeroValue
()
->
write
(
wb
);
if
(
!
buf
)
return
;
for
(
auto
ptr
=
buf
,
buf_end
=
buf
+
grower
.
bufSize
();
ptr
<
buf_end
;
++
ptr
)
if
(
!
ptr
->
isZero
(
*
this
))
ptr
->
write
(
wb
);
...
...
@@ -951,6 +966,9 @@ public:
this
->
zeroValue
()
->
writeText
(
wb
);
}
if
(
!
buf
)
return
;
for
(
auto
ptr
=
buf
,
buf_end
=
buf
+
grower
.
bufSize
();
ptr
<
buf_end
;
++
ptr
)
{
if
(
!
ptr
->
isZero
(
*
this
))
...
...
src/Common/HashTable/HashTableKeyHolder.h
浏览文件 @
443c64ab
...
...
@@ -98,8 +98,7 @@ inline void ALWAYS_INLINE keyHolderDiscardKey(DB::ArenaKeyHolder &)
namespace
DB
{
/**
* SerializedKeyHolder is a key holder for a StringRef key that is already
/** SerializedKeyHolder is a key holder for a StringRef key that is already
* serialized to an Arena. The key must be the last allocation in this Arena,
* and is discarded by rolling back the allocation.
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录