Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
d99c26a4
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,发现更多精彩内容 >>
提交
d99c26a4
编写于
4月 20, 2020
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix infinite loop in dictIsIn function #515
上级
a7d360b7
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
55 addition
and
4 deletion
+55
-4
src/Core/Defines.h
src/Core/Defines.h
+3
-0
src/Dictionaries/CacheDictionary.cpp
src/Dictionaries/CacheDictionary.cpp
+4
-2
src/Dictionaries/FlatDictionary.cpp
src/Dictionaries/FlatDictionary.cpp
+3
-1
src/Dictionaries/HashedDictionary.cpp
src/Dictionaries/HashedDictionary.cpp
+3
-1
tests/queries/0_stateless/01251_dict_is_in_infinite_loop.reference
...ries/0_stateless/01251_dict_is_in_infinite_loop.reference
+9
-0
tests/queries/0_stateless/01251_dict_is_in_infinite_loop.sql
tests/queries/0_stateless/01251_dict_is_in_infinite_loop.sql
+33
-0
未找到文件。
src/Core/Defines.h
浏览文件 @
d99c26a4
...
...
@@ -98,3 +98,6 @@
/// Default limit on recursion depth of recursive descend parser.
#define DBMS_DEFAULT_MAX_PARSER_DEPTH 1000
/// Max depth of hierarchical dictionary
#define DBMS_HIERARCHICAL_DICTIONARY_MAX_DEPTH 1000
src/Dictionaries/CacheDictionary.cpp
浏览文件 @
d99c26a4
...
...
@@ -10,6 +10,7 @@
#include <Common/ProfilingScopedRWLock.h>
#include <Common/randomSeed.h>
#include <Common/typeid_cast.h>
#include <Core/Defines.h>
#include <ext/range.h>
#include <ext/size.h>
#include <Common/setThreadName.h>
...
...
@@ -17,6 +18,7 @@
#include "DictionaryBlockInputStream.h"
#include "DictionaryFactory.h"
namespace
ProfileEvents
{
extern
const
Event
DictCacheKeysRequested
;
...
...
@@ -144,7 +146,7 @@ void CacheDictionary::isInImpl(const PaddedPODArray<Key> & child_ids, const Ance
PaddedPODArray
<
Key
>
children
(
out_size
,
0
);
PaddedPODArray
<
Key
>
parents
(
child_ids
.
begin
(),
child_ids
.
end
());
while
(
true
)
for
(
size_t
i
=
0
;
i
<
DBMS_HIERARCHICAL_DICTIONARY_MAX_DEPTH
;
++
i
)
{
size_t
out_idx
=
0
;
size_t
parents_idx
=
0
;
...
...
@@ -218,7 +220,7 @@ void CacheDictionary::isInConstantVector(const Key child_id, const PaddedPODArra
std
::
vector
<
Key
>
ancestors
(
1
,
child_id
);
/// Iteratively find all ancestors for child.
while
(
true
)
for
(
size_t
i
=
0
;
i
<
DBMS_HIERARCHICAL_DICTIONARY_MAX_DEPTH
;
++
i
)
{
toParent
(
child
,
parent
);
...
...
src/Dictionaries/FlatDictionary.cpp
浏览文件 @
d99c26a4
...
...
@@ -2,6 +2,8 @@
#include <IO/WriteHelpers.h>
#include "DictionaryBlockInputStream.h"
#include "DictionaryFactory.h"
#include <Core/Defines.h>
namespace
DB
{
...
...
@@ -77,7 +79,7 @@ void FlatDictionary::isInImpl(const ChildType & child_ids, const AncestorType &
auto
id
=
getAt
(
child_ids
,
row
);
const
auto
ancestor_id
=
getAt
(
ancestor_ids
,
row
);
while
(
id
<
loaded_size
&&
id
!=
null_value
&&
id
!=
ancestor_id
)
for
(
size_t
i
=
0
;
id
<
loaded_size
&&
id
!=
null_value
&&
id
!=
ancestor_id
&&
i
<
DBMS_HIERARCHICAL_DICTIONARY_MAX_DEPTH
;
++
i
)
id
=
attr
[
id
];
out
[
row
]
=
id
!=
null_value
&&
id
==
ancestor_id
;
...
...
src/Dictionaries/HashedDictionary.cpp
浏览文件 @
d99c26a4
...
...
@@ -2,6 +2,8 @@
#include <ext/size.h>
#include "DictionaryBlockInputStream.h"
#include "DictionaryFactory.h"
#include <Core/Defines.h>
namespace
{
...
...
@@ -87,7 +89,7 @@ void HashedDictionary::isInAttrImpl(const AttrType & attr, const ChildType & chi
auto
id
=
getAt
(
child_ids
,
row
);
const
auto
ancestor_id
=
getAt
(
ancestor_ids
,
row
);
while
(
id
!=
null_value
&&
id
!=
ancestor_id
)
for
(
size_t
i
=
0
;
id
!=
null_value
&&
id
!=
ancestor_id
&&
i
<
DBMS_HIERARCHICAL_DICTIONARY_MAX_DEPTH
;
++
i
)
{
auto
it
=
attr
.
find
(
id
);
if
(
it
!=
std
::
end
(
attr
))
...
...
tests/queries/0_stateless/01251_dict_is_in_infinite_loop.reference
0 → 100644
浏览文件 @
d99c26a4
1
1
1
1
1
0
0
0
0
tests/queries/0_stateless/01251_dict_is_in_infinite_loop.sql
0 → 100644
浏览文件 @
d99c26a4
DROP
TABLE
IF
EXISTS
dict_source
;
CREATE
TABLE
dict_source
(
id
UInt64
,
parent_id
UInt64
,
value
String
)
ENGINE
=
Memory
;
INSERT
INTO
dict_source
VALUES
(
1
,
0
,
'hello'
),
(
2
,
1
,
'world'
),
(
3
,
2
,
'upyachka'
),
(
11
,
22
,
'a'
),
(
22
,
11
,
'b'
);
DROP
DATABASE
IF
EXISTS
database_for_dict
;
CREATE
DATABASE
database_for_dict
Engine
=
Ordinary
;
DROP
DICTIONARY
IF
EXISTS
database_for_dict
.
dictionary_with_hierarchy
;
CREATE
DICTIONARY
database_for_dict
.
dictionary_with_hierarchy
(
id
UInt64
,
parent_id
UInt64
HIERARCHICAL
,
value
String
)
PRIMARY
KEY
id
SOURCE
(
CLICKHOUSE
(
host
'localhost'
port
9000
user
'default'
table
'dict_source'
))
LAYOUT
(
HASHED
())
LIFETIME
(
MIN
1
MAX
1
);
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
toUInt64
(
2
),
toUInt64
(
1
));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
toUInt64
(
22
),
toUInt64
(
11
));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
materialize
(
toUInt64
(
22
)),
toUInt64
(
11
));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
toUInt64
(
11
),
materialize
(
toUInt64
(
22
)));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
materialize
(
toUInt64
(
22
)),
materialize
(
toUInt64
(
11
)));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
toUInt64
(
22
),
toUInt64
(
111
));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
materialize
(
toUInt64
(
22
)),
toUInt64
(
111
));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
toUInt64
(
11
),
materialize
(
toUInt64
(
222
)));
SELECT
dictIsIn
(
'database_for_dict.dictionary_with_hierarchy'
,
materialize
(
toUInt64
(
22
)),
materialize
(
toUInt64
(
111
)));
DROP
DICTIONARY
database_for_dict
.
dictionary_with_hierarchy
;
DROP
TABLE
dict_source
;
DROP
DATABASE
database_for_dict
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录