Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
db47ef92
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,发现更多精彩内容 >>
提交
db47ef92
编写于
2月 05, 2020
作者:
C
CurtizJ
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix prewhere
上级
3c1735d9
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
26 addition
and
8 deletion
+26
-8
dbms/src/Interpreters/InterpreterSelectQuery.cpp
dbms/src/Interpreters/InterpreterSelectQuery.cpp
+10
-5
dbms/src/Interpreters/InterpreterSelectQuery.h
dbms/src/Interpreters/InterpreterSelectQuery.h
+1
-1
dbms/src/Storages/MergeTree/MergeTreeRangeReader.cpp
dbms/src/Storages/MergeTree/MergeTreeRangeReader.cpp
+4
-2
dbms/tests/queries/0_stateless/01076_range_reader_segfault.reference
...queries/0_stateless/01076_range_reader_segfault.reference
+2
-0
dbms/tests/queries/0_stateless/01076_range_reader_segfault.sql
...tests/queries/0_stateless/01076_range_reader_segfault.sql
+9
-0
未找到文件。
dbms/src/Interpreters/InterpreterSelectQuery.cpp
浏览文件 @
db47ef92
...
@@ -324,7 +324,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
...
@@ -324,7 +324,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
table_id
=
storage
->
getStorageID
();
table_id
=
storage
->
getStorageID
();
}
}
auto
analyze
=
[
&
]
()
auto
analyze
=
[
&
]
(
bool
try_move_to_prewhere
=
true
)
{
{
syntax_analyzer_result
=
SyntaxAnalyzer
(
*
context
,
options
).
analyze
(
syntax_analyzer_result
=
SyntaxAnalyzer
(
*
context
,
options
).
analyze
(
query_ptr
,
source_header
.
getNamesAndTypesList
(),
required_result_column_names
,
storage
,
NamesAndTypesList
());
query_ptr
,
source_header
.
getNamesAndTypesList
(),
required_result_column_names
,
storage
,
NamesAndTypesList
());
...
@@ -397,7 +397,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
...
@@ -397,7 +397,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
throw
Exception
(
"PREWHERE is not supported if the table is filtered by row-level security expression"
,
ErrorCodes
::
ILLEGAL_PREWHERE
);
throw
Exception
(
"PREWHERE is not supported if the table is filtered by row-level security expression"
,
ErrorCodes
::
ILLEGAL_PREWHERE
);
/// Calculate structure of the result.
/// Calculate structure of the result.
result_header
=
getSampleBlockImpl
();
result_header
=
getSampleBlockImpl
(
try_move_to_prewhere
);
};
};
analyze
();
analyze
();
...
@@ -425,8 +425,13 @@ InterpreterSelectQuery::InterpreterSelectQuery(
...
@@ -425,8 +425,13 @@ InterpreterSelectQuery::InterpreterSelectQuery(
query
.
setExpression
(
ASTSelectQuery
::
Expression
::
WHERE
,
makeASTFunction
(
"and"
,
query
.
prewhere
()
->
clone
(),
query
.
where
()
->
clone
()));
query
.
setExpression
(
ASTSelectQuery
::
Expression
::
WHERE
,
makeASTFunction
(
"and"
,
query
.
prewhere
()
->
clone
(),
query
.
where
()
->
clone
()));
need_analyze_again
=
true
;
need_analyze_again
=
true
;
}
}
if
(
need_analyze_again
)
if
(
need_analyze_again
)
analyze
();
{
/// Do not try move conditions to PREWHERE for the second time.
/// Otherwise, we won't be able to fallback from inefficient PREWHERE to WHERE later.
analyze
(
/* try_move_to_prewhere = */
false
);
}
/// If there is no WHERE, filter blocks as usual
/// If there is no WHERE, filter blocks as usual
if
(
query
.
prewhere
()
&&
!
query
.
where
())
if
(
query
.
prewhere
()
&&
!
query
.
where
())
...
@@ -509,7 +514,7 @@ QueryPipeline InterpreterSelectQuery::executeWithProcessors()
...
@@ -509,7 +514,7 @@ QueryPipeline InterpreterSelectQuery::executeWithProcessors()
}
}
Block
InterpreterSelectQuery
::
getSampleBlockImpl
()
Block
InterpreterSelectQuery
::
getSampleBlockImpl
(
bool
try_move_to_prewhere
)
{
{
auto
&
query
=
getSelectQuery
();
auto
&
query
=
getSelectQuery
();
const
Settings
&
settings
=
context
->
getSettingsRef
();
const
Settings
&
settings
=
context
->
getSettingsRef
();
...
@@ -533,7 +538,7 @@ Block InterpreterSelectQuery::getSampleBlockImpl()
...
@@ -533,7 +538,7 @@ Block InterpreterSelectQuery::getSampleBlockImpl()
current_info
.
sets
=
query_analyzer
->
getPreparedSets
();
current_info
.
sets
=
query_analyzer
->
getPreparedSets
();
/// Try transferring some condition from WHERE to PREWHERE if enabled and viable
/// Try transferring some condition from WHERE to PREWHERE if enabled and viable
if
(
settings
.
optimize_move_to_prewhere
&&
query
.
where
()
&&
!
query
.
prewhere
()
&&
!
query
.
final
())
if
(
settings
.
optimize_move_to_prewhere
&&
try_move_to_prewhere
&&
query
.
where
()
&&
!
query
.
prewhere
()
&&
!
query
.
final
())
MergeTreeWhereOptimizer
{
current_info
,
*
context
,
merge_tree
,
MergeTreeWhereOptimizer
{
current_info
,
*
context
,
merge_tree
,
syntax_analyzer_result
->
requiredSourceColumns
(),
log
};
syntax_analyzer_result
->
requiredSourceColumns
(),
log
};
};
};
...
...
dbms/src/Interpreters/InterpreterSelectQuery.h
浏览文件 @
db47ef92
...
@@ -104,7 +104,7 @@ private:
...
@@ -104,7 +104,7 @@ private:
ASTSelectQuery
&
getSelectQuery
()
{
return
query_ptr
->
as
<
ASTSelectQuery
&>
();
}
ASTSelectQuery
&
getSelectQuery
()
{
return
query_ptr
->
as
<
ASTSelectQuery
&>
();
}
Block
getSampleBlockImpl
();
Block
getSampleBlockImpl
(
bool
try_move_to_prewhere
);
struct
Pipeline
struct
Pipeline
{
{
...
...
dbms/src/Storages/MergeTree/MergeTreeRangeReader.cpp
浏览文件 @
db47ef92
...
@@ -431,9 +431,11 @@ void MergeTreeRangeReader::ReadResult::setFilter(const ColumnPtr & new_filter)
...
@@ -431,9 +431,11 @@ void MergeTreeRangeReader::ReadResult::setFilter(const ColumnPtr & new_filter)
}
}
ConstantFilterDescription
const_description
(
*
new_filter
);
ConstantFilterDescription
const_description
(
*
new_filter
);
if
(
const_description
.
always_false
)
if
(
const_description
.
always_true
)
setFilterConstTrue
();
else
if
(
const_description
.
always_false
)
clear
();
clear
();
else
if
(
!
const_description
.
always_true
)
else
{
{
FilterDescription
filter_description
(
*
new_filter
);
FilterDescription
filter_description
(
*
new_filter
);
filter_holder
=
filter_description
.
data_holder
?
filter_description
.
data_holder
:
new_filter
;
filter_holder
=
filter_description
.
data_holder
?
filter_description
.
data_holder
:
new_filter
;
...
...
dbms/tests/queries/0_stateless/01076_range_reader_segfault.reference
0 → 100644
浏览文件 @
db47ef92
99
4950
dbms/tests/queries/0_stateless/01076_range_reader_segfault.sql
0 → 100644
浏览文件 @
db47ef92
DROP
TABLE
IF
EXISTS
t
;
CREATE
TABLE
t
(
a
Int
,
b
Int
,
c
Int
)
ENGINE
=
MergeTree
ORDER
BY
tuple
();
INSERT
INTO
t
SELECT
number
,
number
*
2
,
number
*
3
FROM
numbers
(
100
);
SELECT
count
()
FROM
t
PREWHERE
NOT
ignore
(
a
)
WHERE
b
>
0
;
SELECT
sum
(
a
)
FROM
t
PREWHERE
isNotNull
(
a
)
WHERE
isNotNull
(
b
)
AND
c
>
0
;
DROP
TABLE
t
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录