Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
d1c43678
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,发现更多精彩内容 >>
未验证
提交
d1c43678
编写于
4月 13, 2020
作者:
A
alexey-milovidov
提交者:
GitHub
4月 13, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10206 from ClickHouse/fix-limit-with-infinite-sources
Fix limit with infinite sources
上级
6de28bd5
9a9bedc8
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
42 addition
and
2 deletion
+42
-2
src/Processors/Executors/PipelineExecutor.cpp
src/Processors/Executors/PipelineExecutor.cpp
+2
-0
src/Processors/Executors/TreeExecutorBlockInputStream.cpp
src/Processors/Executors/TreeExecutorBlockInputStream.cpp
+12
-2
src/Processors/Executors/TreeExecutorBlockInputStream.h
src/Processors/Executors/TreeExecutorBlockInputStream.h
+2
-0
src/Processors/IProcessor.h
src/Processors/IProcessor.h
+4
-0
src/Processors/Sources/SourceFromInputStream.cpp
src/Processors/Sources/SourceFromInputStream.cpp
+3
-0
src/Processors/Sources/SourceFromInputStream.h
src/Processors/Sources/SourceFromInputStream.h
+7
-0
tests/queries/0_stateless/01245_limit_infinite_sources.reference
...ueries/0_stateless/01245_limit_infinite_sources.reference
+1
-0
tests/queries/0_stateless/01245_limit_infinite_sources.sql
tests/queries/0_stateless/01245_limit_infinite_sources.sql
+11
-0
未找到文件。
src/Processors/Executors/PipelineExecutor.cpp
浏览文件 @
d1c43678
...
...
@@ -263,6 +263,8 @@ bool PipelineExecutor::tryAddProcessorToStackIfUpdated(Edge & edge, Queue & queu
node
.
status
=
ExecStatus
::
Preparing
;
return
prepareProcessor
(
edge
.
to
,
thread_number
,
queue
,
std
::
move
(
lock
));
}
else
graph
[
edge
.
to
].
processor
->
onUpdatePorts
();
return
true
;
}
...
...
src/Processors/Executors/TreeExecutorBlockInputStream.cpp
浏览文件 @
d1c43678
...
...
@@ -164,7 +164,7 @@ void TreeExecutorBlockInputStream::execute(bool on_totals, bool on_extremes)
}
};
while
(
!
stack
.
empty
())
while
(
!
stack
.
empty
()
&&
!
is_cancelled
)
{
IProcessor
*
node
=
stack
.
top
();
...
...
@@ -295,7 +295,7 @@ void TreeExecutorBlockInputStream::initRowsBeforeLimit()
Block
TreeExecutorBlockInputStream
::
readImpl
()
{
while
(
true
)
while
(
!
is_cancelled
)
{
if
(
input_port
->
isFinished
())
{
...
...
@@ -338,6 +338,8 @@ Block TreeExecutorBlockInputStream::readImpl()
execute
(
false
,
false
);
}
return
{};
}
void
TreeExecutorBlockInputStream
::
setProgressCallback
(
const
ProgressCallback
&
callback
)
...
...
@@ -373,4 +375,12 @@ void TreeExecutorBlockInputStream::addTotalRowsApprox(size_t value)
sources_with_progress
.
front
()
->
addTotalRowsApprox
(
value
);
}
void
TreeExecutorBlockInputStream
::
cancel
(
bool
kill
)
{
IBlockInputStream
::
cancel
(
kill
);
for
(
auto
&
processor
:
processors
)
processor
->
cancel
();
}
}
src/Processors/Executors/TreeExecutorBlockInputStream.h
浏览文件 @
d1c43678
...
...
@@ -39,6 +39,8 @@ public:
String
getName
()
const
override
{
return
"TreeExecutor"
;
}
Block
getHeader
()
const
override
{
return
root
->
getOutputs
().
front
().
getHeader
();
}
void
cancel
(
bool
kill
)
override
;
/// This methods does not affect TreeExecutor as IBlockInputStream itself.
/// They just passed to all SourceWithProgress processors.
void
setProgressCallback
(
const
ProgressCallback
&
callback
)
final
;
...
...
src/Processors/IProcessor.h
浏览文件 @
d1c43678
...
...
@@ -233,6 +233,10 @@ public:
onCancel
();
}
/// Additional method which is called in case if ports were updated while work() method.
/// May be used to stop execution in rare cases.
virtual
void
onUpdatePorts
()
{}
virtual
~
IProcessor
()
=
default
;
auto
&
getInputs
()
{
return
inputs
;
}
...
...
src/Processors/Sources/SourceFromInputStream.cpp
浏览文件 @
d1c43678
...
...
@@ -176,6 +176,9 @@ Chunk SourceFromInputStream::generate()
return
{};
}
if
(
isCancelled
())
return
{};
#ifndef NDEBUG
assertBlocksHaveEqualStructure
(
getPort
().
getHeader
(),
block
,
"SourceFromInputStream"
);
#endif
...
...
src/Processors/Sources/SourceFromInputStream.h
浏览文件 @
d1c43678
...
...
@@ -37,6 +37,13 @@ public:
void
setProgressCallback
(
const
ProgressCallback
&
callback
)
final
{
stream
->
setProgressCallback
(
callback
);
}
void
addTotalRowsApprox
(
size_t
value
)
final
{
stream
->
addTotalRowsApprox
(
value
);
}
/// Stop reading from stream if output port is finished.
void
onUpdatePorts
()
override
{
if
(
getPort
().
isFinished
())
cancel
();
}
protected:
void
onCancel
()
override
{
stream
->
cancel
(
false
);
}
...
...
tests/queries/0_stateless/01245_limit_infinite_sources.reference
0 → 100644
浏览文件 @
d1c43678
1
tests/queries/0_stateless/01245_limit_infinite_sources.sql
0 → 100644
浏览文件 @
d1c43678
SELECT
number
FROM
(
SELECT
zero
AS
number
FROM
remote
(
'127.0.0.2'
,
system
.
zeros
)
UNION
ALL
SELECT
number
+
sleep
(
0
.
5
)
FROM
system
.
numbers
)
WHERE
number
=
1
LIMIT
1
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录