Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
40995442
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,发现更多精彩内容 >>
提交
40995442
编写于
1月 23, 2016
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dbms: using numeric constants while evaluating PKCondition [#METR-19758].
上级
e720a53c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
41 addition
and
9 deletion
+41
-9
dbms/include/DB/Storages/MergeTree/PKCondition.h
dbms/include/DB/Storages/MergeTree/PKCondition.h
+4
-1
dbms/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp
dbms/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp
+3
-3
dbms/src/Storages/MergeTree/PKCondition.cpp
dbms/src/Storages/MergeTree/PKCondition.cpp
+34
-5
未找到文件。
dbms/include/DB/Storages/MergeTree/PKCondition.h
浏览文件 @
40995442
...
...
@@ -201,7 +201,7 @@ public:
bool
mayBeTrueAfter
(
const
Field
*
left_pk
,
const
DataTypes
&
data_types
)
const
;
/// Проверяет, что индекс не может быть использован.
bool
alwaysUnknown
()
const
;
bool
alwaysUnknown
OrTrue
()
const
;
/// Наложить дополнительное условие: значение в столбце column должно быть в диапазоне range.
/// Возвращает, есть ли такой столбец в первичном ключе.
...
...
@@ -230,6 +230,9 @@ private:
FUNCTION_NOT
,
FUNCTION_AND
,
FUNCTION_OR
,
/// Константы
ALWAYS_FALSE
,
ALWAYS_TRUE
,
};
RPNElement
()
{}
...
...
dbms/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp
浏览文件 @
40995442
...
...
@@ -141,10 +141,10 @@ BlockInputStreams MergeTreeDataSelectExecutor::read(
PKCondition
key_condition
(
query
,
context
,
data
.
getColumnsList
(),
data
.
getSortDescription
());
PKCondition
date_condition
(
query
,
context
,
data
.
getColumnsList
(),
SortDescription
(
1
,
SortColumnDescription
(
data
.
date_column_name
,
1
)));
if
(
settings
.
force_primary_key
&&
key_condition
.
alwaysUnknown
())
if
(
settings
.
force_primary_key
&&
key_condition
.
alwaysUnknown
OrTrue
())
throw
Exception
(
"Primary key is not used and setting 'force_primary_key' is set."
,
ErrorCodes
::
INDEX_NOT_USED
);
if
(
settings
.
force_index_by_date
&&
date_condition
.
alwaysUnknown
())
if
(
settings
.
force_index_by_date
&&
date_condition
.
alwaysUnknown
OrTrue
())
throw
Exception
(
"Index by date is not used and setting 'force_index_by_date' is set."
,
ErrorCodes
::
INDEX_NOT_USED
);
/// Выберем куски, в которых могут быть данные, удовлетворяющие date_condition, и которые подходят под условие на _part,
...
...
@@ -811,7 +811,7 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange(
size_t
marks_count
=
index
.
size
()
/
key_size
;
/// Если индекс не используется.
if
(
key_condition
.
alwaysUnknown
())
if
(
key_condition
.
alwaysUnknown
OrTrue
())
{
res
.
push_back
(
MarkRange
(
0
,
marks_count
));
}
...
...
dbms/src/Storages/MergeTree/PKCondition.cpp
浏览文件 @
40995442
...
...
@@ -265,8 +265,10 @@ bool PKCondition::isPrimaryKeyPossiblyWrappedByMonotonicFunctionsImpl(
bool
PKCondition
::
atomFromAST
(
ASTPtr
&
node
,
const
Context
&
context
,
Block
&
block_with_constants
,
RPNElement
&
out
)
{
/** Функции < > = != <= >= in notIn, у которых один агрумент константа, другой - один из столбцов первичного ключа,
* либо он же, завёрнутый в цепочку возможно-монотонных функций.
* либо он же, завёрнутый в цепочку возможно-монотонных функций,
* либо константное выражение - число.
*/
Field
value
;
if
(
const
ASTFunction
*
func
=
typeid_cast
<
const
ASTFunction
*>
(
&*
node
))
{
const
ASTs
&
args
=
typeid_cast
<
const
ASTExpressionList
&>
(
*
func
->
arguments
).
children
;
...
...
@@ -277,7 +279,6 @@ bool PKCondition::atomFromAST(ASTPtr & node, const Context & context, Block & bl
/// Если true, слева константа.
bool
inverted
;
size_t
column
;
Field
value
;
RPNElement
::
MonotonicFunctionsChain
chain
;
if
(
getConstant
(
args
[
1
],
block_with_constants
,
value
)
&&
isPrimaryKeyPossiblyWrappedByMonotonicFunctions
(
args
[
0
],
context
,
column
,
chain
))
...
...
@@ -326,6 +327,20 @@ bool PKCondition::atomFromAST(ASTPtr & node, const Context & context, Block & bl
return
true
;
}
else
if
(
getConstant
(
node
,
block_with_constants
,
value
))
/// Для случаев, когда написано, например, WHERE 0 AND something
{
if
(
value
.
getType
()
==
Field
::
Types
::
UInt64
||
value
.
getType
()
==
Field
::
Types
::
Int64
||
value
.
getType
()
==
Field
::
Types
::
Float64
)
{
/// Ноль во всех типах представлен в памяти так же, как в UInt64.
out
.
function
=
value
.
get
<
UInt64
>
()
?
RPNElement
::
ALWAYS_TRUE
:
RPNElement
::
ALWAYS_FALSE
;
return
true
;
}
}
return
false
;
}
...
...
@@ -525,6 +540,14 @@ bool PKCondition::mayBeTrueInRange(const Field * left_pk, const Field * right_pk
auto
arg2
=
rpn_stack
.
back
();
rpn_stack
.
back
()
=
arg1
|
arg2
;
}
else
if
(
element
.
function
==
RPNElement
::
ALWAYS_FALSE
)
{
rpn_stack
.
emplace_back
(
false
,
true
);
}
else
if
(
element
.
function
==
RPNElement
::
ALWAYS_TRUE
)
{
rpn_stack
.
emplace_back
(
true
,
false
);
}
else
throw
Exception
(
"Unexpected function type in PKCondition::RPNElement"
,
ErrorCodes
::
LOGICAL_ERROR
);
}
...
...
@@ -595,13 +618,17 @@ String PKCondition::RPNElement::toString() const
ss
<<
")"
;
return
ss
.
str
();
}
case
ALWAYS_FALSE
:
return
"false"
;
case
ALWAYS_TRUE
:
return
"true"
;
default:
throw
Exception
(
"Unknown function in RPNElement"
,
ErrorCodes
::
LOGICAL_ERROR
);
}
}
bool
PKCondition
::
alwaysUnknown
()
const
bool
PKCondition
::
alwaysUnknown
OrTrue
()
const
{
std
::
vector
<
UInt8
>
rpn_stack
;
...
...
@@ -609,14 +636,16 @@ bool PKCondition::alwaysUnknown() const
{
const
auto
&
element
=
rpn
[
i
];
if
(
element
.
function
==
RPNElement
::
FUNCTION_UNKNOWN
)
if
(
element
.
function
==
RPNElement
::
FUNCTION_UNKNOWN
||
element
.
function
==
RPNElement
::
ALWAYS_TRUE
)
{
rpn_stack
.
push_back
(
true
);
}
else
if
(
element
.
function
==
RPNElement
::
FUNCTION_NOT_IN_RANGE
||
element
.
function
==
RPNElement
::
FUNCTION_IN_RANGE
||
element
.
function
==
RPNElement
::
FUNCTION_IN_SET
||
element
.
function
==
RPNElement
::
FUNCTION_NOT_IN_SET
)
||
element
.
function
==
RPNElement
::
FUNCTION_NOT_IN_SET
||
element
.
function
==
RPNElement
::
ALWAYS_FALSE
)
{
rpn_stack
.
push_back
(
false
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录